谁见过这样的问题!!关于SPCOMM控件做下位机的通信,求教!!!(100分)

  • 主题发起人 主题发起人 蚂蚁根
  • 开始时间 开始时间

蚂蚁根

Unregistered / Unconfirmed
GUEST, unregistred user!
我用SPCOMM控件做下位机的通信监控软件,分割字符原理是这样的,将接收到的字符串通过function SplitString(Source, Deli: string )存入StringList里,然后再一一读取StringList[0..7]到各个edit
以前接收到的字符串str,用showmessage()来观察str是一整串,现在却分成两个message窗口来显示,这就使function SplitString只能接受到第一个message的窗口的数据分割存入StringList,而丢失了第二个message窗口的数据,(注:以前接收好好的,没有这个问题,近几天出现了这个问题,而且是有时可以完全接收,有时却又出现丢失)
初步,换了一个通信控件还是出现以前的情况,看来不是接收数据的问题,后判断是电脑的问题,换了台电脑问题依旧,
错误提示:
编译运行都成功,但接收数据是不稳定,用showmessage()来观察str,有时是一个message窗口,有时却又是2、3个窗口,导致接收数据丢失,引起程序出错:“raised exception class EStringListerror with message "list index out of bound(4)"
请大家帮忙解决一下,谢谢,已经好几天,郁闷!!
部分源代码如下:
function SplitString(Source, Deli: string ): TStringList;stdcall; //分割字符串函数

var

EndOfCurrentString: byte;
StringList:TStringList;
begin
StringList:=TStringList.Create;
while Pos(Deli, Source)>0 do
begin

EndOfCurrentString := Pos(Deli, Source);
StringList.add(Copy(Source, 1, EndOfCurrentString - 1));
Source := Copy(Source, EndOfCurrentString + length(Deli), length(Source) - EndOfCurrentString);
end;
Result := StringList;
StringList.Add(source);
end;


procedure TMain.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
s,s1 : string;
sp1,sp2 : integer;
f1 : textfile;
type
iArr = ^integer;
var
RevP : array [1..4096] of byte;
i : integer;
CommRevStr : String;

begin
SetLength(CommRevStr,BufferLength); //下位机数据的接收
Move(IArr(buffer)^,Revp,bufferLength);
For i:=1 to BufferLength do
begin
CommrevStr := Char(Revp);
end;

s := StrToHexStr(CommrevStr);
showmessage(S);
//*****************************************************************
//数字窗口的接收,数据的分割

if (pos('28',s)<>0) then
begin
s := hexstrtostr(s);
sp1 := pos('(',s);
s := copy(s,sp1+1,length(s)-sp1);
ts1 := SplitString(s,' ');
Edit1.text := ts1[0];//输入
iAngularGauge5.Position := strtofloat(TS1[0]);
chart1.Series[0].AddY(strtofloat(Edit1.text),formatdatetime('hh:mm:ss',now),clred);//chart的曲线图使用
edit4.text := ts1[2];//输出
iAngularGauge6.Position := strtofloat(ts1[2]);
chart2.Series[0].AddY(strtofloat(Edit4.text),formatdatetime('hh:mm:ss',now),clred);//chart的曲线图使用
edit7.text := ts1[4];//平率
iAngularGauge3.Position := strtofloat(TS1[4]);
if (pos('000',ts1[3]) = 1) then
begin
edit13.text := '0.0';//负载
iledbar1.position := 0;
end else
begin
edit13.text := Zeroclearing(ts1[3])+'.'+'0';
iledbar1.position := strtofloat(Edit13.text);
end;
edit16.text := ts1[6];//温度C
iAngularGauge4.Position := strtofloat(TS1[6]);
edit20.text := Floattostr(9/5*StrToFloat(ts1[6])+32);//温度F
//showmessage(ts1[5]);
 
可以在程序里弄一个字符缓冲区,只要是接收到数据都先放到缓冲区里,看缓冲区里的数据够你的一个窗口,就读出来分析,这样应该不会错了
 
回复wyz1738:
问题是随着我发的命令不同,下位机回复的数据长度也是不同,无法设置缓冲区大小呀,而且要求数据的实时,不能拖太久,哪位还有什么好的解决办法?谢谢
 
用多线程序和消息试试
 
应该用多线程才能解决
 
多人接受答案了。
 
后退
顶部