专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > C++ Builder

通过485串口采集单片机发送的数据,一共有128路,应该怎么循环采集

发布时间:2011-06-28 14:02:04 文章来源:www.iduyao.cn 采编人员:星星草
通过485串口采集单片机发送的数据,一共有128路,应该如何循环采集?
我这里有128台仪器串联,然后其中一台连485接到到电脑上,电脑上的界面就负责采集这些仪器发送过来的数据,仪器发送数

据时是一台一台发的,有时间的先后顺序,不能同时发,我该怎么来循环接收这些数据呢?我现在用的是Timer事件,隔400ms

接收一次,不知道是否可以?有人推荐我用线程,但是我对线程一点都不了解,不知道怎么用。而且不知道是不是用线程会更

好,或者还有没有别的更好的方法。请大家指教!谢谢!

------解决方案--------------------
关键是需要一个应用协议区分不同仪器
------解决方案--------------------
引用楼主 cunllp 的帖子:
我这里有128台仪器串联,然后其中一台连485接到到电脑上,电脑上的界面就负责采集这些仪器发送过来的数据,仪器发送数

据时是一台一台发的,有时间的先后顺序,不能同时发,我该怎么来循环接收这些数据呢?我现在用的是Timer事件,隔400ms

接收一次,不知道是否可以?有人推荐我用线程,但是我对线程一点都不了解,不知道怎么用。而且不知道是不是用线程会更

好,或者还有没有别的更好的方法。请大家指教!谢谢!

------解决方案--------------------
timer事件显然是不合理的,时间长了可能丢失数据,时间短了浪费资源,可以用异步方式或开一个线程监视数据的到来。
------解决方案--------------------
为什么要循环接收?你还要按顺序接收数据?
我们公司也做这样的,就是让设备自动发,我这边等着收就是了。
硬件设备通讯应该都有规约协议的
设备也会有唯一的地址,除非你广播发数据。
如果是设备发送数据,那它们应该有个心跳时间,间隔多长时间给主机发一次,
那你就能算出你Timer的间隔时间了,设个数据缓冲区,接收设备发的数据
定时读数据和清理缓冲区。

如果你是给设备发请求数据,再让设备发回来,那就不用这么麻烦了吧。

------解决方案--------------------
不用线程的话,做个数据缓冲区。
给表发数据
等待表回发数据(等待时间设个合理的时间,根据通讯速率)
判断缓冲区的数据,是否有数据
没有,再发N次,超过N次跳出。
有数据,判定数据是否正确。
发下一个表的数据
------解决方案--------------------
就是暂时存设备发过来的数据的地方,你要不用线程,先这么做吧。
------解决方案--------------------
485?你是要从串口读数据吧,用timer的话,如果超时的话,可能会丢失数据的
------解决方案--------------------
最好统一输入,用485全都用485.用IP或COM线.就全用某一种.

你这一半,那一半,估计调试的时候够呛,你调试完全部,有空再调试一半是这,一半是那,也来得及.

用TIMER可行的.但不好,TIMER时间短的话,你的程序跟死机一个样,人家想用机器也不行.

你还是用线程好,调试好接收的时间间隔,就不停的收集数据,然后收集数据后,做好规则,再显示.

最好就是可以扔数据,就是坏数据,直接扔掉不要....不然就要修正数据.
------解决方案--------------------
你这个情况就象我上次做的温度采集差不多,不过我的只有十几台设备。由于水平有限,采用循环发收,稳定性一直不好,偶尔会丢数据,就放弃了。等着看看你的成功方案~~我觉得设备多了用同步通讯方式肯定不行的,但异步操作我还是没有搞清WINDOWS下的机理。
------解决方案--------------------
485通讯的时候,每个设备都是有个地址的,每个设备都不能同时发送消息,但是作为程序,你不需要管他,应为这是硬件实现的
,你只需要把数据读出,保存在你自己的缓冲区里就可以了,建议还是做个线程吧,线程读取到数据后,填充到一个队列里,然后通知主程序,主程序从队列里取出数据,处理。

线程的例子,你网上查一下,很多的,也蛮简单的
------解决方案--------------------
探讨
怎么开线程监视数据的到来?我得先发送请求命令,仪器才给我发数据的。我得从第一台开始依次发请求命令依次接收数据,到最后

一台接收完毕后,此次循环才算结束。在给某一台仪器发完请求命令后,需等待几百毫秒再读取接收到的数据,从而获得此仪器的测

量数据。我不知道怎么用线程监视数据是否发过来了。以前还没用线程,所以一点概念都没有。

------解决方案--------------------
不要用定时器,建立一个辅助线程,在其中创建一个"异步"模式的串口,设置好事件屏蔽字,然后等待发生事件.可以最快地响应串口接收任务.
------解决方案--------------------
不要用线程,
用485/MODBUS最简单:
1.用485串行通迅;
2。总线式,协议用支持多端口的MODBUS协议;
但你的每台单片机如果不支持此协议就麻烦了,
因为用总线式,如果主机发命令,每台机都会
收到相同的命令串,所以,要支持多端口的软协议;


------解决方案--------------------
485/总线式一定要是主/从式的,
电脑是主,仪器是从,否则,仪器各顾各的发,总线上就乱了套;
电脑不发命令,仪器就不能发数据,
电脑发的取数命令中包含是哪一个节点的编号,这样,对方就响应,
电脑只要按顺序一个一个发,每个节点就依次乖乖的发数据;
这个最好的协义就是 MODBUS;



------解决方案--------------------
用mscomm控件,将接受的数据先缓存然后用线程处理数据,这时候就要注意临界区问题了。使用std::vector<BYTE>。接收mscomm的数据,发送当然可以使用timer,主要是发送和处理数据的时间间隔点。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: