ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
19 мая
138649 Топик полностью
Ксения (12.11.2008 17:12, просмотров: 236) ответил Hobbyt на Спасибо Ксения!!! Но я наверное не корректно задал вопрос меня интересует протокол сигналов, не знаю как точно это называеться:) Какие пины Сом порта с какими пинами МК надо соединять, В ДатаШите об МК раскладка приведена, а как его коннектить с ПК не
Стандартными средствами (через stdio.h) работать с COM-портом не получится, т.к. это аппаратный девайс, работа с которым зависит от конкретного драйвера и архитектуры компьютера. Если вы под Windows пишите, то инклюдьте winbase.h, не ошибетесь :). Однако ваш вопрос по-прежнему не корректен - откуда мне знать, каким компилятором вы пользуетесь? Под Windows, Linux или DOS пишите свою программу? Может быть он у вас не winbase.h называется, а как-то по другому. HANDLE OpenCom( char *COMname) { // открываем COM-порт с именем COMname как файл HANDLE COMhandle = CreateFile( COMname, // address of name of the file GENERIC_READ|GENERIC_WRITE, // access (read-write) mode 0, // share mode NULL, // address of security descriptor OPEN_EXISTING, // how to create FILE_FLAG_NO_BUFFERING, // file attributes NULL); // handle of file with attributes to copy // удостоверяемся, что файл открылся, иначе выходим по ошибке if( COMhandle == INVALID_HANDLE_VALUE) return INVALID_HANDLE_VALUE; // устанавливаем тайм ауты и размер внутренних буферов (30 килобайт на прием) COMMTIMEOUTS t = { MAXDWORD, 0, 0, 100, 5000 }; SetCommTimeouts( COMhandle, &t); SetupComm( COMhandle, 30000, 100); // устанавливаем скорость обмена и режим: 115000 бод, 8 бит, без контроля четности, 1 стоп бит char text[40]; sprintf( text, "%s:115000,N,8,1", COMname); // исправляем эту строку, если скорость другая GetCommState( COMhandle, &comDCB); BuildCommDCB( COMname, &comDCB); comDCB.fAbortOnError = 0; comDCB.XonLim = 0; comDCB.XoffLim = 1; comDCB.fDtrControl = DTR_CONTROL_DISABLE; // отказываемся от спец-линий comDCB.fRtsControl = RTS_CONTROL_DISABLE; comDCB.fOutxCtsFlow = false; comDCB.fOutxDsrFlow = false; if( !SetCommState( COMhandle, &comDCB)) // если ошибка установки, то закрываем порт { CloseHandle( COMhandle); COMhandle = INVALID_HANDLE_VALUE; } return COMhandle; } Пример работы с портом: main() { // заводим массив, куда принимаем данные из порта char buf[30000]; // открывем порт HANDLE h = OpenCom( "COM1"); // нужный номер порта исправить if( h == INVALID_HANDLE_VALUE) goto ошибка; // выход на ошибку, если порт не открыввется for(;;) // бесконечный цикл { DWORD bytes = 0; if( ReadFile( h, buf, sizeof(buf), &bytes, NULL) && bytes) // отсасываем данные из внутреннего буфера во внешний buf { // тут вы имеете в своем buf от начала число байт равное bytes // делаете с ними что хотите, например, разбираете на посылки и выводите на экран в виде текста // но помните, что содержимое buf каждый раз обновляется, данные поступают в его начало, а не пристраиваются к хвосту if( условие) break; // выходим из бесконечного цикла, когда надоело } } CloseHandle( h); // закрываем порт } Практически сидеть в бесконечном цикле неудобно (особенно в программе под Windows), а потому лучше организовать CALLBACK процедуру, которая будет запускаться где-то 1 раз в секунду (лучше 10 раз), чтобы отсасывать из драйвера порта данные. Помните, что 30000 килобайт внутреннего буфера внутри операционки хватит не надолго! Внутренний буфер не камера хранения, а лишь средство, позволяющее по реже читать из файла. Если вы замешкаетесь со чтением, то при НЕПРЕРЫВНОЙ передаче на скорости 115000 бод такого буфера хватит всего на 2.5 секунды! Остальное будет безвозвратно потеряно!