为何我用SPCOM取的数据重复出现了很多遍,且取数很慢,差不多2秒才取一次?急(50分)

Z

ztony

Unregistered / Unconfirmed
GUEST, unregistred user!
例:000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0000=40.0
object Comm1: TComm
CommName = 'COM1'
BaudRate = 1200
ParityCheck = False
Outx_CtsFlow = False
Outx_DsrFlow = False
DtrControl = DtrEnable
DsrSensitivity = False
TxContinueOnXoff = True
Outx_XonXoffFlow = False
Inx_XonXoffFlow = False
ReplaceWhenParityError = False
IgnoreNullChar = False
RtsControl = RtsEnable
XonLimit = 500
XoffLimit = 500
ByteSize = _8
Parity = None
StopBits = _1
XonChar = #17
XoffChar = #19
ReplacedChar = #0
ReadIntervalTimeout = 500
ReadTotalTimeoutMultiplier = 0
ReadTotalTimeoutConstant = 0
WriteTotalTimeoutMultiplier = 0
WriteTotalTimeoutConstant = 0
OnReceiveData = Comm1ReceiveData
Left = 144
Top = 65528
end
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
//-0.34
//43.000-=
var
tmpArray:array[0..4096] of Byte;
ArraySize,i: DWORD;
Count:DWORD;
tmpStr:string;
pStr:pChar;
begin

If Check1.Checked then
begin
pStr:=Buffer;
tmpStr:=string(pStr);
Dec(PStr);
For i:=0 to Length(tmpStr)-1 do
begin
inc(PStr);
tmpArray:=Byte(PSTR^);
Memo2.Lines.Add(IntToHEX(Ord(tmpArray),2));
end;
exit;
End;
setlength(tmpstr, BufferLength);
Move(Buffer^,PChar(tmpstr)^,BufferLength);

if CheckBox1.checked then
tmpstr:=ReverseString(tmpstr);


if (pos('=',tmpstr)>0) and checkbox2.Checked then
BEGIN
IF CHECKBOX4.Checked THEN
tmpstr:=COPY(tmpstr,5,MaxInt);
tmpstr:=LeftStr(tmpstr,pos('=',tmpstr)-1);
END;
Memo2.Lines.Add(tmpstr);
{ pStr:=Buffer;
memo2.Lines.Add(pStr);}
end;
 
不要轻易改控件设置,比如ReadIntervalTimeout默认为100,你是500
 
BaudRate = 1200,波特率设的这么低,速度当然慢了
 
dey-999:ReadIntervalTimeout为100 OR 500 都慢,且接收一大堆重复的如题
lxw5214:那个电子秤本身的波特为1200,改为其它的为乱码!
 
电子秤应该是一个应答通讯模式,还是主动发送模式,如果是主动发送的频率是多少?
如果是主动发送,发送速度过快的话SPCom就来不及了。因为ReadIntervalTimeout这个属性的意思是指多少毫秒之内串口没有接收到任何数据触发ReceiveData方法。在这个指定的时间内只要有数据,都不会触发ReceiveData。你可以根据传输的速度去算ReadIntervalTimeout的值。比如发送速度是100次/秒。则每隔10毫秒串口就会接收到一侦(注意是一侦),再扣除通讯本身所需要的时间(这个时间和侦长度,波特率,你的电子秤,操作系统都有关系),可能第一侦最后一个字节和第二侦第一个字节之间只有几毫秒的间隔。
 
现在想开发一个加油站程序,但是不知道怎么读到加油机的加油数据?
加油机支持485接口!
希望有经验的大哥帮个忙!
谢谢啦!!
有参考代码的最好!
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3472894
 
我觉得是你的电子秤设置的原因。你的电子秤设置的是不停发送数据。当然会出现重复了。你应该把秤设置成稳定输出,这样在秤重稳定后才会有数据发出,你接收的数据就只有一组。仔细看看电子秤的资料吧。
我写过很多电子秤的程序,都是有这样不同的发送数据的方式。需要你自己根据应用进行选择设置。
 
顶部