串口通讯:接收不到完整的数据?

noall 2014-02-09 09:27:34
用mscomm串口控件,
设置接收20个字节时,触发事件,

但有事件触发,但收到的数据不足20个字节。

用BusHound监控查看,发现,是分二段数据还回。。

请问下,这种情况要怎么处理?

:会提示:
...全文
2381 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
BruceLee2020 2014-02-28
  • 打赏
  • 举报
回复
以前搞BCB的时候,用的是 API写的,后来有一天发现,其实这个是网上经典的一个串口的 简单裁剪版本! 现在用delphi, 还搞串口,用的SPComm控件,很好用,也没有出过问题!
Mr Dang 2014-02-26
  • 打赏
  • 举报
回复
设置每接受到1个字节时,触发oncomm事件。 oncomm事件中写: 1、把接到到的数据转换为字符用个全局变量字符串存起来(如0A 0B 1C 这样子存起来)。 2、通过协议的结束标志字符判断此帧有没有结束,没结束就退出。结束了,就置位一个接受完成标志位。 发送数据函数: 1、发送数据. 2、是全局变量接受字符串=‘’ 、接受完成标志位=false. 3、延时3s(如果接受完成标志位置位就退出延时) 注:此处的延时相当于超时时间。//这里很关键 4、判断全局变量接受字符串等,然后处理接收到的数据。
看那山瞧那水 2014-02-19
  • 打赏
  • 举报
回复
用CPORT控件吧,有些控件会把某些字节数据当成特殊控制字符。还有,延时长点,缓冲区大点,可能的话,降低速率试试
「已注销」 2014-02-18
  • 打赏
  • 举报
回复
你应该把触发事件的字节数改为1个,这样每个字节都能处理了,方便很多啊
IDWB 2014-02-18
  • 打赏
  • 举报
回复
串口通讯分两段很正常的现象,现在我都是自己写底层代码,串口当文件读写
wangyang4506 2014-02-13
  • 打赏
  • 举报
回复
MScomm不怎么好控制,我也用过,嫌麻烦,现在用SPCOMM,你那个提示貌似接收数据超过数组定义长度。 20个字节数据分两包返回,可能是线上有干扰,或者通讯线质量有问题,以前也遇到过,或者可以把停止位改了看看会不会好一点。
星際訪客 2014-02-13
  • 打赏
  • 举报
回复
基於掌握度...串口通訊不建議使用現成的控件...最佳的串口通訊方式為多線程+API...說來簡單實作不易...建議塿主花點時間研究一下串口 API 之特性...... 關於 Windows RS-232C 串列通訊經驗談 http://blog.csdn.net/start8588/article/details/10045287
孤独de猫 2014-02-11
  • 打赏
  • 举报
回复
我用的是cnpack的VCL控件里面带RS232串口通信的
noall 2014-02-11
  • 打赏
  • 举报
回复
程序上是没有多大的问题。连续跑几十个小时,也正常。 主要还是硬件受到干扰引起的。偶尔给你抛出个异常就烦人。 只是想要如何从软件上避免去处理。 每一条的协议肯定是有协商好的。 再试试看后二位说的。。
nydns 2014-02-10
  • 打赏
  • 举报
回复
是pc 和单片机通信吗.
mdejtod 2014-02-10
  • 打赏
  • 举报
回复
使用固定的通讯协议,先将数据存到缓冲区中,再判断缓冲区的数据是否为你需要的数据
noall 2014-02-10
  • 打赏
  • 举报
回复
MSComm.RThreshold :=self.OutLen;// RecvCount[add]; //设置接收多少字节开产生oncomm事件 MSComm.InBufferCount:=0;//清空数据 mscomm.output:=senddata; 1、每一次发送之前都有清空,并设置为接收到多少人字节时,为触发。 2、是PC和DSP的通讯 3、发送之后,都有设置延时时间。延时的时间足够发送并回收 4、缓冲区:返回的字节数,不会超过50个字节。所以缓冲区应该是足够的。
xiaoyulier 2014-02-10
  • 打赏
  • 举报
回复
缓冲区一定要清理为0
xiaoyulier 2014-02-10
  • 打赏
  • 举报
回复
是不是设置了时间限制的,在给定的时间内没有接收完全,就断开连接了。在mscomm1.rthread:=20;进行接收。
lhy 2014-02-10
  • 打赏
  • 举报
回复
可能是缓冲区太小。
babydog01 2014-02-10
  • 打赏
  • 举报
回复
楼上几位说的比较全了。 串口通讯会产生多条数据连续接收或接收不完整的情况。可以用一个全局变量来累加接收结果,再判断这个变量是否包含完整数据并做相应处理。
haitao 2014-02-09
  • 打赏
  • 举报
回复
数据到达不一定是完整的 所以最好协议里规定 首2字节是后续字节数,这样就可以一直等待读完这些字节为止
lhy 2014-02-09
  • 打赏
  • 举报
回复
是不是超时了?
noall 2014-02-09
  • 打赏
  • 举报
回复
不是超时了。 是有收到返回的,但个数明显不对。 奇怪的是。为什么第一次收到没达到个数,也会触发。 会提示: variant or safe array index out of bounds

5,930

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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