Mscomm 控件接收数据丢失问题(中间部分数据丢失,不定时出现)。

lzh280 2013-07-15 04:49:40
数据接收部分代码如下:

在测试过程中发有时会出现一帧数据丢失现象。都是中间丢了8字节数据,不知道原因在哪,且不一定每次都出现。

哪位遇到过此类问题帮忙提供下解决思路,谢谢!

procedure TForm1.mscm1Comm(Sender: TObject);
var
vTmp: Variant;
Buffer: OLeVariant;
i: integer;
RXDlen: Integer;
Temp: string;
MSCommTXD: TMSComm;
ChaobData: array[0..5000] of byte; //接收字节数组
begin
LastTickCount := GetTickCount;
MSCommTXD := TMSComm(Sender);

if (MSCommTXD.CommEvent <> 2) then
Exit;

RXDlen := MSCommTXD.InBufferCount;

if RXDlen > 0 then
Buffer := MSCommTXD.Input;

MSCommTXD.InBufferCount := 0; //清空接收缓冲区
vTmp := VarArrayCreate([0, RXDlen], varByte);
vtmp := Buffer;

for i := 0 to RXDlen - 1 do begin
ChaobData[i] := vtmp[i];
G_Buffer := G_Buffer + chr(ChaobData[i]);
end;
end;
...全文
163 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
看那山瞧那水 2013-07-15
  • 打赏
  • 举报
回复
1、收到一个字符就触发接收并读缓冲区的,最好加个延时或长度判断,不然会经常收不全的。 2、如果这个MSCOMM搞不定的话,你用个Cport或Spcomm试试?(也是要加延时或长度判断)
lzh280 2013-07-15
  • 打赏
  • 举报
回复
引用 1 楼 jankercsdn 的回复:
换种方试试: if RXDlen < 1000 then //这里1000可以高为你需要的长度, "> 0"这种判断可能还没收全,然后就被清了 exit;
如何这样判断的话,如果一次接收字节少的话,或者小于设置的长度(1000),会导致数据接收不到。
lzh280 2013-07-15
  • 打赏
  • 举报
回复
我用的是事件驱动方式进行接收,每接收一个字节触发 OnComm 事件,按理说在 OnComm 事件里面应该可以接收完所有数据,但现在就量偶尔会丢帧。如下: 第 1 帧是在 OnComm 里面打印 G_Buffer 最终接收完的数据,但是后面少了8个字节(空格部分为丢失数据)。 第 2 帧为使用其它串口工具监控到的数据帧,红色部分是第1帧丢失的数据。 1、68 99 00 81 05 00 10 00 00 81 02 00 00 00 00 00 01 00 00 00 00 00 13 01 00 00 01 02 7A 68 41 63 18 00 00 00 68 91 6E 34 34 63 36 8B 84 46 44 34 44 34 33 33 33 C5 5B 33 33 C8 34 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 82 16 C5 16 2、68 99 00 81 05 00 10 00 00 81 02 00 00 00 00 00 01 00 00 00 00 00 13 01 00 00 01 02 7A 68 41 63 18 00 00 00 68 91 6E 34 34 63 36 8B 84 46 44 34 44 34 33 33 33 C5 5B 33 33 C8 34 33 33 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 82 16 C5 16
看那山瞧那水 2013-07-15
  • 打赏
  • 举报
回复
换种方试试: if RXDlen < 1000 then //这里1000可以高为你需要的长度, "> 0"这种判断可能还没收全,然后就被清了 exit;

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧