在向下位机写程序之前,我想把数据输入缓存区清空,如何操作?
是串口的吗?
是就用PurgeComm(hCom,PURGE_TXCLEAR); //清空发送缓冲区
PurgeComm(hCom,PURGE_RXCLEAR); //清空接收缓冲区
如何获得hCom?
我使用CSerial类,尝试这样
if(ERROR_SUCCESS==serial.Write((char*)ComCode,ComCodeLen[type])){
PurgeComm(serial.m_hFile,PURGE_RXCLEAR);
serial.Read(ReplyCode,ReplyCodeLen[type]);
}
结果还是可以收到,为何?
你是搞蓝牙的么?
留下联系方式以后多联系??
if (Write)
PurgeComm
WriteFile
我是大概是这样一个过程 希望能对你有帮助
请问各位高手,如何获得接受缓冲区的数据长度!
DWORD dwError = 0;
COMSTAT comstat;
ClearCommError(m_hComm,&dwError,&comstat);
comstat.cbInQue is the length
问题一:
我使用CSerial类,尝试这样
if(ERROR_SUCCESS==serial.Write((char*)ComCode,ComCodeLen[type])){
PurgeComm(serial.m_hFile,PURGE_RXCLEAR);
serial.Read(ReplyCode,ReplyCodeLen[type]);
}
结果还是可以收到数据,没有清空接受缓冲区为何?
问题二:
if(ERROR_SUCCESS==serial.Write((char*)ComCode,ComCodeLen[type])){
DWORD dwError = 0;
COMSTAT comstat;
ClearCommError(m_hComm,&dwError,&comstat);
int nLength=comstat.cbInQue;
serial.Read(ReplyCode,nLength);
}
每次write nLength都为零,其实不为零,不能及时正确的返回数据长度为何?
comstat.cbInQue 接收缓冲区
comstat.cbOutQue 发送缓冲区
?你想干什么,怎么刚往串口写,紧接着就读串口了,
你这是什么串口啊(NB)
楼上的,读写串口可以同时进行,全双工模式就是需要开两个线程同时读写啊
现在我不知道接受缓冲区数据的长度,但我知道数据的前13个字节中含有可以
判断数据长度的数据,我的编程思路是先读取前13个字节,得到数据的长度,然后
再write 、read一次,程序如下,
int nLength;
PurgeComm(serial.m_hFile,PURGE_RXCLEAR);
if(ERROR_SUCCESS==serial.Write((char*)ComCode,ComCodeLen[type])){
serial.Read(ReplyCode,13);
if(ReplyCode[11]=='M'&&ReplyCode[11]=='R'){
PurgeComm(serial.m_hFile,PURGE_RXCLEAR);
nLength=25;
if(ERROR_SUCCESS==serial.Write((char*)ComCode,ComCodeLen[type])){
serial.Read(ReplyCode,nLength);
......
}
}
调试结果是失败的,PurgeComm(serial.m_hFile,PURGE_RXCLEAR)好像没起作用
,第二次读取得数据会有第一次没读取得数据;请分析错在那里,该怎办才能正确
读取数据呢
你误会我的意思了, 我是说楼主刚写完数据,
根本未曾判断是否有数据收到,就进入读操作。
明显效率不高
让我等的好心急;我想可能是没法解决了,还是没人知道呢?
在VC中,在读之前,能不能先获得接受缓冲区的字节数,
然后再根据字节数去读呢?若行如何做呢?
有这个功夫用CSerial类还不如花一个小时自己写一个串口通信类。。。
想干啥就干啥。。。
if(ERROR_SUCCESS==serial.Write((char*)ComCode,ComCodeLen[type])){
serial.Read(ReplyCode,13);
if(ReplyCode[11]=='M'&&ReplyCode[11]=='R'){
PurgeComm(serial.m_hFile,PURGE_RXCLEAR);
nLength=25;
if(ERROR_SUCCESS==serial.Write((char*)ComCode,ComCodeLen[type])){
serial.Read(ReplyCode,nLength);
......
}
}
你这代码有严重的问题!!
其实我问你一句,你为什么要PurgeComm呢??
当你执行完了serial.Read(ReplyCode,13);后
你认为你收到13个字节,//这里是一个隐患(设想收到1个字节后将串口线突然拔掉了。。。)
再就是read完后就相当于将缓冲区的数据“剪切”了下来(长度为read返回的长度),
根本不用清除什么该死的接收缓冲区。。。
再就是最好将接收放在单独的的线程中进行处理,因为我们可以控制发送,但无法预料接收。。
试想你的程序刚把数据发送出去,串口线就被老鼠咬断了(或被人拔了),
你的程序就死在那儿了??!!shit!!