spcomm当出现多个串口时的数据接收异常
spcomm当出现多个串口时的数据接收错误?
服务器有6个串口,对应都有数据过来,故放置了6个SPCOMM控件,结果发现一个问题,那怕仅是打COM1端口,其它端口不打开,所以接收的数据与发送的数据完全不对,但只要把其余5个SPCOMM接收地了事件下面的接收代码全部去掉就可以正常的接收了,一放上去就不行了,就是乱码接收到的,具体代码如下:同时确认参数设置是没有问题的。
procedure TMainFrm.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
ch:char;
i:integer;
begin
BCallStr1:='';
BCallState:='';
BCallNo:='';
{move(buffer^,pchar((@rbuf)^),bufferlength);
for i:=0 to bufferlength-1 do
begin
BCallStr1:=BCallStr1+inttohex(ord(rbuf[i]),2); //16进位制按2位一组读出数据
end; }
for i:=0 to BufferLength-1 do
begin
ch:=(pchar(buffer)+i)^;
BCallStr1:=BCallStr1+ch;
end;
StatusBar1.Panels.Items[0].Text:=Bcallstr1;
BCallNo:=copy(BCallStr1,3,4);
BCallState:=copy(BCallStr1,1,2); //获取呼叫器工作状态标示
mainfrm.ComRevSendSMS;
end;
下面都是一样的
procedure TMainFrm.Comm2ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
begin
{ BCallStr2:='';
BCallState:='';
BCallNo:='';
move(buffer^,pchar((@rbuf)^),bufferlength);
for i:=0 to bufferlength-1 do
begin
BCallStr2:=BCallStr2+inttohex(ord(rbuf[i]),2); //16进位制按2位一组读出数据
end;
StatusBar1.Panels.Items[0].Text:=Bcallstr2;
BCallNo:=copy(BCallStr2,3,4);
BCallState:=copy(BCallStr2,1,2); //获取呼叫器工作状态标示
mainfrm.ComRevSendSMS; }
end;
procedure TMainFrm.Comm3ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
begin
{BCallStr3:='';
BCallState:='';
BCallNo:='';
move(buffer^,pchar((@rbuf)^),bufferlength);
for i:=0 to bufferlength-1 do
begin
BCallStr3:=BCallStr3+inttohex(ord(rbuf[i]),2); //16进位制按2位一组读出数据
end;
StatusBar1.Panels.Items[0].Text:=Bcallstr3;
BCallNo:=copy(BCallStr3,3,4);
BCallState:=copy(BCallStr3,1,2); //获取呼叫器工作状态标示
mainfrm.ComRevSendSMS; }
end;
procedure TMainFrm.Comm4ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
begin
{BCallStr4:='';
BCallState:='';
BCallNo:='';
move(buffer^,pchar((@rbuf)^),bufferlength);
for i:=0 to bufferlength-1 do
begin
BCallStr4:=BCallStr4+inttohex(ord(rbuf[i]),2); //16进位制按2位一组读出数据
end;
StatusBar1.Panels.Items[0].Text:=Bcallstr4;
BCallNo:=copy(BCallStr4,3,4);
BCallState:=copy(BCallStr4,1,2); //获取呼叫器工作状态标示
mainfrm.ComRevSendSMS; }
end;
procedure TMainFrm.Comm5ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
begin
{ BCallStr5:='';
BCallState:='';
BCallNo:='';
move(buffer^,pchar((@rbuf)^),bufferlength);
for i:=0 to bufferlength-1 do
begin
BCallStr5:=BCallStr5+inttohex(ord(rbuf[i]),2); //16进位制按2位一组读出数据
end;
StatusBar1.Panels.Items[0].Text:=Bcallstr5;
BCallNo:=copy(BCallStr5,3,4);
BCallState:=copy(BCallStr5,1,2); //获取呼叫器工作状态标示
mainfrm.ComRevSendSMS; }
end;
procedure TMainFrm.Comm6ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
begin
{ BCallStr6:='';
BCallState:='';
BCallNo:='';
move(buffer^,pchar((@rbuf)^),bufferlength);
for i:=0 to bufferlength-1 do
begin
BCallStr6:=BCallStr6+inttohex(ord(rbuf[i]),2); //16进位制按2位一组读出数据
end;
StatusBar1.Panels.Items[0].Text:=Bcallstr6;
BCallNo:=copy(BCallStr6,3,4);
服务器有6个串口,对应都有数据过来,故放置了6个SPCOMM控件,结果发现一个问题,那怕仅是打COM1端口,其它端口不打开,所以接收的数据与发送的数据完全不对,但只要把其余5个SPCOMM接收地了事件下面的接收代码全部去掉就可以正常的接收了,一放上去就不行了,就是乱码接收到的,具体代码如下:同时确认参数设置是没有问题的。
procedure TMainFrm.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
ch:char;
i:integer;
begin
BCallStr1:='';
BCallState:='';
BCallNo:='';
{move(buffer^,pchar((@rbuf)^),bufferlength);
for i:=0 to bufferlength-1 do
begin
BCallStr1:=BCallStr1+inttohex(ord(rbuf[i]),2); //16进位制按2位一组读出数据
end; }
for i:=0 to BufferLength-1 do
begin
ch:=(pchar(buffer)+i)^;
BCallStr1:=BCallStr1+ch;
end;
StatusBar1.Panels.Items[0].Text:=Bcallstr1;
BCallNo:=copy(BCallStr1,3,4);
BCallState:=copy(BCallStr1,1,2); //获取呼叫器工作状态标示
mainfrm.ComRevSendSMS;
end;
下面都是一样的
procedure TMainFrm.Comm2ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
begin
{ BCallStr2:='';
BCallState:='';
BCallNo:='';
move(buffer^,pchar((@rbuf)^),bufferlength);
for i:=0 to bufferlength-1 do
begin
BCallStr2:=BCallStr2+inttohex(ord(rbuf[i]),2); //16进位制按2位一组读出数据
end;
StatusBar1.Panels.Items[0].Text:=Bcallstr2;
BCallNo:=copy(BCallStr2,3,4);
BCallState:=copy(BCallStr2,1,2); //获取呼叫器工作状态标示
mainfrm.ComRevSendSMS; }
end;
procedure TMainFrm.Comm3ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
begin
{BCallStr3:='';
BCallState:='';
BCallNo:='';
move(buffer^,pchar((@rbuf)^),bufferlength);
for i:=0 to bufferlength-1 do
begin
BCallStr3:=BCallStr3+inttohex(ord(rbuf[i]),2); //16进位制按2位一组读出数据
end;
StatusBar1.Panels.Items[0].Text:=Bcallstr3;
BCallNo:=copy(BCallStr3,3,4);
BCallState:=copy(BCallStr3,1,2); //获取呼叫器工作状态标示
mainfrm.ComRevSendSMS; }
end;
procedure TMainFrm.Comm4ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
begin
{BCallStr4:='';
BCallState:='';
BCallNo:='';
move(buffer^,pchar((@rbuf)^),bufferlength);
for i:=0 to bufferlength-1 do
begin
BCallStr4:=BCallStr4+inttohex(ord(rbuf[i]),2); //16进位制按2位一组读出数据
end;
StatusBar1.Panels.Items[0].Text:=Bcallstr4;
BCallNo:=copy(BCallStr4,3,4);
BCallState:=copy(BCallStr4,1,2); //获取呼叫器工作状态标示
mainfrm.ComRevSendSMS; }
end;
procedure TMainFrm.Comm5ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
begin
{ BCallStr5:='';
BCallState:='';
BCallNo:='';
move(buffer^,pchar((@rbuf)^),bufferlength);
for i:=0 to bufferlength-1 do
begin
BCallStr5:=BCallStr5+inttohex(ord(rbuf[i]),2); //16进位制按2位一组读出数据
end;
StatusBar1.Panels.Items[0].Text:=Bcallstr5;
BCallNo:=copy(BCallStr5,3,4);
BCallState:=copy(BCallStr5,1,2); //获取呼叫器工作状态标示
mainfrm.ComRevSendSMS; }
end;
procedure TMainFrm.Comm6ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
begin
{ BCallStr6:='';
BCallState:='';
BCallNo:='';
move(buffer^,pchar((@rbuf)^),bufferlength);
for i:=0 to bufferlength-1 do
begin
BCallStr6:=BCallStr6+inttohex(ord(rbuf[i]),2); //16进位制按2位一组读出数据
end;
StatusBar1.Panels.Items[0].Text:=Bcallstr6;
BCallNo:=copy(BCallStr6,3,4);