急!!!如何控制串口(Rs-232口)通讯中发送报文和接收报文间的时间间隔? (5分)

  • 主题发起人 主题发起人 青云
  • 开始时间 开始时间

青云

Unregistered / Unconfirmed
GUEST, unregistred user!




比如我用pc机和终端设备通过RS-232进行通信,通信线就用了2、3、5这三个引脚。属于那种最简单的通讯方式。
现在我有一个疑问:

比如pc机发送 10 5B 01 5C 16 给终端
终端收到后,再回复给pc机
PC 机接收到 68 BE BE 68 88 01 02 74 05 01 0D 00 8D 00 02 00 10 3F 00 08 11 00 BF 01 3F 00 C0 00 09 10 01 3F 0B 00 00 BF 10 04 01 00 01 00 00 00 02 00 00 00 00 00 01 00 00 01 00 00 01 00 00 00 01 00 01 00 00 00 00 01 01 00 00 00 00 00 01 00 01 00 00 00 02 00 00 00 00 00 01 00 00 01 00 00 01 00 00 00 01 00 01 00 00 00 00 01 01 00 00 00 00 00 01 00 01 00 00 00 02 00 00 00 00 00 01 00 00 01 00 00 01 00 00 00 01 00 01 00 00 00 00 01 01 00 00 00 00 00 01 00 01 00 00 00 02 00 00 00 00 00 01 00 00 01 00 00 01 00 00 00 01 00 01 00 00 00 00 01 01 00 00 00 00 00 01 00 01 00 00 00 02 00 00 00 00 00 2F 16

现在我发现一个问题,就是
因为接收的抱文有点长
如果我这样写:
发送报文('10 5B 01 5C 16 ');
memo1.text:=接收报文;
那么接收到的可能是 68 BE BE 68 88 01 02 74 05 01 0D 00 8D 00 02 00 10 3F 00 08 11 00 BF 01 3F 00 C0 00 09 10 01 3F 0B 00 00 BF 10 04 01 00 01 00 00 00 02 00 00 00 00 00 01 00
也就是说我接受的时候,终端正在发送报文给pc机,如果我立即收报文,只能收到一截,而不是全部。

所以我改写了一下程序

发送报文('10 5B 01 5C 16 ');
sleep(500);
memo1.text:=接收报文;
这样接收到的报文就全了,但是延时500ms是不是太浪费了,而且如果终端回复给pc机报文太长,也许延时500ms也不一定够。

所以我想到了另一种方法

  发送报文('10 5B 01 5C 16 ');
sleep(20);
  看看接收缓冲区的报文长度;
sleep(20);
   再看看接收缓冲区的报文长度;   
  比较这两次报文长度是否相等,如果相等,说明收全了,这时就读出缓冲区的报文,清空缓冲区;如果不等,说明终端正在发报文,还没有发完,再看看接收缓冲区的报文长度,继续比较,如此循环,只到最后两次收到的报文长度相等了,才读出缓冲区的报文,清空缓冲区;

  对应的代码:
timedelay(20);
ClearCommError(hCommHandle,dwError,@CS); //取得状态
comp:=cs.cbInQue;
for i:=1 to 50 do
begin
timedelay(20);
ClearCommError(hCommHandle,dwError,@CS); //取得状态
if (comp=cs.cbInQue) and (cs.cbInQue>1) then break;//报文收全了
end;
RecieveCount:=cs.cbInQue;
if cs.cbInQue >2048 then
begin
PurgeComm(hCommHandle, PURGE_RXCLEAR);
RecieveCount:=0;
// 清除COM 数据
exit;
end;
try
ReadFile(hCommHandle, ByteArray,cs.cbInQue,nBytesRead,nil); // 接收COM 的数据
except

end;

不过我认为我这种方法不好 ,我看到好多串口调试软件都是把发送和接收分开处理的,因为本来Rs-232就是全双工方式,好象都用到了线程,
而且我发现好象没有报文只收到一半的情况,我觉得很奇怪,因为它们在读取缓冲区数据的时候,怎么知道此时终端发给pc机的数据已经发完了,
万一正在发送,那不是也有可能只收到一截吗?
  这个问题困惑了我好久,想请您给我点提示?


我编写的串口通讯控件:
http://www.yzsoftware.com/comdai.txt

我为我公司编写的电气行业类根据101规约实现串口通讯的工具:
http://www.yzsoftware.com/downloads.asp?picture=1&downloads=ftutest.exe





  





 
大家到
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2202458
帮我看看
 
我门的项目前期做的也是用串口通信的,现在改用以太网了。用到的规约是电力系统的远动
传输规约101。你是电力部门的吧,对这个应该有了解。我以前的报文长度最长的只有100个字节左右。因为遥测和遥信,和故障录波的长度各不相等,所以设了一个全局变量来控制发出一条询问报文后,应该收到的长度。勉勉强强没有出现过只收到一半的情况,倒是如果每条报文间隔太短的话(0。5秒以下),会出现漏掉几条报文的情况。
不知道你对局域网的研究有多少?出现Socket Error #10061是什么意思?大家互相交流哦。我是华北电力大学的。

 
后退
顶部