多线程串口通讯的奇怪问题(200分)

  • 主题发起人 主题发起人 catbrother
  • 开始时间 开始时间
C

catbrother

Unregistered / Unconfirmed
GUEST, unregistred user!
我用多线程方式做了一个串口通讯程序,同时打开两个串口。每个串口对应一个线程,
每个线程不停循环检测是否有串口事件发生,如果检测到数据接收事件,马上向窗体发送一个自定义的消息,
让窗体显示数据。
用单片机开发串口发送数据工具,对两个串口不停发送数据。
现在数据能够正常的接收,但是有个毛病:当我把单片机关掉的时候,程序就死了!!!
郁闷!!!
 
是不是在线程过程调用时没有写 Synchronize()?
 
估计是你的循环检测部分没有Sleep, 适当的睡上一会看看
 
to 吕雪松
是必须的吗?

to tseug
为什么?串口发来的数据是不停的发的啊!
 
当然必须加了,不然就会有此问题,你看看TThread的介绍。
 
我可是采用向主线程发送消息的方法读取数据的,另外还设置信号量互斥。
和Synchronize意思差不多阿!
 
问一下?
1、是用api函数写的吗?
2、超时时间设置了吗?
3、同步事件的复位,置位正确吗?
4、上位机和单片机是用握手方式通讯的吗?
5、死机后再打开单片机,能够恢复通讯吗?
 
是用api函数写的
超时时间设置了吗-->没有,不会[:(][:(]
同步事件的复位,置位正确
上位机和单片机没有用握手方式通讯
死机后再打开单片机,不能够恢复通讯
 
var
commtimeouts: TCommTimeouts;


GetCommTimeouts( hCommFile, commtimeouts );
commtimeouts.ReadIntervalTimeout:= 100;
commtimeouts.ReadTotalTimeoutMultiplier := 0;
commtimeouts.ReadTotalTimeoutConstant := 0;
commtimeouts.WriteTotalTimeoutMultiplier := 0;
commtimeouts.WriteTotalTimeoutConstant := 0;
SetCommTimeouts( hCommFile, commtimeouts );

在串口设置的地方加上上面的语句,设置超时。
 
是握手方式的问题
 
同意Bxch_1000的观点,你一定没有设置超时
程序停留在readfile语句上了
 
to Bxch_1000:
超时设置里每个参数到底是什么含义?
我除了设置commtimeouts.ReadIntervalTimeout:= 100;
还设置了commtimeouts.ReadTotalTimeoutMultiplier := 50;
 
我不是很清楚!
我用过读卡器 RS232接口的,要是在使用中关闭读卡器就是这样的!死机。因为我有个
Timer要检测设备,并读卡。和这个可能类似吧!?
关注!
 
把你的线程贴出来看看
 
ReadTotalTimeout = (ReadTotalTimeoutMultiplier * bytes_to_read)
  + ReadToTaltimeoutConstant
WriteTotalTimeout = (WriteTotalTimeoutMuliplier * bytes_to_write)
  + WritetoTotalTimeoutConstant
你这样设置以下:
var
tout:COMMTIMEOUTS;
tout.ReadIntervalTimeout := 20; //设置超时结构
tout.ReadTotalTimeoutMultiplier := 100;
tout.ReadTotalTimeoutConstant := 1000;
 
哈,我也是搞计算机串口通信的,从现象看不出你的问题,能把你的代码贴上来看看吗?
 
这种问题好像只出现在2000中,98好像没这问题
 
后退
顶部