永发信息网

delphi的spcomm接收到数据后怎么讲数据存放到对应的edit中?

答案:2  悬赏:50  手机版
解决时间 2021-02-06 19:55
  • 提问者网友:雾里闻花香
  • 2021-02-06 03:00
spcomm接收函数看的不太懂,这个函数处理的时候是处理一个字节还是一帧数据?
还有,怎么讲接收到的数据送到对应的edit中。我知道制定协议,但是不知道怎么去实现。
最佳答案
  • 五星知识达人网友:行雁书
  • 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字节和检验位(前面的数据的累加和 抛弃进位)

指令数据根据应用不同 长度自己定义 至于具体数据格式 也可以自己定义

串口通讯容易丢失数据位,所以必须有校验。
全部回答
  • 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等来实现,它们提供更多的优化方案。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯