通过MSCOMM接收来自串口的数据的问题(0)

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

gdzscj

Unregistered / Unconfirmed
GUEST, unregistred user!
接到一个项目,第一次开发关于串口的程序。通过MSCOMM控件接收来自串口的电子秤数据。从超级终端程序试接收,得到这样的信息。)0 000000000000)0 000000000000)0 000000000000)0 000010000000)8 000030000000)8 000040000000)8 000050000000)8 000060000000)8 000060000000)0 000070000000)0 000070000000)0 000070000000)0 000070000000)0 000070000000)0 000070000000)0 000070000000)0 000060000000)8 000050000000)8 000040000000)8 000030000000)8 000020000000)8 000010000000)8 000000000000)0 000000000000)0 000000000000效果不错。于是用MSCOMM开发下面程序,procedure TForm1.FormCreate(Sender: TObject);
begin
if mscomm1.PortOpen then
mscomm1.PortOpen:=false;
mscomm1.CommPort:=1;
mscomm1.InBufferSize:=256;
mscomm1.OutBufferSize:=256;
mscomm1.Settings:='9600,n,8,1';
mscomm1.InputLen:=0;
mscomm1.InBufferSize:=0;
mscomm1.OutBufferSize:=0;
mscomm1.RThreshold:=1;
mscomm1.InputMode:=cominputmodetext;
end;
procedure TForm1.MSComm1Comm(Sender: TObject);var recstr:olevariant;
begin
if mscomm1.commevent=2 then
begin
recstr:=mscomm1.input;
memo1.text:=memo1.text+recstr;
end;
但结果很不理想,一方面的得到的字符串长度不一,没有规律,二是读数再大一点时会出现乱字符。请问是什么地方出了问题?如果用mscomm1.InputMode:=cominputmodebinary;会不会解决这个问题?如果用这个,得到的数据是二进制还是其他?要怎么转换呢?最好能做到和超级终端一样的效果。请各位指教。谢谢!
 
一是注意mscomm设置的长度,二是注意变量类型
 
既然是通讯口,你当然不能假定对方一个报文实质的长度了(事实上你还必须考虑在通讯过程中出现故障譬如掉线),你只能先把数据映射到一个缓冲器,然后再逐个字节检索重新组帧。
 

Similar threads

后退
顶部