如何判定串口接收数据完成?

nopart 2008-11-24 08:56:19
用的是MSCOMM控件,首先上位机向下位机发送一个读数据的命令,然后下位机向上位机返回数据,该数据有上千字符,并且以 \r\n 结尾。那么怎么判断数据已经全部接收到接收缓冲区中了呢?
虽然用一个延时可以保证数据全部被接收,但我觉得这不是保险的办法。
...全文
816 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
i_love_pc 2008-11-25
  • 打赏
  • 举报
回复
这个还要看协议的制定,可以在每个数据包的包头设置一个命令字,通过命令字来检测。
Jim@luckeeinc.com 2008-11-25
  • 打赏
  • 举报
回复
這種東西最好數據有固定的報文格式
嚴格規定什麽開頭 什麽結束
對不合法的接受到的報文格式直接忽略
比如
A000 1234 5678 0100
前4位是固定的開頭 后4位為校驗位
以後抓數據抓來之後就取中間的那一快
chouyuanming 2008-11-25
  • 打赏
  • 举报
回复
傳送端在傳送資料時, 可以記得在結尾處加上一個字符"0x13", 表示傳送終止!!

如果你能夠逐字接收字符, 那麼應該就能判斷, 例如:

if(byte[x]==0x13)
終止接收;
MAJIA1918 2008-11-25
  • 打赏
  • 举报
回复
用线程循环接受就可以了,至于结束符,由你和下位机的协议来定
springworker 2008-11-25
  • 打赏
  • 举报
回复
我曾经接触过的一个是下位机有一个接收的协议,例如aa,当上位机接收到aa时就表示接收完毕了。没有用到延时
hnzlk 2008-11-25
  • 打赏
  • 举报
回复
举个例子,我没用过mscomm
int n=mscomm1->readbuf(buf,4096);
for(int i=0;i<n;i++)
{
if(buf[i]=="\n" && buf[i-1]=="\r")
ShowMessage("接收完毕");
}
睿音 2008-11-25
  • 打赏
  • 举报
回复
既然是以\r\n结尾,那就可以直接判断\r\n就可以了。对于还没有接收完的时候,可以自己开一个队列来进行缓冲。
TripH0101 2008-11-25
  • 打赏
  • 举报
回复
接收一个就比较一次
moonfeel 2008-11-24
  • 打赏
  • 举报
回复
楼上所言即是,我只是想知道怎么判断已经接收到这个字符。以前没做过串口,所以不太明白。
TripH0101 2008-11-24
  • 打赏
  • 举报
回复
下位机发一个结束字符不就OK了,上位机接收到这个字符就知道发送结束了
nopart 2008-11-24
  • 打赏
  • 举报
回复
而且要说明的是,返回的数据长度并不是固定的,但是结尾是固定。

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧