请教:如何安全正确的实现在并发的多线程实例中对同一个串口发送和接收信息?(50分)

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

xuekunli

Unregistered / Unconfirmed
GUEST, unregistred user!
在一控制系统中,利用串口对16台设备进行控制。在多线程中,根据具体情况和设备的连接,
利用串口进行控制。就有可能同时几个并发的线程对同一个串口读写。我利用SPCom编的程序
运行时,总是在出错,提示某内存不能read.请教如何才能安全正确的实现在并发的多线程实
例中对同一个串口发送和接收信息?
 
用aip控制串口的针角
 
以共享方式打开串口
 
把串行口的控制部分单独做一个EXE文件,各个程序(线程)用WM_COPYDATA消息给它送报文包;
接收回来的信息也必须构筑报头,由报头决定送往那些程序(线程)。
 
不能同时访问同一个串口,我想你应该采用互斥量,让每一个线程轮询串口.SupermanTm说的
也要加进去.
不知我说的对不对?
 
在对一个串口进行读写时,应该FLOCK.ENTER 然后Flock.Leave,
可以用消息的机制来实现
 
可能同时几个并发的线程对同一个串口读写 <<<=== 串口不能同时被多个线程所读写
真的要用到多线程的话,只能用临界区 或 互斥,来判断串口是否已就绪.
 
我曾经做过这样的东西(较为复杂,源码就不帖了),是很容易做到的,首先是一个COM口的
服务程序(只有它真正管理串行口),在内部建立一个串行口发送报文队列(我用的是线性
链表),接收的消息包含三个附加信息,第一个是调用者的消息接收窗口HANDLE,如果是0则
该报文不要求有回应;第二个是优先级,低优先级的发送报文加在队列尾,高优先级的插在
队列头;第三个是回应方式,立即回应的,发送该报文后不再发送队列下一报文(有超时机制),
等待从机回应后把回应数据POST回去,非立即回应的,发完该报文后经过总线缄默期后发送队
列下一报文,待从机回应时从回应报文中提取目标再POST;
事实上,我认为并不需要使用所谓的多线程(串行口服务程序本身就是所有其他应用程序的公
用服务线程)。
需要注意的是,对来自应用程序的发送请求消息的响应中需要判别当前队列是否为空,如空则
不理会优先级而直接发送,同时设置“忙”标志。
对于可延误回应的报文需要建立一个数组(或TLIST对象)KEEP住回应的目标,每个可延误回应
的报文均给它一个唯一的报文ID。
 
16台设备是怎么连接的?每台设备上有一个串口吗?
 
是的,每台设备上有一个串口。
 
你的计算机有16个串行口啊?有可能么???!!!
 
我用了多串口卡,利用RS-485接口。
 
SupermanTm说的非常好啊,我们以前的一些和银行合作的大的中心转发的通讯程序
也是类似处理的,将队列作为临界资源,由于队列本身就可以上锁/解锁,在处理期间
保持队列的上锁状态,其他线程就会全部等待,当解锁时,等待的队列就会让优先级
高的线程使用,再上锁,
这个是标准的多线程通讯做法,百试不爽!!!呵呵
 
我觉得用多串口卡没意义的,至少没必要
 
To SupermanTm:
是否可以贴出程序来,让大家学习一下....
十分感谢!!!!
 
用MOXA卡,5000-9000RMB,简单,每个设备对应一个串口
 
To SupermanTm:
是否可以贴出程序来,让大家学习一下....
十分感谢!!!!
 
不需要用多串口卡,如数据量小,也不用多线程。
我的做法是:pc机是主动的,发送命令包(包含设备号,命令和数据),设备是被动的,所有设备接受pc机数据,
设备号等于自己则响应(上传数据或按命令动作),否则丢弃不理,设备不能主动跟pc机通讯。
我是学习的,不对请指正。
 
引用:
SupermanTm说的非常好啊,我们以前的一些和银行合作的大的中心转发的通讯程序
也是类似处理的,将队列作为临界资源,由于队列本身就可以上锁/解锁,在处理期间
保持队列的上锁状态,其他线程就会全部等待,当解锁时,等待的队列就会让优先级
高的线程使用,再上锁,
这个是标准的多线程通讯做法,百试不爽!!!呵呵
一个串口对多台设备通讯,如何知道和哪个设备通讯?而该设备又如何知道是和自己通讯呢?
 
后退
顶部