用delphi写的mscomm,MSComm.InBufferSize := 1024;每次oncomm时,将接收的数据拼接在FStr变量中,然后判断Fstr中是否有结束符,没有继续,有则清空Fstr; procedure .mscm_ABX60Comm(Sender: TObject); var s: string; InputLen: Integer; begin if mscm_ABX60.CommEvent = 2 then //接收数据时 begin begin InputLen := mscm_ABX60.InBufferCount; //返回输入缓冲区内等待读取的字节数 if InputLen >= 1 then //RThreshold=1 begin s := ''; s := mscm_ABX60.Input; Fstr := Fstr + s; if Pos(#03,s) <> 0 then begin jxABX60(Fstr); //解析数据 syslog.Msg := fstr; //保存日志 sxJyjg; //结果刷新 mscm_ABX60.InBufferCount := 0; Fstr := ''; end; end; end; end; end;
'定义一个数据缓冲池,这里用Collection对象作缓冲池,你也可以用数组或其他东西 Dim coldata As Collection
Private Sub Form_Load() '初始化数据缓冲池 Set coldata = New Collection
'初始化并打开串口 MSComm1.CommPort = 1 MSComm1.Settings = "9600, n, 8, 1" MSComm1.RThreshold = 1 '设置为每收到一个字节数据触发一次Oncomm事件 MSComm1.InputMode = comInputModeBinary MSComm1.PortOpen = True End Sub
Private Sub MSComm1_OnComm() Dim yy As Long Select Case MSComm1.CommEvent Case comEvReceive Dim xx() As Byte xx = MSComm1.Input For yy = 0 To UBound(xx) '把串口接收到的所有数据都先保存到数据缓冲池暂时不去处理,因为无法保证数据已经接收完整 coldata.Add xx(yy) Next yy End Select End Sub
'用Timer控件循环对接收到的数据进行处理 Private Sub Timer1_Timer() if coldata.count<6 then exit sub '收到的数据不足6个
Dim xx As Long For xx = 1 To coldata.Count '遍历所有串口收到的数据 if coldata.item(1)<>&H3F then coldata.remove(1) '收到的第一个字节不是3F,丢弃 exit for end if
'…… 代码略,按照通讯协议对串口收到的数据进行分析和处理 '…… 处理完成及时把已处理的数据从缓冲池中移除 Next xx End SubN年以前写的一段代码,可以参考下
接收的数据存数组(数据可用定时器访问处理),接收的指令立即执行。
在收到数据后先判断分类,不是命令响应的作为数据处理,是命令响应的作为命令反馈处理。
procedure .mscm_ABX60Comm(Sender: TObject);
var
s: string;
InputLen: Integer;
begin
if mscm_ABX60.CommEvent = 2 then //接收数据时
begin
begin
InputLen := mscm_ABX60.InBufferCount; //返回输入缓冲区内等待读取的字节数
if InputLen >= 1 then //RThreshold=1
begin
s := '';
s := mscm_ABX60.Input;
Fstr := Fstr + s;
if Pos(#03,s) <> 0 then
begin
jxABX60(Fstr); //解析数据
syslog.Msg := fstr; //保存日志
sxJyjg; //结果刷新
mscm_ABX60.InBufferCount := 0;
Fstr := '';
end;
end;
end;
end;
end;
'定义一个数据缓冲池,这里用Collection对象作缓冲池,你也可以用数组或其他东西
Dim coldata As Collection
Private Sub Form_Load()
'初始化数据缓冲池
Set coldata = New Collection
'初始化并打开串口
MSComm1.CommPort = 1
MSComm1.Settings = "9600, n, 8, 1"
MSComm1.RThreshold = 1 '设置为每收到一个字节数据触发一次Oncomm事件
MSComm1.InputMode = comInputModeBinary
MSComm1.PortOpen = True
End Sub
Private Sub MSComm1_OnComm()
Dim yy As Long
Select Case MSComm1.CommEvent
Case comEvReceive
Dim xx() As Byte
xx = MSComm1.Input
For yy = 0 To UBound(xx) '把串口接收到的所有数据都先保存到数据缓冲池暂时不去处理,因为无法保证数据已经接收完整
coldata.Add xx(yy)
Next yy
End Select
End Sub
'用Timer控件循环对接收到的数据进行处理
Private Sub Timer1_Timer()
if coldata.count<6 then exit sub '收到的数据不足6个
Dim xx As Long
For xx = 1 To coldata.Count '遍历所有串口收到的数据
if coldata.item(1)<>&H3F then
coldata.remove(1) '收到的第一个字节不是3F,丢弃
exit for
end if
'…… 代码略,按照通讯协议对串口收到的数据进行分析和处理
'…… 处理完成及时把已处理的数据从缓冲池中移除
Next xx
End SubN年以前写的一段代码,可以参考下