SpComm控件的赋值问题(熟悉的人请进)(0分)

  • 主题发起人 主题发起人 seeok
  • 开始时间 开始时间
S

seeok

Unregistered / Unconfirmed
GUEST, unregistred user!
主程序是MDI父窗体,登录窗口是模式窗体,在登录窗口上有个Edit,程序启动到登录界面上时,刷卡,通过SpComm控件读取串口,但是怎么也赋值不到Edit中,通过跟踪发现是做了赋值操作,而且有值,但是马上就被清空了(通过全局变量做也是这样),感觉很奇怪,弄了大半天都不知道是什么原因!请各位指教!
 
我用MSCOMM的时候也有同样的问题,串口数据一旦做了读操作马上就自动清空了,所以读取的时候一定要把值赋给自定的变量。
 
同意楼上,自己定义变量,赋值的时候判断一下,如果是空的就不刷新了。
 
关键是从串口读取到的值最后是否有不可见字符,串口接收到的数据,有时会分成2次中断进入的,除非你是按单字节中断方式获取的,比如16进制 20H,32H,0DH,0AH,串口接收到的时候可能是20H,32H先进来中断一次,然后0DH,0AH紧接着才进来,再中断一次,我是做单片机的,写上位机软件时我都碰到过这种情况,换了几个控件也没用,因此建议你先用串口调试软件看看收到的数。
 
我定义了一个变量,但是仍旧会自动清空啊?有没有什么办法呢
 
HSB_YQ 说的正确
使用二进制接收,处理后再放入EDIT ,就没事,使用SPCOMM 避免使用ASCii形式接收
 
同意“knight_dp”的说法,毕竟串口出来的是二进制数据
 
procedure TLoginForm.myCommReceiveData(Sender: TObject;
Buffer: Pointer;
BufferLength: Word);
var
i:Integer;
sRec: String;
rBuf: array[0..128] of Byte;
begin
move(Buffer^,rBuf,BufferLength);
for i:=0 to BufferLength-1do
sRec:=sRec + IntToHex(rBuf,2);
Edit2.Text := sRec;
end;
我是这样来做的,请问各位错在哪里?谢谢!
 
赋值之前对srec的数据进行检查,
 
赋值前先判断下返回字符长度就可以了。
 
后退
顶部