关于处理串口数据的问题?

蜀天下100000 2018-05-17 02:20:47
检测设备状态:50-100台,每台设备7个十六进制
COM口一次读取多台,
如有三台反回:17 00 01 02 05 02 01 00 00 03 00 05 03 02 00 00 00 00 01 06 03 00 00 00 00 06
可能多达几百字段,一次性读取,

数据要分析,更新状态,写入数据库,这种怎么处理好?要不要用多线程?
...全文
1150 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
看那山瞧那水 2018-05-22
  • 打赏
  • 举报
回复
引用 11 楼 weixin_42173539 的回复:
没有说清,串口接在终继器上的,一次从终继器过来一串数据(几十个台的数据的)
这个中继器估计就是下位控制器了,和设备的通信由这个中继器处理,中继器和上位机(电脑)的通信就是简单的232了吧。 1,接收数据的频率低(意思是每批数据的间隔比较长,并且批数据间隔比较稳定),上位软件来得及处理数据(包括接收数据,分析数据,存储数据,显示数据),那就不用线程。 2,接收数据频率高,不能及时处理接收数据,那就用线程,并做好数据缓冲。 建议用线程,这样适用性强。(不要把线程想的那么神秘,用了就会,这个论坛里有好多通信方面的处理线程,找找)
  • 打赏
  • 举报
回复
引用 10 楼 SupermanTm 的回复:
[quote=引用 9 楼 weixin_42173539 的回复:] [quote=引用 8 楼 DelphiGuy 的回复:] 485不只支持点对点通信,也支持网络拓扑结构(好像485只支持总线型拓扑结构、422支持星型环型拓扑结构,没有深入了解),可以支持数十台设备联网,最高数据传输率可以达到10Mbps级别,如果楼主说的“一个COM口接收几十个台设备数据”是这种工控应用场景的话,还是有点复杂度的。
拆解后的处理工作会很耗时,我想用Timer1定时处理,但这么程序会死,用多线程没有经验!!![/quote] RS422/485“最高数据传输率可以达到10Mbps级别”这个说法是不严谨的,RS422/485只是定义了硬件规范和逻辑,以OSI的层次只是最下面的物理层,它本身没有bps的概念,只能说总线频率。 [/quote] 485确实没有定义传输协议,只有信号级控制,协议由使用者自己设计(普遍采用的协议比如异步串行通信协议),但是说“只是最下面的物理层,它本身没有bps的概念,只能说总线频率”这个就不对了,物理层的指标决定了最高性能,实际上不止232/422/485,诸如以太网、USB、PCIe、 SATA之类的规范,其给出的传输率都是物理层指标,参考设备厂家的规格说明: 以太网物理层芯片:http://www.ti.com/interface/ethernet/phy/overview.html 485收发器:http://www.ti.com/product/thvd1450 注意它里面写的Signaling Rate (Max) (Mbps) 就是物理层的数据传输率,可以参考维基百科上的解释。
SupermanTm 2018-05-19
  • 打赏
  • 举报
回复
引用 9 楼 weixin_42173539 的回复:
[quote=引用 8 楼 DelphiGuy 的回复:] 485不只支持点对点通信,也支持网络拓扑结构(好像485只支持总线型拓扑结构、422支持星型环型拓扑结构,没有深入了解),可以支持数十台设备联网,最高数据传输率可以达到10Mbps级别,如果楼主说的“一个COM口接收几十个台设备数据”是这种工控应用场景的话,还是有点复杂度的。
拆解后的处理工作会很耗时,我想用Timer1定时处理,但这么程序会死,用多线程没有经验!!![/quote] RS422/485“最高数据传输率可以达到10Mbps级别”这个说法是不严谨的,RS422/485只是定义了硬件规范和逻辑,以OSI的层次只是最下面的物理层,它本身没有bps的概念,只能说总线频率。 楼主的问题估计不是“一个COM口接收几十个台设备数据”,应该是几十台设备的数据在一个COM口过来,至于底层的拓扑构成这里没有表述,也跟软件无关,问题应该在于“断帧”,就是如何在一个数据流里截取出属于每一个设备的数据,如果问题在这里,那么就需要明确的协议去支持了,否则是得不到断帧的条件的,这跟多不多线程无关,也跟所谓的处理工作耗时无关。
SupermanTm 2018-05-19
  • 打赏
  • 举报
回复
需要给出明确的通讯协议文本才能设计对应的解释程序哦
蜀天下100000 2018-05-19
  • 打赏
  • 举报
回复
没有说清,串口接在终继器上的,一次从终继器过来一串数据(几十个台的数据的)
SupermanTm 2018-05-18
  • 打赏
  • 举报
回复
每必要多线程,如果你觉得是界面卡住的话,建议是用消息机制,每个字段(ListBox的一个Item)发一条消息给主窗口(用PostMessage),让主窗口去处理自己的消息队列,不就7字节一个字段嘛,直接填写在 WPARAM 和 LPARAM 就得了。
蜀天下100000 2018-05-18
  • 打赏
  • 举报
回复
引用 8 楼 DelphiGuy 的回复:
485不只支持点对点通信,也支持网络拓扑结构(好像485只支持总线型拓扑结构、422支持星型环型拓扑结构,没有深入了解),可以支持数十台设备联网,最高数据传输率可以达到10Mbps级别,如果楼主说的“一个COM口接收几十个台设备数据”是这种工控应用场景的话,还是有点复杂度的。
拆解后的处理工作会很耗时,我想用Timer1定时处理,但这么程序会死,用多线程没有经验!!!
  • 打赏
  • 举报
回复
485不只支持点对点通信,也支持网络拓扑结构(好像485只支持总线型拓扑结构、422支持星型环型拓扑结构,没有深入了解),可以支持数十台设备联网,最高数据传输率可以达到10Mbps级别,如果楼主说的“一个COM口接收几十个台设备数据”是这种工控应用场景的话,还是有点复杂度的。
蜀天下100000 2018-05-18
  • 打赏
  • 举报
回复
处理耗时有点多,一个COM口接收几十个台设备数据,还要: //1、存放原数据 //2、更新数据库 //3、每台设备有1-8个端口状态数据要拆解,更新端口状态图标,
蜀天下100000 2018-05-18
  • 打赏
  • 举报
回复
引用 5 楼 jankercsdn 的回复:
COM口怎么能“同时”读多个设备?232,485总线都不可能同时,除非用LAN。(这个真不明白是怎么个同时法) 建议用线程,至少一个线程用于发送和接收数据,这样才不会丢数据,也比较好处理数据。这个线程是必要的,和数据量的大小无关。 根据实际情况看要不要其它线程(用于分析,保存数据),你这个数据比较少,可以不用第二个线程。
有没有实例参考下,经验不足啊
看那山瞧那水 2018-05-18
  • 打赏
  • 举报
回复
COM口怎么能“同时”读多个设备?232,485总线都不可能同时,除非用LAN。(这个真不明白是怎么个同时法) 建议用线程,至少一个线程用于发送和接收数据,这样才不会丢数据,也比较好处理数据。这个线程是必要的,和数据量的大小无关。 根据实际情况看要不要其它线程(用于分析,保存数据),你这个数据比较少,可以不用第二个线程。
蜀天下100000 2018-05-17
  • 打赏
  • 举报
回复
引用 1 楼 DelphiGuy 的回复:
就这点数据,几百字段也才几KB,要什么多线程,非要多线程,一个线程读数据,一个处理即可
读取数据就用主线种的Comm1事件 处理想用Timer1定时处理,这样程序会死掉
蜀天下100000 2018-05-17
  • 打赏
  • 举报
回复
procedure TFormWorkView.Timer1Timer(Sender: TObject); var ByteArray: array of Byte; i:integer; y:integer; Number:integer; Devstr:string; begin ListBox1.Clear; //setlength(ByteArray,length(relaystr)); setlength(ByteArray,7); //Edit2.Text:=inttostr(length(relaystr)); Number:=(length(relaystr)-5) div 7; for i:=0 to Number-1 do begin Devstr:=copy(relaystr,5+i*7,7); for y:=0 to length(Devstr)-1 do begin ByteArray[y]:=byte(Devstr[y+1]); end; //这里处理数据,要更新动态按纽的图标、还要每条写入数据库,多子,介面会死掉 ListBox1.Items.Add(inttostr(ByteArray[0])+'-'+inttostr(ByteArray[1])+'-'+inttostr(MAKEWORD(ByteArray[2],ByteArray[3]))); end; end;
  • 打赏
  • 举报
回复
就这点数据,几百字段也才几KB,要什么多线程,非要多线程,一个线程读数据,一个处理即可

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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