青
青云
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