在做通讯程序的设计开发时,常常需要通过串口(COM口)来读写数据,具体的代码实现大致如下:
1. 打开串口
HANDLE h = CreateFile(_T("COM1:"), // File name
GENERIC_READ | GENERIC_WRITE, // Desire access
0, //Share mode
NULL, // Security attributes
OPEN_EXISTING, // Create disposition
0, // Flag and attributes
NULL // Template file
);
2.清空缓冲区
PurgeComm(h, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT |PURGE_TXABORT);
3. 串口设置
自定义了一个函数:
static BOOL SerialSetup(HANDLE h, DWORD BaudRate, BYTE ByteSize, BYTE Parity,BYTE StopBits)
{
DCB dcb;
if (! GetCommState(h, &dcb)) return FALSE;
switch (BaudRate)
{
case 110: dcb.BaudRate = CBR_110; break;
case 300: dcb.BaudRate = CBR_300;break;
case 600: dcb.BaudRate = CBR_600;break;
case 1200: dcb.BaudRate = CBR_1200;break;
case 2400: dcb.BaudRate = CBR_2400;break;
case 4800: dcb.BaudRate = CBR_4800;break;
case 9600: dcb.BaudRate = CBR_9600;break;
case 14400: dcb.BaudRate = CBR_14400;break;
case 19200: dcb.BaudRate = CBR_19200;break;
case 38400: dcb.BaudRate = CBR_38400;break;
case 57600: dcb.BaudRate = CBR_57600;break;
case 115200: dcb.BaudRate = CBR_115200;break;
case 128000: dcb.BaudRate = CBR_128000;break;
case 256000: dcb.BaudRate = CBR_256000;break;
default: dcb.BaudRate = CBR_115200;break;
}
dcb.ByteSize = ByteSize;
dcb.Parity = Parity;
dcb.StopBits = StopBits;
dcb.fBinary = TRUE;
dcb.fParity = TRUE;
dcb.fNull = FALSE;
dcb.fOutX = FALSE; // disable SW control flow
dcb.fRtsControl = RTS_CONTROL_DISABLE; // disable HW control flow
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fOutxCtsFlow = FALSE;
dcb.fOutxDsrFlow = FALSE;
if( !SetCommState(h, &dcb) )
return( FALSE );
if (!GetCommState(h, &dcb))
return FALSE ;
EscapeCommFunction(h, SETDTR);
return TRUE;
}
4. 设置事件
SetCommMask(h,EV_RXCHAR);
5.超时的设置
GetCommTimeouts(h, &CommTimeOuts);
CommTimeOuts.ReadIntervalTimeout = 0;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = 50;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 1000;
SetCommTimeouts(h, &CommTimeOuts);
6.读取数据
while(bRunning)
{
if(!WaitCommEvent(h, &dwCommEvent, NULL))
continue;
if((dwCommEvent&EV_RXCHAR)!=EV_RXCHAR)
continue;
bRet = ReadFile(h, (LPVOID)(ReadBuf), sizeof(ReadBuf), &BytesRead, NULL);
dwTemp = GetLastError();
if(!bRet)
continue;
if(BytesRead == 0)
continue;
。。。。。。。。。。。//处理读到得数据
}
7. 通讯结束
CloseHandle(h);
h = NULL;
bRunning = FALSE;