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

木子月月鱼 2009-07-07 09:50:29
加精
我这里有128台仪器串联,然后其中一台连485接到到电脑上,电脑上的界面就负责采集这些仪器发送过来的数据,仪器发送数

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

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

好,或者还有没有别的更好的方法。请大家指教!谢谢!
...全文
2641 83 打赏 收藏 转发到动态 举报
写回复
用AI写文章
83 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzhu3000 2010-07-24
  • 打赏
  • 举报
回复
学习了!
土著巫师 2010-07-14
  • 打赏
  • 举报
回复
放在TIMER里绝不可取!TIMER停掉了,你都不知道怎么回事,一个繁忙的进程里,TIMER可能不触发或延迟触发。
zm986 2010-05-05
  • 打赏
  • 举报
回复
485就是一对一的串口通信,多一个地址字节而已。
痞子酷 2009-12-04
  • 打赏
  • 举报
回复
在windows ,使用线程机制,每个线程采用阻塞的方式,也是可以的。但控制起来不是非常好,只要其中一个线程数据或处理有点小问题,呵呵,问题就麻烦了。
痞子酷 2009-12-04
  • 打赏
  • 举报
回复
windows下操作系统不稳定,容易出问题,连你自己都不知道。
痞子酷 2009-12-04
  • 打赏
  • 举报
回复
我这里有128台仪器串联,然后其中一台连485接到到电脑上,电脑上的界面就负责采集这些仪器发送过来的数据,仪器发送数

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

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

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


-----------------------------------
建议在unix 或 Linux ,使用select方式,比较好处理些。
后台负责数据采集,
前台负责数据展现。
EagleFew 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 74 楼 no2_present 的回复:]
其实这种方案有很大的问题,128路串联的话,这个和IP通讯不同,它没有侦测线路是否繁忙的命令,所以每个机器都必须不停的接收数据,判断协议,如果有数据通信,不是自己的就不通讯,这样线路就异常繁忙(串口的传输速率太低了)。
至于楼主问的timer中做循环轮询是行不通的,应该采用串口异步通信,线程中事件通知的方式。
不过我建议楼主还是用多串口卡并发通讯比较稳当.
[/Quote]

仁兄, 此言差矣.

楼主用的是485总线, 而仁兄您说的貌似是在说232. 485总线在任意时刻都只能与一个设备通讯.


另外. 楼主担心出问题是正常. 但是一个设备出问题, 导致整个轮询的过程停止的话. 其实你忘记了, 可以加上一个超时机制的啊. 如果10秒之内没有受到设备的应答数据的话, 就马上轮询下一个设备了.

实际上是没有什么问题的. 而且你用的是485 并不能使用多线程来提高总体的轮询速度.


除了定时器之外, 用一个线程也可以替代定时器的作用
lhy 2009-07-30
  • 打赏
  • 举报
回复
最近看了资料,485可能用阻塞更简单。
HuWenjin 2009-07-30
  • 打赏
  • 举报
回复
#include <Process.h>

到这个文件里看看,解决办法就在里面

写一个静态函数,做为处理流程

用上面包将该静态函数启动为线程。

不用Timer处理
flowercity 2009-07-28
  • 打赏
  • 举报
回复
PC->串口->PC发送的数据->485总线->设备1->设备返回的数据->485总线->PC串口->PC
PC->串口->PC发送的数据->485总线->设备2->设备返回的数据->485总线->PC串口->PC
PC->串口->PC发送的数据->485总线->设备3->设备返回的数据->485总线->PC串口->PC
。。。。。。。

pc向串口设备发送读取数据指令
串口设备响应之后返回数据
进入下一个设备
如此循环就可以
sunjing 2009-07-28
  • 打赏
  • 举报
回复
Windows 下可以考虑使用WaitCommEvent
fuyonggao 2009-07-28
  • 打赏
  • 举报
回复
不要用Timer,除非你想整死客户或系统是拿来演示教学用的.
用多串口卡和多线程,1线程-->1串口,1串口-->n控制器
,128个控制器可以相当是实时连接
同时应考虑数据同步,不然会出现系统错误,这比较复杂
qgylovelj 2009-07-28
  • 打赏
  • 举报
回复
jf
绿野耕夫 2009-07-28
  • 打赏
  • 举报
回复
纯顶贴,不发表任何以及爱你
xugh 2009-07-28
  • 打赏
  • 举报
回复
没有事件吗
NO2_Present 2009-07-28
  • 打赏
  • 举报
回复
其实这种方案有很大的问题,128路串联的话,这个和IP通讯不同,它没有侦测线路是否繁忙的命令,所以每个机器都必须不停的接收数据,判断协议,如果有数据通信,不是自己的就不通讯,这样线路就异常繁忙(串口的传输速率太低了)。
至于楼主问的timer中做循环轮询是行不通的,应该采用串口异步通信,线程中事件通知的方式。
不过我建议楼主还是用多串口卡并发通讯比较稳当.
yanerweb2 2009-07-28
  • 打赏
  • 举报
回复
上面大家说了半天,能告诉我一下出了 timer 能实现循环,还有什么
方法能够实现循环那??

, 如果不用 timer 做循环的话,那么用什么方式循环那?

是用 for 语句吗?谢谢。

huangkan1987 2009-07-27
  • 打赏
  • 举报
回复
MARK。。。
就快用到咯~~~
学习下。。。
maururu 2009-07-27
  • 打赏
  • 举报
回复
仔细看了一下,18、19楼说的比较好,不过你要考虑多线程。一个串口处理128台下位机完成一个循环的时间比较长,如果对轮询时间有要求就要考虑多串口了,可以参考MOXA的多串口卡
dronly 2009-07-27
  • 打赏
  • 举报
回复
我是来学习的。
加载更多回复(60)

1,316

社区成员

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

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