谁能给看一下下面的程序?关于MSCOMM与单片机通讯(100分)

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

Flyback

Unregistered / Unconfirmed
GUEST, unregistred user!
作了个程序,是用MSCOMM与单片机通讯用的。
这段程序已经实现了通讯。但问题是单片机传来的二进制数如何转换为整数进而在
文本框里显示出来呢?请大侠们指教。
procedure TForm1.Timer1Timer(Sender: TObject);
Var RecDate:OLEVariant;
Var ReceiveDate: array[0..3] of Byte;
begin
try
Mscomm1.Output :='S'; //启动握手信号

MSComm1.InputLen := 0;
repeat //开始接受数据
Application.ProcessMessages;
until (Mscomm1.InBufferCount >=4);
RecDate:=Mscomm1.Input;
Edit3.text:=RecDate; //可以看到单片机传来的原始数据了

//下面如何转换为整数呢,请看一下下面的程序问题在那?
Move(RecDate,ReceiveDate,Sizeof(RecDate));

Edit1.text:=InttoStr(ReceiveDate[0]div 2);
Edit2.text:=InttoStr(ReceiveDate[1]); //这种方法错在哪里啊????

Mscomm1.Output:='H'; //发信号让单片机复位
except
Close;
end;
end;
 
看样子没错,不过你收的是四个字节,为什么只处理二个呢?
而且通信协议过于简单,你保证收到的正确吗?
 
iie:
你好。
我这里只是做了处理的示意。
现在的问题是

Move(RecDate,ReceiveDate,Sizeof(RecDate));

Edit1.text:=InttoStr(ReceiveDate[0]div 2);
Edit2.text:=InttoStr(ReceiveDate[1]);
这三行程序怎么也调不通。
单片机传来的是二进制数,还有没有别的方法转换为整数呢?
 
二进制数就是整数呵,你请说明白些,最好有实例——
应该是什么,现在得到什么……
 
iie:
是这样的。如果我只看olevariant 变量RecDate里的值时,可以看到
这个值是变化的,即能够接受到单片机传来的数据。
可是,通过这三行程序后,
Move(RecDate,ReceiveDate,Sizeof(RecDate));
Edit1.text:=InttoStr(ReceiveDate[0]div 2);
Edit2.text:=InttoStr(ReceiveDate[1]);

得到
Edit1.text,和Edit2.text 的内容却总是一个定值,
所以我怀疑是数据转换出了问题。
另:这个程序是在2000下编的,应该不会和操作系统有关吧?
 
move有问题,你可以直接用string或者干脆receiveDate这样的基类型变量接受数据。
 
1、用调试功能,设断点查看变量在move前后的情况
2、改用其它数据类型,如string
3、使用其他串行控件如CommPort 2.61(这个在Delphi中较合适,用的较多,推荐试试
这是最新版的 ,功能强大,用户多多 ,数据组功能,还是FreeWare)
Home page: http://www2.arnes.si/~sopecrni (他的老窝)
绝对好东东,快去拿吧
 
多人接受答案了。
 
后退
顶部