spcomm使用疑问?帮顶有分! ( 积分: 100 )

  • 主题发起人 主题发起人 wuchunhua
  • 开始时间 开始时间
W

wuchunhua

Unregistered / Unconfirmed
GUEST, unregistred user!
通过网络虚拟串口对几个PLC进行数据采集,一个PLC占用一个串口,PLC每间隔1s左右就自动上发一组数据(采用电力部门的CDT规约循环发送),现在需要对不同串口发来的数据进行处理、显示和保存到数据库中。以下是我程序中的一些代码:
//创建SPCOMM控件监听串口
for i:=0 to recordcount -1do
begin
//一些其他处理
freccomm:=TComm.Create(self);
FRecComm.CommName :='COM'+FComminfo[i,2] ;
freccomm.ReadIntervalTimeout :=readtime;
freccomm.BaudRate :=strtoInt(fcomminfo[i,3]);
freccomm.OnReceiveData :=comm1.OnReceiveData ;
try
freccomm.StartComm ;
except
application.MessageBox ('直流屏监听串口打开失败,请检查串口是否被占用!','错误提示',MB_iconwarning or MB_OK);
freccomm.StopComm;
continue ;
end;
next;
application.ProcessMessages ;
end;
//数据接收触发事件 Comm1ReceiveData
procedure Tfrmzlpxx.Comm1ReceiveData(Sender: TObject;
Buffer: Pointer;
BufferLength: Word);
var
i,icount:integer;
CommRecBuf:array of byte ;
begin
//进入临界
EnterCriticalSection(cs);
setlength(CommRecBuf,BufferLength) ;
setlength(FCommDataBuf,1) ;
Move(Buffer^,CommRecBuf[0],BufferLength);
CommName:=(sender as TComm).CommName;
(sender as TComm).StopComm ;
for i:=low(FRecComm) to High(FRecComm)do
begin
if 'COM'+FComminfo[i,2] =CommName then
begin
if (FComminfo[i,4] = 'GZDW31') or (FComminfo[i,4] = 'GZDW32') then
begin
//校验成功,保存数据及填充数据;失败则跳出循环,离开临界
if FillGZW31Data(CommRecBuf,i) then
FillGZDW31Data(i);
end
else
if (FComminfo[i,4] = 'GZDW41') or (FComminfo[i,4] = 'GZDW42') then
FillGZW41Data(CommRecBuf,i);
Break;
end;
end;
(sender as TComm).startcomm ;
//离开临界
LeaveCriticalSection(cs);
end;

//上面的程序总存在不同的问题,请大家给点意见
 
通过网络虚拟串口对几个PLC进行数据采集,一个PLC占用一个串口,PLC每间隔1s左右就自动上发一组数据(采用电力部门的CDT规约循环发送),现在需要对不同串口发来的数据进行处理、显示和保存到数据库中。以下是我程序中的一些代码:
//创建SPCOMM控件监听串口
for i:=0 to recordcount -1do
begin
//一些其他处理
freccomm:=TComm.Create(self);
FRecComm.CommName :='COM'+FComminfo[i,2] ;
freccomm.ReadIntervalTimeout :=readtime;
freccomm.BaudRate :=strtoInt(fcomminfo[i,3]);
freccomm.OnReceiveData :=comm1.OnReceiveData ;
try
freccomm.StartComm ;
except
application.MessageBox ('直流屏监听串口打开失败,请检查串口是否被占用!','错误提示',MB_iconwarning or MB_OK);
freccomm.StopComm;
continue ;
end;
next;
application.ProcessMessages ;
end;
//数据接收触发事件 Comm1ReceiveData
procedure Tfrmzlpxx.Comm1ReceiveData(Sender: TObject;
Buffer: Pointer;
BufferLength: Word);
var
i,icount:integer;
CommRecBuf:array of byte ;
begin
//进入临界
EnterCriticalSection(cs);
setlength(CommRecBuf,BufferLength) ;
setlength(FCommDataBuf,1) ;
Move(Buffer^,CommRecBuf[0],BufferLength);
CommName:=(sender as TComm).CommName;
(sender as TComm).StopComm ;
for i:=low(FRecComm) to High(FRecComm)do
begin
if 'COM'+FComminfo[i,2] =CommName then
begin
if (FComminfo[i,4] = 'GZDW31') or (FComminfo[i,4] = 'GZDW32') then
begin
//校验成功,保存数据及填充数据;失败则跳出循环,离开临界
if FillGZW31Data(CommRecBuf,i) then
FillGZDW31Data(i);
end
else
if (FComminfo[i,4] = 'GZDW41') or (FComminfo[i,4] = 'GZDW42') then
FillGZW41Data(CommRecBuf,i);
Break;
end;
end;
(sender as TComm).startcomm ;
//离开临界
LeaveCriticalSection(cs);
end;

//上面的程序总存在不同的问题,请大家给点意见
 
你把SPComm控件的XonXoff,DTS,DTR等流控设置全关掉试试,或者依据你的硬件能力来设置流控。或者试一下CPort这个控件。我在一个程序上(通过嵌入式EC所做的串口刷BIOS),CPort表现比SPcomm要好。
 
顶一下,让更多人看到~
 
不会没有人知道吧!!!
 
顶一下,让更多人看到~
 
uuuuuuuuuuuuuuuuuuuuuuuuuuuup
 
有什么问题呢?说说看啊。
数据接收需要一定的时间,否则数据接收不全,会丢数据,看看属性设置
 
请把问题说得具体些.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
532
import
I
I
回复
0
查看
658
import
I
后退
顶部