用的是 网上流传挺广的CSerialPort类
这里有例子下载:http://www.daxia.com/bibis/upload/serialport_demo.93.zip
CSerialPort类是异步的串口通信,以下是一些关键代码:
OVERLAPPED m_ov;
m_hComm=CreateFile(FILE_FLAG_OVERLAPPED);//设置超时
m_CommTimeouts.ReadIntervalTimeout = 1000;
m_CommTimeouts.ReadTotalTimeoutMultiplier = 1000;
m_CommTimeouts.ReadTotalTimeoutConstant = 1000;
m_CommTimeouts.WriteTotalTimeoutMultiplier = 1000;
m_CommTimeouts.WriteTotalTimeoutConstant = 1000;
SetCommTimeouts(m_hComm, &m_CommTimeouts)
//设置缓冲区大小
SetupComm(m_hComm, 2000, 2000)//启动线程接收
while(1)
{
WaitCommEvent(m_hComm, &Event, m_ov);//等待串口事件
WaitForObject(m_ov);//等待 重叠端口 事件
for(;;)
{
bResult = ClearCommError(m_hComm, &dwError, &comstat);
if (comstat.cbInQue == 0)
{
break;
}
ReadFile(buf, 1, m_ov);//读取,每次都是1个1个字节读取
}
}
当发送端一次性发送3000字节的时候,接收端触发了一次接收事件(EV_RXCHAR),for(;;)也只进入一次,然后把2000字节读出来,也就是接收了2000字节,然后就没再一次到来消息了。停在了WaitForObject(m_ov);//等待 重叠端口 事件这里。当把缓冲区大小设置为2500的时候,也是同样的情况,接收了2500,没有再继续下去。
第一次做串口通信,没经验。不知道这样描述算不算清除了。
这里有例子下载:http://www.daxia.com/bibis/upload/serialport_demo.93.zip
CSerialPort类是异步的串口通信,以下是一些关键代码:
OVERLAPPED m_ov;
m_hComm=CreateFile(FILE_FLAG_OVERLAPPED);//设置超时
m_CommTimeouts.ReadIntervalTimeout = 1000;
m_CommTimeouts.ReadTotalTimeoutMultiplier = 1000;
m_CommTimeouts.ReadTotalTimeoutConstant = 1000;
m_CommTimeouts.WriteTotalTimeoutMultiplier = 1000;
m_CommTimeouts.WriteTotalTimeoutConstant = 1000;
SetCommTimeouts(m_hComm, &m_CommTimeouts)
//设置缓冲区大小
SetupComm(m_hComm, 2000, 2000)//启动线程接收
while(1)
{
WaitCommEvent(m_hComm, &Event, m_ov);//等待串口事件
WaitForObject(m_ov);//等待 重叠端口 事件
for(;;)
{
bResult = ClearCommError(m_hComm, &dwError, &comstat);
if (comstat.cbInQue == 0)
{
break;
}
ReadFile(buf, 1, m_ov);//读取,每次都是1个1个字节读取
}
}
当发送端一次性发送3000字节的时候,接收端触发了一次接收事件(EV_RXCHAR),for(;;)也只进入一次,然后把2000字节读出来,也就是接收了2000字节,然后就没再一次到来消息了。停在了WaitForObject(m_ov);//等待 重叠端口 事件这里。当把缓冲区大小设置为2500的时候,也是同样的情况,接收了2500,没有再继续下去。
第一次做串口通信,没经验。不知道这样描述算不算清除了。
for (;;)
{
EnterCriticalSection(&port->m_csCommunicationSync); //没有这个的话可能会出现冲突
if (bRead)
{
bResult = ReadFile(port->m_hComm,&RXBuff,1,&BytesRead,&port->m_ov);
}
if (!bResult)//出错了
{
...//清除错误,然后进入下一次循环
}
LeaveCriticalSection(&port->m_csCommunicationSync);//离开
::SendMessage((port->m_pOwner)->m_hWnd, WM_COMM_RXCHAR, (WPARAM) RXBuff, (LPARAM) port->m_nPortNr);//这里我改动了下,每接收到一个字符RXBuff就发送一个中断一个字符一个字符中断的话速度会慢一点儿