如何为每一个串口分别建立一个线程,并用轮循的方式和下位机通讯?(200分)

  • 主题发起人 主题发起人 xuming
  • 开始时间 开始时间
X

xuming

Unregistered / Unconfirmed
GUEST, unregistred user!
1:如何为每一个串口分别建立一个线程,并用轮循的方式和下位机通讯?
2:关键是下位机是被动应答,上位机发一个数据包,下位机应答一次。
3:有时主进程要发送其它的控制命令,让命令插入到线程当中,让线程发送出去,然后接收到下位机返回的数据,并把数据返回给主进程。
我现在是百思不得其解呀。
 
串口只能点对点,不知道你的各个下位机哪有那么多串口,建议用485总线
 
是的,下位机是用485连的,然后通过一个485转232的转换模块转换的。
IIE老大去哪里了呀?
 
支持一下过 一阵子就要做这些了 ~
学习学习
 
你的想法完全可行:
每个串口线程创建时Create一个TStringList用来当作主进程发来的命令缓冲区,串口线程提供一个Public的方法供主进程加入命令,串口线程在循环中查询命令缓冲区(读完清空)并生成具体命令帧,写串口,主进程与串口线程访问命令缓冲区需注意同步。串口线程返回的通信结果可写入一全局结果缓冲区,并发消息到主窗体,多串口线程访问结果缓冲区同样需注意同步。
串口线程中可用API+事件进行读写操作,具体可参照SpComm并将其改造为单线程。


 
to labelsoft,
谢谢你从专业的角度证实了我的设计思想。
但我对线程不太熟悉。
您能给我一些例子或参考代码吗?
如果能在QQ上聊就最好,我的是:19955091
多谢了
 
把线程中的轮询函数做成Synchronize(method)的方式,
这样主程序发命令时便不会与线程中的函数冲突了。
我以前做的一个例子,是用一个线程隔两秒与下位通讯一下,以此侦测
通讯链路的好坏,当上位要发别的命令时,因为线程的轮询函数已经
同步化了,所以不会冲突,
不知你是不是要这种效果。
 
主要是写一个线程而已。
要自己写一套控件了。
 
我要的与KNWANG的有点不同。
我现在只说一下一个串口的情况:
1:这个串口通过232转485模块与10(有可能多,有可能少)台下位机联接。
2:这个串口通常不断的轮循串口,分别查询每台下位机的状态数据。
A:先发一个向第一台下位机查询状态命令,然后等待第一台下位机返回状态数据。
B:当收到第一次下位机返回的数据后,把取得的状态数据送给主进程。
C:重复A操作,开始查询第二台下位机,直到最后一台查询完后,又从第一台开始。
3:在线程执行过程中,随时会有主进程会要发送特殊命令,这时,线程要优先处理主线程的命令,并把接收到的数据返回给主进程。
基本上就是这样子的了。
 
你最好别这么干!
 
抱歉我经常出门的,你的思路我简单看一下没问题的,我们都做过的。
至于你的问题三,你把通信线程做成开放的就可以了,就是用IPC解决。
***
delphi用线程很方便的
有一个TThread类,很简单实用
***
要把通信线程做成一个状态机——当然这要花费一些时间[:D]
***
我习惯把通信线程做成DLL,然后同系统事件提交给宿主程序,当然这不是必须的,用DDE或者干脆发消息都可以做到,不过用系统事件可以使得多个程序可以共享你的通信服务。
***
knwang的做法也可以的我觉得就单串口而言跟你的需求没什么差别。
不知道hfghfghfg是什么想法
 
提前再提前,呵呵
 
你研究一下spcomm控件源码!就好了!!!
 
关注 一下,我也可能要用到
 
我是用一个线程处理端口事务 如读数据 ,也可以再加一个线程写端口数据。 另外一个线程处理数据。
 
我想你在写这个线程时,住意不要占太多cpu资源(线程中不要太多循环)
 
下位机返回的数据会自动触发串口的接收事件。我觉得不需要搞的这麽复杂。上位机发完数据包,就可干别的事了.等下位机返回的数据自动触发串口的接收事件时再关注处理数据
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
后退
顶部