一个关于MSCOMM的问题 一个字‘急’!送我所有的分。(100分)

  • 主题发起人 主题发起人 ghtghtmalone
  • 开始时间 开始时间
G

ghtghtmalone

Unregistered / Unconfirmed
GUEST, unregistred user!
问题:我从串口发送十六进制串
'3c 0e 01 71 13 90 58 15 08 68 00 00 d1 a8 bd 24 0c 0d'
但我收到的却是十六进制串
'3c 0e 01 71 13 90 58 15 08 68 00 00 d1 a8 3f 0c 0d'
'bd 24'变成了 '3f'

补充说明:如果用串口调试助手测试却发现结果正确。
部分代码如下:
函数说明:
Get_BccEnd(KeyStr):取得串的异或值和结束位'0d' 即得到串:
'3c 0e 01 71 13 90 58 15 08 68 00 00 d1 a8 bd 24 0c 0d' ;
Rf_Key_Down():向串口发送串:
'3c 0e 01 71 13 90 58 15 08 68 00 00 d1 a8 bd 24 0c 0d' ;


procedure TFrm_Key_Down.BTn_Load_KeyClick(Sender: TObject);
Var
iPOrt_RetState:integer;
KeyStr:Widestring;
Begin
Edit1.text:='139058150868';
KeyStr:='3c0e0171'+Edit1.Text+'0000'+'d1a8bd24';
Keystr:=get_BccEnd(Keystr);
iPOrt_RetState:=Rf_Key_Down(amsComm[Int_Com],keyStr);
End;



Function Get_BccEnd(BccStr:String):String;
Var
Xor_Int,i:Integer;
Bcc_Bit:String;
Begin
Xor_Int:=HexToStr(Copy(BccStr,1,2)) Xor HexToStr(Copy(BccStr,3,2));
fOR I:=3 TO Trunc(length(BccStr)/2) DO
Xor_Int:=xor_Int xor HexToStr(Copy(BccStr,2*i-1,2));
Bcc_Bit:=Inttohex(Xor_int,2);
If Length(Bcc_Bit)=1 Then
Bcc_Bit:='0'+Bcc_Bit;
Result:=BccStr+Bcc_Bit+'0D';
End;

Function Rf_Key_Down(MsComm:TMsComm;Var keyStr:Widestring):Integer;
Var
iPOrt_RetState,i:integer;
Hstr:string;
Begin
CurMSComm:=MSComm;
Hstr:=KeyStr;
For i:=1 to trunc((length(Hstr))/2) Do
Begin
Query_Card:=Chr(StrToIntDef('$'+Copy(HStr,i*2-1,2),10));
End;
CurMSComm.Output:=Query_Card[1]+Query_Card[2]+Query_Card[3]+Query_Card[4]+Query_Card[5]+Query_Card[6]+Query_Card[7]+Query_Card[8]+Query_Card[9]+Query_Card[10]+Query_Card[11]+Query_Card[12]+Query_Card[13]+Query_Card[14]+Query_Card[15]+Query_Card[16]+Query_Card[17]+Query_Card[18];
sleep(100);
End;

请问为什么会出现这种情况?如何解决!谢谢!欢迎各位提出意见和建议。
 
检查mscomm的属性。。。其中有一个说的是碰到类似某个value后,就用什么代替。。

你看看。。。mscomm我没用过。。。所以是猜想。。。因为spcomm有,我用过。
 
另外如果用modem做目标设备来测试的话, 发送给它的东西中如果有符合它的命令字的东西
则作为它命令来执行, 并将命令字过滤掉, 等它反馈回来后的东西, 凡被作为命令的东西
就被改变.
例如: "A/" "0/"等, 你虽然用16进制, 但是modem实际做ASCII理解

显然, 串口调试助手, 或者用改制的COMM调试线, 就没有这个弊病.
 
后退
顶部