请教串口通信中数据接收的问题
使用MOXA的PCOMM带的动态链接库编程,其中读串口函数定义如下
function sio_read(port: Longint; buf: PChar; len: Longint): Longint;
接收代码放在一个进程中,为MOXA例程,代码大意如下:
var
m_buf:array[0..511] of byte;
procedure TREADTHD.Execute;
begin
while not ComExit do
begin
Sleep(10);
Len:=sio_read(2,@m_buf,511);
a:=Len;
if (Len>0) then
begin
m_buf[Len]:=Char(0);
Synchronize(ShowData);
end;
end;
end;
procedure TREADTHD.ShowData;
var
Lend:LongInt;
begin
Lend:=Length(MainForm.Memo2.Text);
if (Lend>25000) then
begin
MainForm.Memo2.Text:=string(m_buf);
Exit;
end;
MainForm.Memo2.SelStart:=Lend;
MainForm.Memo2.SelLength:=0;
MainForm.Memo2.SelText:=String(m_buf);
MainForm.Edit2.Text:=inttostr(strlen(m_buf));
end;
问题为:1.接收数据时,用串口阿秀发字符串,多次发送数据MEMO能正常显示接收到的数
据,而EDIT则在发送字符>7个时,接收到的数据不正常,多次发送的结果时有
无,百思不得其解,请各位大虾答疑,谢谢。
2.用串口阿秀发送十六进制数据时,以上代码不能接收数据,改用以下代码可以
接收十六进制。
但小弟的问题在于不能找到一个方法将接收到的数据变为'000ma'或'00 00 00
4A'之类的数据用于进行判断接收到的数据进而下发相应的指令代码。小弟的
问题1也如此,EDIT主要用途就是整合接收到的数据进行逻辑比较判断。
或许串口通信接收的数据处理方法另有其他路途,若各位大虾有知,请一并
告之,谢谢!
var
s:array[0..15] of char;
n:integer;
begin
for i:=0 to 9 do
s[i]:=chr(48+i);
for i:=10 to 15 do
s[i]:=chr(55+i);
for i:=1 to Len do
begin
n:=ord(m_buf[i]);
MainForm.Memo1.Lines.Add(s[n div 16]+s[n mod 16]);
end;
MainForm.Memo1.Refresh;
end;