读书人

怎么清除串口的缓冲区

发布时间: 2012-02-07 17:45:36 作者: rapoo

如何清除串口的缓冲区?
我有一个程序,循环工作的.
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

读书人网 >C++

热点推荐