求救!串口堵塞问题!!急啊!!!(仅有的210分)(210分)

  • 主题发起人 主题发起人 shengwq
  • 开始时间 开始时间
S

shengwq

Unregistered / Unconfirmed
GUEST, unregistred user!
通信方式:
1 三线制通信。
2 PC机从串口发出请求包,单片机收到后发回应答包。
3 PC机收到回包后开始下一循环,即回到2。一次完整的通信需时200-300MS
4 每次开机可以正常通信几秒至几分钟不等。之后即不断发生超时。再也无
法从串口中读到数据。除非机器重起(WIN98)或程序将串口关闭后打开
CLOSEPORT + OPENPORT(WINNT)。
5 我是调用API的,
if ReadFilehComm,PkBuffTemp0], nByteToRead, nByteRead, 0) <> TRUE then
Begin
ReportMessage( WM_ERRORENCOUNTED, ERR_READPORT, ord(SendBuff[5]));
ReceiveChar := FALSE;
Exit;
End;

---> if nByteToRead <> nByteRead then
Begin
PurgeComm(hComm,PURGE_RXABORT or PURGE_RXCLEAR);
ClearCommError(hComm,stat,@CS);
.......

出错出在箭头处,每次READFILE返回是TRUE,但是nByteRead的值一直
是0。从现象上看似乎是接收一段时间后串口接收部分被堵塞,导致一个字符都收不到。WINDOWS认为没有数据进来,但将信号连到其他串口就接收得到。


问题:
A 为何会出现‘堵塞’?如何避免?(看过别人的文章,似乎没遇到过这事)
B 如果一定会出现,如何在98下能立刻清除该状态并恢复?

请诸位高手把脉、指点、救我!急死了!
请遇到过类似情况的朋友联系我!谢了!


 
为什么是if不是while?你不是说是循环取么?
是否应该在下面的循环中也加上:Application.ProcessMessages;
 
(1)检查串口的设置DCB,可参考DELPHI帮助
(2)串口读入数据后通知Windows的方式,接收到特定的字符 / 读缓冲队列达到
一定的长度
(3)使用线程,异步方式读串口

实在不行,你也可以使用串口通信的控件,如需要言语一声。
 
程序主要结构如下:
1 最底层是字节收发部分,即ReadFile/WriteFile部分。
2 上一层是一个简单的自定协议部分。因为数据是一串一发,每串9-63BYTES不等
2-4串为一次会话。循环执行的是会话。
3 再上一层是串口通信部分和应用程序部分的接口。
4 最上一层是应用程序、界面。
5 和通信有关的是1、2两层,和串口有关的只是1层。协议分析收到的数据后用发
消息的方式通知界面程序。

因此循环是在协议层。我用线程来做的。同步方式。可能线程有问题。实现协议
的类本身继承了线程,而线程里做的事很多:控制循环;每循环的发数据和收数据
等。由于是半双工,发和收是严格分时的。我没有用OVERLAP的方式打开,不知有
否讲究。
我看过有关DCB的HELP,仍不是很明白。目前我试过用缺省的标志(12305),
也试过只置BINARY、PARITY两个BIT.流控制都没开。不知这些标志里有没有特别
要置位的或注意的。
我也下了几个控件,但由于这部分协议的存在,使用控件有较大的难度。


请大家帮忙想想办法吧,谢谢!
 
你的CreateFile是怎么写的?

另外, 不需要判断nByteToRead和nByteRead是否相等的, Read后都必须purgeComm

而且可能造成的原因是nByteToRead太大了.
有可能引起的原因是:
a. 两边的串口设置不同, 比如数据位,起停位的长度, 校验方法等.
b. 接收缓冲区太小

 
这个问题我遇到过
你既然是三线制,就需要把
DTR ,RTS
outx XON/XOFF
in xon/xoff
给关掉。设成false
 
我已经用spcomm控件实现了和单片机的多机通信,效果很好。
不要自己写了,用spcomm很好的,注意把其他的dtr, rts 关掉就好了
 
有一种可能性,你没有处理好异常事件
232或者485通信的时候,如果线路不好,或者波特率比较高的时候
会发生帧错误,这样你不去处理它,就会"死"
 
问题解决了吗?
 
呵呵
我遇到过这种情况,
不过我更惨,经常是几个小时后才发生阻塞情况。
而且每次我在的时间就没问题,
经常是我一走就出问题;(
终于一天在我等了一个晚上,才在凌晨二点遇到出错的情况。
于是跟进去,发现了阻塞情况。

我采用的处理方法是利用 WaitForSingleObject来设置Timeout
如:
if WaitForSingleObject( ReadThread.Handle, 1000 ) = WAIT_TIMEOUT then
ReadThread.Terminate;
我试了好几种型号的计算机,
好象在一种华硕主板的机器上常出此问题,在磐英主板的机器上从没出现这种问题。
不知别人还有过这种经历没有,
真实原因至今我也没找出来。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
647
import
I
后退
顶部