十六进制数据发送会出现丢数现象,这是怎么回事啊?(在线等)(50分)

  • 主题发起人 主题发起人 雪球
  • 开始时间 开始时间

雪球

Unregistered / Unconfirmed
GUEST, unregistred user!
我使用mscomm控件进行串口的操作,选择inputmode为1 - comInputModeBinary,发送十六进制如下:
Function outbox(const str:string):string; //输出数据打包 (固值输出,
//输出参数和读数据命令)
var
datastr:array of string;
n:byte;
i,j:integer;
instr:string;
outstr:string;
begin
n:=length(str);
n:=n div 2;
setlength(datastr,n+3);
datastr[0]:='FF'; //起始符
datastr[1]:='FE'; //设备地址
datastr[2]:='FE';
j:=0;
for i:=3 to n+2 do
begin
datastr:=copy(str,j*2+1,2);
j:=j+1;
end;
//datastr[n+3]:='00';
outstr:='';
for i:=0 to n+2 do
begin
[red]outstr:=outstr+chr(strtoint('$'+datastr));[/red]
end;
result:=outstr;
end;
发送数据时数据丢失,会出现这样的问题
发送:FF FE FE 04 04 00 2C 06 08 30 12 45 00 00 00 00 01 00 01 00 00 00 00 01 01 00 01 01 00 01 01 01 01 01 01 01 01 01 01 01 01 00 01 00 01 00 01 03 E8 AF 00
这组数据接收是正确的,但是如果发送:FF FE FE 04 04 00 2C 06 08 30 12 46 00 00 00 00 01 00 01 00 00 00 00 01 01 00 01 01 00 01 01 01 01 01 01 01 01 01 01 01 01 00 01 03 E8 00 01 00 01 A3 00,接收就是错误的,接收到的是FF FE FE 04 04 00 2C 06 08 30 12 46 00 00 00 00 01 00 01 00 00 00 00 01 01 00 01 01 00 01 01 01 01 01 01 01 01 01 01 01 01 00 01 03 00 01 00 01 00(E8 和A3数据丢失),这是怎么回事啊?是串口发送数据有问题吗?
 
你看看是不是有流控设置?
 
1、你确信生成要发送的数据包正确吧?都生成了你写出来这一组?
2、每次都发生的错误都一致吗?都是E8和A3丢失?
 
回复zywcd:是的,生成的数据包是正确的,在E8和A3处是#$E8和#$A3,这应该是没有错误的 。
回复jamcky:什么叫流控制啊?我也觉得可能用mscomm控件发送数据时应该有一个控制手段,而不是直接就发送出去,可是我又不知道怎么去控制
 
看了一下,好象也没有流控设置,很久没用过了,用spcomm吧,控制比较自由,网上有下载,spcomm 2.5的。
 
每次发生错误一致吗?
 
回复zywcd:是的,每次都是一样的
 
那我建议你换一个控件测试。
使用spcomm。
 
spcomm的使用方法与mscomm类似吗?怎么下载使用阿?mscomm我用的是VB中的,那个spcomm下载下来也可以类似的使用吗?
 
下载一个串口测试的程序
看看你还丢失数据吗?
我以前就这么干过 [:D]
结合楼上的说的 如果你写的CODE没有问题
你也可以找找是不是下位机返回数据有问题
 
spcomm和mscomm的使用类似。你只要更换发送命令和接收部分就好。其他不需要改动。
 
To:zywcd,我载了一个spcomm,里面的文件我应该把它放在系统盘的system32里面,还是放在delphi相应的目录下面
 
没有关系,但要装成控件,然后指定路径就行了
还有就是spcomm的属性设置一定要注意
 
怎么装成控件啊?我载的那个只有SPCOMM,SPCOMM.DCR,SPCOMM.DCU三个文件,我怎么才能把它装成控件啊?
 
我发一个给你吧,email
object Comm2: TComm
CommName = 'COM1'
BaudRate = 115200
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 = 100
ReadTotalTimeoutMultiplier = 0
ReadTotalTimeoutConstant = 0
WriteTotalTimeoutMultiplier = 0
WriteTotalTimeoutConstant = 0
OnReceiveData = Comm2ReceiveData
Left = 336
Top = 176
end
上面是它的属性设置,
 
已经装上了,不知道能不能给个简短的示例程序,谢谢
以前用mscomm时,用RThreshold值的不同来判定接收到的数据的不同类型,在spcomm中有没有类似的功能阿?
 
网上到处都是啊
接收
procedure TControlForm.Comm2ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
i:integer;
sTmp,strEnd:String;
begin
strView:='' ;
Move(buffer^,pchar(@rbuf)^,BufferLength);
if BufferLength>0 then bRecev:=True;
for i:=0 to BufferLength-1 do
strView:=strView+ inttohex(rbuf,2)+'' ;
strEnd:=RightStr(strView,4);
//strView:='接收到请求:'+ strView;
//mReceive.lines.add(strView);
//mReceive.lines.add('');
//区分返回的数据
//if BufferLength<1024 then
if strEnd<>'FFFF' then
begin
if CheckDataErr(strView) then
begin
sTmp:=GetReceiveData(strView);
ManagerData(TransReceData(strView),sTmp);//此函数还应修改
end;
end
else
begin
Application.MessageBox('非法数据','监控台',MB_OK+MB_ICONERROR);
end;
end;
发送
procedure TSendThread.SendData;
var
I,n:Integer;
CommFlag:Boolean;
strView:String;
label EndLabel;
begin
strView:='';
CommFlag:=True;
//str:=GetSendOrderStr;
if spOrder='' then exit;
n:=length(spOrder) div 2;
for i:=1 to n do//
begin
sbuf:=byte(StrToInt('$'+copy(spOrder,2*i-1,2)));
if not spComm.WriteCommData(@sbuf,1) then
begin
CommFlag:=False;
Break;
end;
//发送时字节间的延时
Sleep(2);
strView:=strView+ IntToHex(sbuf,2)+'' ;
end;
{strView:='已经成功发送命令:'+ strView;
mSend.Lines.Add(strView);
mSend.lines.add(''); }
spMemo.Lines.Add('已经成功发送对通道:'+spPara+#10+#13+'的测试命令:'+spText);
if not CommFlag then
begin
MessageDlg('发送失败 !' ,mtError,[mbYes],0);
end;
sleep(1500);
Terminate;
// sleep(1500);
end;
 
Move(buffer^,pchar(@rbuf)^,BufferLength);
在这个接收里面,rbuf是什么样的数据类型阿?是array of byte吗?
spcomm是怎么接收十六进制数的?楼上给的这个例子似乎就是吧
 
rBuf:array[0..4096] of byte;
 
如果我要像mscomm中那样用接收阈值来区分的话,在spcomm中就是用bufferlength来区分对吗?spcomm中没有设定阈值这一说吧
 

Similar threads

后退
顶部