Delphi SPCOMM串口以CDT规约发送数据的有关问题,对方收不到源码或只是乱码
Delphi SPCOMM串口以CDT规约发送数据的问题,对方收不到源码或只是乱码。
最近自己做一个小程序,用SPCOMM 的串口调试助手做基础,用COM3 接收数据(USB转COM的,已转为整数型),再用本机的COM1 以CDT规约发送数据出去,用了2个SPCOMM的控件,发现发送数据,对方收到源码或只收到乱码。
COM3 波特率9600 ,数据位8 停止位1 无校验,COM1 波特率600 ,数据位8 停止位1 无校验。相关代码如下:
是否发送格式不对或者发送数据间隔不匹配。
请指正。
------解决方案--------------------
writecommdata 可以直接发多字节
FrmMain.Comm2.writecommdata(@sbuf[i],18) then
最近自己做一个小程序,用SPCOMM 的串口调试助手做基础,用COM3 接收数据(USB转COM的,已转为整数型),再用本机的COM1 以CDT规约发送数据出去,用了2个SPCOMM的控件,发现发送数据,对方收到源码或只收到乱码。
COM3 波特率9600 ,数据位8 停止位1 无校验,COM1 波特率600 ,数据位8 停止位1 无校验。相关代码如下:
是否发送格式不对或者发送数据间隔不匹配。
请指正。
- Delphi(Pascal) code
procedure TFrmMain.btnSendClick(Sender: TObject); {begin sbuf[1]:=byte($eb); //帧头 sbuf[2]:=byte($90); //命令号 sbuf[3]:=byte($eb); sbuf[4]:=byte($90); sbuf[5]:=byte($eb); sbuf[6]:=byte($90); //帧尾 sbuf[7]:=byte($71); sbuf[8]:=byte($61); sbuf[9]:=byte($01); sbuf[10]:=byte($00); sbuf[11]:=byte($00); sbuf[12]:=byte($2b); //帧尾 sbuf[13]:=byte($00); sbuf[14]:=byte($0a); sbuf[15]:=byte($00); sbuf[16]:=byte($14); sbuf[17]:=byte($00); sbuf[18]:=byte($60); //帧尾 senddata;//调用发送函数 end; } var ss:string; const tongbu='EB 90 EB 90 EB 90 71 61 04 01 01 1A '; begin if cbsendHex.Checked then SendString(HexStrToStr(Memo3.Text)) else begin Memo2.Text:=tongbu+'00 0'+copy(inttohex(wds,2),0,1)+' '+ copy(inttohex(wds,2),1,2)+' 0'+copy(inttohex(sds,2),0,1)+' '+ copy(inttohex(sds,2),1,2)+' EF 01 00 00 00 00 12'; if Memo2.Text<>'' then SendString(Memo2.Text); end; end; procedure TFrmMain.SendString(const Str: string); begin if Comm2.WriteCommData(PChar(Str), Length(Str)) then begin FTXNum := FTXNum + Cardinal(Length(Str)); ShowTX; end; end; procedure TFrmMain.senddata; var i:integer; commflg:boolean; begin viewstring:=''; commflg:=true; for i:=1 to 18 do begin if not FrmMain.Comm2.writecommdata(@sbuf[i],1) then begin commflg:=false; break; end; sleep(10); {发送时字节间的延时} viewstring:=viewstring+inttohex(sbuf[i],2)+' '; end; FrmMain.memo1.lines.add(viewstring); FTXNum := FTXNum + 18; ShowTX; if not commflg then messagedlg('发送失败!',mterror,[mbyes],0); end;
------解决方案--------------------
writecommdata 可以直接发多字节
FrmMain.Comm2.writecommdata(@sbuf[i],18) then