紧急求助:用comport如何读取单片机串口发送给PC机的16进制数?(00h~ffh)(100分)

  • 主题发起人 主题发起人 ddwsun
  • 开始时间 开始时间
D

ddwsun

Unregistered / Unconfirmed
GUEST, unregistred user!
在写一个程序,用comport完成计算机和单片机的串口通讯,互相发送8位16进制数,
目前计算机发送的部分已经完成,但是计算机接收的部分一直不知该怎么写。
清高手帮忙,有源码最好,万分感谢。
 
用spcomm控件或mscomm控件不行?
 
FlowControl的ControlRTS和ControlDTR属性设为enable
在ComPort1RxChar事件中处理接收到的数据
 
流控协议应该是 None 吧
然后在事件掩码中开放 evRxChar,再为 OnRxChar 事件编写响应过程,过程中有 Read/ReadString 去读串行口的数据。
 
读取的时候可以在OnRxChar 把读的内容放到一个缓冲区!
关键是对接收的数据做检验!
可以写个规约类来针对不对规约通讯后得到的数据检验!
 
procedure TbdForm.CPD4ReceiveData(Sender: TObject;
DataPtr: Pointer;
DataSize: Cardinal);
var sa:array[1..2] of byte;
r,rr:real;s1,s2:string;
begin
move(DataPtr^,sa,2);
--读数,硬件发出两个字节数据,高字节在前低字节在后,如果是一个字节 move(DataPtr^,sa,1);
就好了
r:=(sa[1]*256+sa[2])*lcxs-yjlz;
if symodel=3 then
begin
r:=(sa[1]*256+sa[2])*lcxs*1000-yjlz;
label6.Caption :=format('%6.2f',[r*0.00234]);
end;
//if (r<0.1) and (r>-0.1) then
r:=0;
rr:=Compensatedata(r);
if r<10 then
begin
s1:= Format('%6.3f',[r]);
s2:= Format('%6.3f',[rr]);
end;
if r>=10 then
begin
s1:= Format('%6.2f',[r]);
s2:= Format('%6.2f',[rr]);
end;
if r>=100 then
begin
s1:= Format('%6.1f',[r]);
s2:= Format('%6.1f',[rr]);
end;

label4.Caption :=s1;
if (label8.Visible =false) and (ztbc=false) then
label15.Caption :=s2;
end;
 
问题解决了。我让单片机发出字符串:30h——46h,计算机接收后翻译成00h——ffh;
例如:16进制00h=30h+30h;计算机发出的是正常的16进制。感谢各位
 
后退
顶部