串口接收信息如何才能接收到汉字信息,急急急!(200分)

  • 主题发起人 主题发起人 taiy
  • 开始时间 开始时间
T

taiy

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个串口通信器,采用一个类似于传呼装置的无限接收器接收信息,接受后在RichEdit上显示的却是EE 01 EE 01 EE 01 EE 01 EE 01 ,而不是我要接收的正确的汉字信息,如何才能接收到我想要的正确的信息呢?请各位高手指点,问题实在是很急!
我用的是TurboPower Async Professional V4.06 中的 Tadport控件,接收信息代码如下:
//接收数据
procedure TMainForm.ComPort1Trigger(CP: TObject; Msg, TriggerHandle,
Data: Word);
var
I : Word;
C : Char;
s : String;
begin
try
case Msg of
APW_TRIGGERDATA :
;
APW_TRIGGERAVAIL :
begin
s:='';
for I:= 1 to Data do
begin
C := ComPort1.GetChar;
if CB_hexGet.Checked then
begin
s:=s+inttohex(byte(c),2) ;
end else
s:=s+c;
inc(JSdate);
end;
StatusBar.Panels.Items[2].Text:='接收:'+inttostr(JSdate);

Diff(s);//在RichEdit中显示字符串
end;
APW_TRIGGERTIMER :

;
end;
except
end;
end;

恳请您的帮助
 
先按十六进制接收
然后转为字符串
 
if CB_hexGet.Checked then
begin
s:=s+inttohex(byte(c),2) ;
end else
s:=s+c;

checked为false的时候显示的也都是16进制的数么?
那你发送的时候是怎么发的?
 
Siva
能说的具体一点吗
 
来如风

我只管接收,checked为false的时候显示的是乱码
 
中文應該用widestring...雙字節的
 
如果这样的话也许是他发的问题吧,

比如说一个字符串'sdfsd汉字',他要是按顺序一个字符一个字符发,
按你的代码是不会出错的,不用考虑把他转为汉字的形式的,

 
把c的类型该为widechar就可以了。
铁定!其他不用改。
 
另外说一下你程序中可能存在的问题
s : String;//如果接收到的字符中有#0,那该类型就把和面的所有东西都扔了。
最好该为pchar,或者pwidechar类型的。
^_^
 
按照你的程序checked的时候显示16进制数据,非checked的时候显示汉字。

字符按字节类型划分,有三种。
TMbcsByteType = (mbSingleByte, mbLeadByte, mbTrailByte);
mbSingleByte为单字节字符。
mbLeadByte为双字节字符的第一个字符。
mbTrailByte为双字节字符的第二个字符。
可以用函数
function ByteType(const S: string; Index: Integer): TMbcsByteType;
来判断字符的类型。

结合你的代码考虑一下:
(1)会不会有发送的拆解汉字顺序和接收的组合汉字顺序不一致的问题.
(2)会不会有丢掉汉字某个字节的问题。
 
EE 01
01 EE
都不是什么汉字的字节信息。
先查查发送程序中的bug吧,保证正确后,再来查结果的正确。
 
To : 雪鹰
我知道问题的所在了,接收到的EE 01其实是接收器想我发送的握手请求,可我不知道该如何回复它啊,换句话说我响应该请求,该给它发回去什么信息呢?
 
To : Highpeak
我把 C 的类型改为widechar也是不可以的,请看一下我的回复
 
我用的是西门子3568I,在超级终端里可以执行AT指令,比如可以读取手机短信,但发送不了短信息,提示ERROR,为何呢,谁能告诉我在超级终端里发送短信息的详细步骤?
 
后退
顶部