Стандартными средствами (через 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 секунды! Остальное будет безвозвратно потеряно!