(送分)串口通讯小问题 ( 积分: 100 )

  • 主题发起人 主题发起人 flyingwater007
  • 开始时间 开始时间
F

flyingwater007

Unregistered / Unconfirmed
GUEST, unregistred user!
一个使用串口来实现电话计费的小程序,程序对交换机送出话单处理如下:
procedure TBillForm.MsgCommProcess(Var Message: TMessage);
var
Coms: TComstat;
cbNum, ReadNumber, lpErrors: DWord;
Read_Buffer: array[0..1023] of Char;
begin
if ClearCommError(Comm_File, lpErrors, @Coms) then
begin
cbNum := Coms.cbInQue;
ReadFile(Comm_File, Read_Buffer, cbNum, ReadNumber, Lp_OverLap);
MsgDisplay(Read_Buffer, ReadNumber);//计费过程
SetEvent(Post_Event);
end;
end;
其中MsgDisplay定义为procedure TBillForm.MsgDisplay(Str:PChar; Len:DWord);
以前计费没任何问题,这次一个鬼华为的交换机送出的话单read_ buffer中含有3个#0字符(如#0,‘,’,‘2’,‘1’,‘7’,‘8’,#0......#13,#10,#0)
用MsgDisplay过程之后,read_buffer变为,2178,char转换pchar时系统会默认#0是结束,结果只拷贝了#0前面的部分字符
问:1、read_buffer里的#0字符安全的去掉(我试过在转换前把#0字符置换成char(9)等
之类,好象不行)
2、有没有方法可以自己指定结束字符,象上面指定#10为结束字符而#0无效的话我就可以
得到完整的话单

求哪位大哥大姐指点则个
 
一个使用串口来实现电话计费的小程序,程序对交换机送出话单处理如下:
procedure TBillForm.MsgCommProcess(Var Message: TMessage);
var
Coms: TComstat;
cbNum, ReadNumber, lpErrors: DWord;
Read_Buffer: array[0..1023] of Char;
begin
if ClearCommError(Comm_File, lpErrors, @Coms) then
begin
cbNum := Coms.cbInQue;
ReadFile(Comm_File, Read_Buffer, cbNum, ReadNumber, Lp_OverLap);
MsgDisplay(Read_Buffer, ReadNumber);//计费过程
SetEvent(Post_Event);
end;
end;
其中MsgDisplay定义为procedure TBillForm.MsgDisplay(Str:PChar; Len:DWord);
以前计费没任何问题,这次一个鬼华为的交换机送出的话单read_ buffer中含有3个#0字符(如#0,‘,’,‘2’,‘1’,‘7’,‘8’,#0......#13,#10,#0)
用MsgDisplay过程之后,read_buffer变为,2178,char转换pchar时系统会默认#0是结束,结果只拷贝了#0前面的部分字符
问:1、read_buffer里的#0字符安全的去掉(我试过在转换前把#0字符置换成char(9)等
之类,好象不行)
2、有没有方法可以自己指定结束字符,象上面指定#10为结束字符而#0无效的话我就可以
得到完整的话单

求哪位大哥大姐指点则个
 
1、把#0转换成其它字符不是最好的方案
2、在 MsgDisplay中你要根据ReadNumber(收到的字符程度)来处理你的字符数组
 
楼上说得有理,但我是处理了#0以后再送
 
取长号话单问题解决,至于短号为什么会出现那样的问题,还是不解,有机会再研究,发分
 
后退
顶部