如何清除串口的缓冲区?
我有一个程序,循环工作的.
1.将程序写到到串口(这里被别人用dll封装,只能用他们提供的接口函数来操作)
2.从串口读到一串数据,并对其进行处理,重新写回串口(这里是我写的,串口的另一边是手机)
3.跳到第一步.
我在第2步时,手机向我发了3条同样的信息,我接收的时候用异步readfile,只取第一条数据,发现正确,就不取了.buffer未清空,但的有关闭串口.
结果我在第二次循环的第1步出错了.
我想可能是串口的buffer还有原先的数据,第一步他这个接口函数发现串口buffer里的数据不是原来想要的,所以就出错了.
我是这样猜的,可是如何清除串口中的buffer呢?
[解决办法]
主要运用ReadFile()与WriteFile()API函数,若为异步通信方式,两函数中最后一个参数
为指向OVERLAPPED结构的非空指针,在读写函数返回值为FALSE的情况下,调用GetLastError()函
数,返回值为ERROR_IO_PENDING,表明I/O操作悬挂,即操作转入后台继续执行。此时,可以用
WaitForSingleObject()来等待结束信号并设置最长等待时间,举例如下:
BOOL bReadStatus;
bReadStatus = ReadFile( m_hIDComDev, buffer,
dwBytesRead, &dwBytesRead, &m_OverlappedRead );
if(!bReadStatus)
{
if(GetLastError()==ERROR_IO_PENDING)
{
WaitForSingleObject(m_OverlappedRead.hEvent,1000);
return ((int)dwBytesRead);
}
return(0);
}
return ((int)dwBytesRead);
CMSComm m_Serial//定义这个变量
然后清空用
m_Serial.SetCommPort(2); // 指定串口号
m_Serial.SetSettings( "4800,N,8,1 "); // 通信参数设置
m_Serial.SetInBufferSize(1024); // 指定接收缓冲区大小
m_Serial.SetInBufferCount(0); // 清空接收缓冲区
m_Serial.InputMode(1); // 设置数据获取方式
m_Serial.SetInputLen(0); // 设置读取方式
m_Opened=m_Serail.SetPortOpen(1); // 打开指定的串口
将其置0可以清除接收缓 冲区。
[解决办法]
如果串口是别人封装好的,就好好看看相关的开发文档,应该有相关的函数
[解决办法]
SetPortOpen
[解决办法]
用别人的东西,一定要仔细的看用户手册和函数使用方法,这点很重要,
有时你只需一次相关函数的调用就搞定了
再看看对方提供的资料
[解决办法]
既然 // 打开指定的串口 将其置0可以清除接收缓 冲区。
你为什么还要给参数1