关于SPCOMM的接收求助

dds2014 2016-03-22 01:29:57
我现在用了SPCOMM控件来接收一个装备的数据,数据是有装备一直上送的,我发现一个问题,在SPCOMM的OnReceiveData事件里收到的数据长度很长,有上千个的字节,但是我用网上的串口工具监控发现,数据是一帧一帧送过来的,只是速度比较快,这里就有一个问题了,是不是SPCOMM是把数据累积到一定的数量才触发OnReceiveData事件,那有没有办法,收到一帧就触发接收事件以便于我处理数据?因为这个数据实时性强,所以我现在这样一下子收到上千字节的数据再解析,数据显示就滞后了,请教有没有办法解决这个问题,或者请问有什么别的好用的控件可以解决我这个问题?
...全文
655 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
dds2014 2016-08-19
  • 打赏
  • 举报
回复
引用 15 楼 xiaocongzhi 的回复:
ReadIntervalTimeout这个属性可以设置小点
dds2014 2016-08-19
  • 打赏
  • 举报
回复
引用 8 楼 doloopcn 的回复:
这个情况很少遇见,想问一下的是,你是在D7还是XE中使用SPCOMM呢? 如果在XE建议你还是换CPort控件吧 一般来说,不要在OnReceiveData事件中写入太多代码,最好是把需要处理的都用过程或函数进行处理! 默认情况下,SPCOMM收到的数据也是按一个FRAME来接收的,跟串口工具上接收的数据为一致才算是正确的。
是D7
xiaocongzhi 2016-04-19
  • 打赏
  • 举报
回复
ReadIntervalTimeout这个属性可以设置小点
  • 打赏
  • 举报
回复
我TApdComPort用的多
  • 打赏
  • 举报
回复
https://sourceforge.net/projects/tpapro/?source=directory
dds2014 2016-04-18
  • 打赏
  • 举报
回复
引用 10 楼 jankercsdn 的回复:
SPCOMM这个控件没有设置触发接收事件的标志吗? cport可以设置各种各样的触发标志: 这样的运用场合,最后不用触发事件,在接收线程里用Read方法,检查接收缓冲区长度,自己控制
SPCOMM跟CPORT不太一样,没有这些触发标志可以设置
dds2014 2016-04-18
  • 打赏
  • 举报
回复
引用 8 楼 doloopcn 的回复:
这个情况很少遇见,想问一下的是,你是在D7还是XE中使用SPCOMM呢? 如果在XE建议你还是换CPort控件吧 一般来说,不要在OnReceiveData事件中写入太多代码,最好是把需要处理的都用过程或函数进行处理! 默认情况下,SPCOMM收到的数据也是按一个FRAME来接收的,跟串口工具上接收的数据为一致才算是正确的。
我在D7中用的
Mr Dang 2016-03-24
  • 打赏
  • 举报
回复
接收的数据2个字节间超过字节超时就会触发接收事件
dds2014 2016-03-24
  • 打赏
  • 举报
回复
引用 4 楼 a295281315 的回复:
还有种情况需要特别注意下,S里可能一帧还没接收完全,线程就已经在工作了
数据帧很短的,就22个字符
dds2014 2016-03-24
  • 打赏
  • 举报
回复
引用 1 楼 oushengfen 的回复:
什么意思,意思是很多字节到了后才响应事件? 你再实时,串口波特率在那里,CPU响应比串口快很多
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word); begin move(Buffer^, PChar(@RecvBuf)^, BufferLength); end; 是的,这个事件中的 BufferLength 都是上千的字节数。 波特率是9600的,应该不算慢
看那山瞧那水 2016-03-24
  • 打赏
  • 举报
回复
SPCOMM这个控件没有设置触发接收事件的标志吗?
cport可以设置各种各样的触发标志:


这样的运用场合,最后不用触发事件,在接收线程里用Read方法,检查接收缓冲区长度,自己控制
jjpweb 2016-03-24
  • 打赏
  • 举报
回复
应该是你串口数据 的开始和结束标志没设置正确吧。
doloopcn 2016-03-24
  • 打赏
  • 举报
回复
这个情况很少遇见,想问一下的是,你是在D7还是XE中使用SPCOMM呢? 如果在XE建议你还是换CPort控件吧 一般来说,不要在OnReceiveData事件中写入太多代码,最好是把需要处理的都用过程或函数进行处理! 默认情况下,SPCOMM收到的数据也是按一个FRAME来接收的,跟串口工具上接收的数据为一致才算是正确的。
Mr Dang 2016-03-22
  • 打赏
  • 举报
回复
还有种情况需要特别注意下,S里可能一帧还没接收完全,线程就已经在工作了
Mr Dang 2016-03-22
  • 打赏
  • 举报
回复
线程里的操作,一直判断全局接收字符串S是否为空,是空休眠50ms,不为空继续,根据报文结构判断起始字节在S里的位置,删掉起始字符前无效的报文,注意同步,找到数据长度字符,从而可以从S里拷贝一帧报文,同时将这帧报文从S里删除,注意同步,算校验判断是否正确,解析帧,显示数据,流程结束。注意点就是读写S要同步。
Mr Dang 2016-03-22
  • 打赏
  • 举报
回复
分2步,接收事件只接收数据存到一个全局变量字符串里,开一个线程解析字符串,解析完就删掉那截字符串,注意同步问题。
oushengfen 2016-03-22
  • 打赏
  • 举报
回复
什么意思,意思是很多字节到了后才响应事件? 你再实时,串口波特率在那里,CPU响应比串口快很多

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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