spcomm接收函数看的不太懂,这个函数处理的时候是处理一个字节还是一帧数据?
还有,怎么讲接收到的数据送到对应的edit中。我知道制定协议,但是不知道怎么去实现。
delphi的spcomm接收到数据后怎么讲数据存放到对应的edit中?
答案:2 悬赏:50 手机版
解决时间 2021-02-06 19:55
- 提问者网友:雾里闻花香
- 2021-02-06 03:00
最佳答案
- 五星知识达人网友:行雁书
- 2021-02-06 03:46
spcomm的接收事件
TByteArrData = array[0..1023] of Byte;
procedure TComComponent.ReceiveData(Sender: TObject; Buffer: PAnsiChar; BufferLength: Word);
var
ByteArr: TByteArrData;
begin
Move(Buffer^, ByteArr, BufferLength);
end;
接收以后 就是一个数组 按规约解析这个数组。
至于具体如何解析。 得看规约。
典型的如 modbus
如果你要自定义规约,那简单。
可以定个最简单的规约
1地址位 1指令之类 N字节指令数据 1-2字节和检验位(前面的数据的累加和 抛弃进位)
指令数据根据应用不同 长度自己定义 至于具体数据格式 也可以自己定义
串口通讯容易丢失数据位,所以必须有校验。
TByteArrData = array[0..1023] of Byte;
procedure TComComponent.ReceiveData(Sender: TObject; Buffer: PAnsiChar; BufferLength: Word);
var
ByteArr: TByteArrData;
begin
Move(Buffer^, ByteArr, BufferLength);
end;
接收以后 就是一个数组 按规约解析这个数组。
至于具体如何解析。 得看规约。
典型的如 modbus
如果你要自定义规约,那简单。
可以定个最简单的规约
1地址位 1指令之类 N字节指令数据 1-2字节和检验位(前面的数据的累加和 抛弃进位)
指令数据根据应用不同 长度自己定义 至于具体数据格式 也可以自己定义
串口通讯容易丢失数据位,所以必须有校验。
全部回答
- 1楼网友:持酒劝斜阳
- 2021-02-06 05:17
你这个问题首先要确定瓶颈在哪里,一般人写,会把数据处理也写入到comm1receivedata事件里面去,比如以下代码:
procedure tfcomm.comm1receivedata(sender: tobject; buffer: pointer;bufferlength: word);
var
i:integer;
begin
viewstring:=‘’ ;
move(buffer^,pchar(@rbuf^),bufferlength);
for i:=1 to bufferlength do
viewstring:=viewstring+ inttohex(rbuf[i],2)+‘’ ;
viewstring:=‘接收’+ viewstring;
memo1.lines.add(viewstring);
memo1.lines.add(‘’ );
end;
除了接收数据,它还干了其他两件事,1是字符串处理转换,2是往memo的缓存内丢数据,也许是你也是这么干的,如果想要优化,可以把buffer的处理丢到另外一个线程去干。
如果仅仅是响应receivedata时间就等待很长时间(可能是单个buffsize很大,也可能是buff发送很密集),这样的问题,仅仅靠spcomm控件是无法解决的,你可以考虑从winapi提供的一系列函数比如createfile、writefile、readfile等来实现,它们提供更多的优化方案。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯