L lengyan69 Unregistered / Unconfirmed GUEST, unregistred user! 2009-10-14 #1 请问一下,我用SPCOMM控件做串口通信,如何收到数据不正确就重发,触发ONRECEIVE事件时原来接收缓冲区的数据是不是被清空,现在接收缓冲区里的数据是不是重发后接收到的新数据,没有原来的数据?意思是每重发触发接收的都是新数据?
请问一下,我用SPCOMM控件做串口通信,如何收到数据不正确就重发,触发ONRECEIVE事件时原来接收缓冲区的数据是不是被清空,现在接收缓冲区里的数据是不是重发后接收到的新数据,没有原来的数据?意思是每重发触发接收的都是新数据?
Y yanghai0437 Unregistered / Unconfirmed GUEST, unregistred user! 2009-10-14 #2 你要保证在ONRECEIVE事件时一次性将接收缓冲区中的所有数据接收过来(这个时候接收缓冲区是被清空了的),然后再判断,如果不正确,再重发,当再次触发ONRECEIVE事件时收缓冲区中的所有数据就是你重发后的返回的新数据
你要保证在ONRECEIVE事件时一次性将接收缓冲区中的所有数据接收过来(这个时候接收缓冲区是被清空了的),然后再判断,如果不正确,再重发,当再次触发ONRECEIVE事件时收缓冲区中的所有数据就是你重发后的返回的新数据
L lengyan69 Unregistered / Unconfirmed GUEST, unregistred user! 2009-10-14 #3 谢谢,我用move(buffer^,alarm_data1[0],bufferlength);语句把缓冲区的数据读入alarm_data1数组中,在100ms内应该是保证了数据的完整性的,move(buffer^,alarm_data1[0],bufferlength);语句就把接收缓冲区清空了吗
谢谢,我用move(buffer^,alarm_data1[0],bufferlength);语句把缓冲区的数据读入alarm_data1数组中,在100ms内应该是保证了数据的完整性的,move(buffer^,alarm_data1[0],bufferlength);语句就把接收缓冲区清空了吗
S SupermanTm Unregistered / Unconfirmed GUEST, unregistred user! 2009-10-15 #4 // 全局变量:var QuestState: Integer; // 查询状态字 RxBuf: array [0..255] of Byte;procedure TForm1.StartComm;begin SPCOMM1.Open; Timer1.Interval:= 300; // 假定300毫秒采集一次 Timer1.Enabled:= True;end;procedure TForm1.HandleRxData(DataPos: Integer);begin // 你的报文处理程序,报文起始字节在RxBuf[DataPos]end;procedure TForm1.Timer1Timer(Sender: TObject);var I, N: Integer;begin N:= SPCOMM1.Read(256 - RxLen, RxBuf); for I:= 0 to N - 1 do begin if RxBuf = ... { 你的报头同步字节 } then begin if (RxLen - I) >= ... { 正确报文的长度 } then begin HandleRxData(I); end; end; end; // 发送下一查询报文,重发当前查询还是查询下一个则又全局变量 QuestState 决定。end;事实上这种机制的通讯根本不需要串行口的OnReceive事件的,因为你的内部缓冲器足够缓冲下所有的接收报文,你只要在时间到的时候一次读出来就可以了。
// 全局变量:var QuestState: Integer; // 查询状态字 RxBuf: array [0..255] of Byte;procedure TForm1.StartComm;begin SPCOMM1.Open; Timer1.Interval:= 300; // 假定300毫秒采集一次 Timer1.Enabled:= True;end;procedure TForm1.HandleRxData(DataPos: Integer);begin // 你的报文处理程序,报文起始字节在RxBuf[DataPos]end;procedure TForm1.Timer1Timer(Sender: TObject);var I, N: Integer;begin N:= SPCOMM1.Read(256 - RxLen, RxBuf); for I:= 0 to N - 1 do begin if RxBuf = ... { 你的报头同步字节 } then begin if (RxLen - I) >= ... { 正确报文的长度 } then begin HandleRxData(I); end; end; end; // 发送下一查询报文,重发当前查询还是查询下一个则又全局变量 QuestState 决定。end;事实上这种机制的通讯根本不需要串行口的OnReceive事件的,因为你的内部缓冲器足够缓冲下所有的接收报文,你只要在时间到的时候一次读出来就可以了。