串口数据过大过快会导致数据丢失吗? ( 积分: 100 )

  • 主题发起人 主题发起人 hnzxfboy
  • 开始时间 开始时间
H

hnzxfboy

Unregistered / Unconfirmed
GUEST, unregistred user!
我用TurboPower Async Professional4.06,下面是我的处理代码,其中DealComData(s)对串口数据的处理,包括数据库的操作等等,现在出现一个情况:当串口数据量过大过快时,有些数据会丢件,请问有经验的各位大大,怎么解决这个问题?
procedure TFrmMain.APROTrigger(CP: TObject; Msg, TriggerHandle,
Data: Word);
var
I : Word;
C : Char;
s : String;
begin
try
case Msg of
APW_TRIGGERDATA :
{got 'login', send response}
;
APW_TRIGGERAVAIL :
{extract and display/process the data}
begin
if JSComData=255 then
JSComData=0
else
inc(JSComData);
s[JSComData]:='';
for I:= 1 to Data do
begin
C := APRO.GetChar;
s:=s+inttohex(byte(c),2);
end;
StatusBar.Panels.Items[1].Text:='接收:'+S;
StatusBar.Panels.Items[3].Text:=s;
DealComData(s);
end;
APW_TRIGGERTIMER :
{timed out waiting for login prompt, handle error}
;
end;
except
end;
end;
 
我用TurboPower Async Professional4.06,下面是我的处理代码,其中DealComData(s)对串口数据的处理,包括数据库的操作等等,现在出现一个情况:当串口数据量过大过快时,有些数据会丢件,请问有经验的各位大大,怎么解决这个问题?
procedure TFrmMain.APROTrigger(CP: TObject; Msg, TriggerHandle,
Data: Word);
var
I : Word;
C : Char;
s : String;
begin
try
case Msg of
APW_TRIGGERDATA :
{got 'login', send response}
;
APW_TRIGGERAVAIL :
{extract and display/process the data}
begin
if JSComData=255 then
JSComData=0
else
inc(JSComData);
s[JSComData]:='';
for I:= 1 to Data do
begin
C := APRO.GetChar;
s:=s+inttohex(byte(c),2);
end;
StatusBar.Panels.Items[1].Text:='接收:'+S;
StatusBar.Panels.Items[3].Text:=s;
DealComData(s);
end;
APW_TRIGGERTIMER :
{timed out waiting for login prompt, handle error}
;
end;
except
end;
end;
 
是不是DealComData(s)中处理速度比较慢造成的问题,也就是说DealComData(s)中的局部变量被覆盖而导致的问题?
 
不是过大,还有过快的问题,通常使用串口传数据的时候都会把数据分成一个个的小包来传送,并且使用校验,xmodem,zmodem协议就是带校验的传输.
TurboPower Async Professional里面有包含了XMDOEM,ZMODEM的控件叫ApdProtocol,研究一下你会有收获的.
 
我的串口设置,没有校验位的
ComNum=2
Baud=4800
Parity=pNone
DataBits=8
StopBits=1
 
串口设置的校验和chenlili说的不是一回事[:(]
 
肯定是串口数据丢失?
 
你根据你的波特率算一下就知道每秒能处理多少字节了,如果过快的话肯定会丢失数据的
 
但别的串口测试软件显示是正常的,不过象串口精灵之类的不过是显示某一行,数据处理起来比较快,而我的函数里包括几十条SQL语句,比较慢
 
4800/8=600,每秒收发600个字节,不能一下子发太多
 
如果串口精灵得到的是正确的,你可以考虑先全部接受一次比较密集的数据,然后再处理。
 
后退
顶部