Spcomm发送十六进制数据问题(100分相送) ( 积分: 100 )

  • 主题发起人 主题发起人 cocool00
  • 开始时间 开始时间
C

cocool00

Unregistered / Unconfirmed
GUEST, unregistred user!
使用spcomm怎么能将例如:02 01 0A 03 这串数据用十六进制发送给串口?
类似于串口调试工具中使用十六进制发送的功能。
顺便问问:在发送过程中怎么将十进制的地址比如:51 转换成十六进制的 $33
 
使用spcomm怎么能将例如:02 01 0A 03 这串数据用十六进制发送给串口?
类似于串口调试工具中使用十六进制发送的功能。
顺便问问:在发送过程中怎么将十进制的地址比如:51 转换成十六进制的 $33
 
数据不管十进制还是十六进制发到串口都是一种格式,所以无所谓,如果把字符串02 01 0A 03 发过去的话,可以这样变一下:
StrToInt('$'+'02') 或
pos(MidStr(trim(MainFrm.PME1.Text),i,1),'1234567890ABCDE');
 
如果51是integer,发送时就这样发就行,如果是string,这样就可以(十六进制转十进制):
pos(MidStr('51',1,1),'1234567890ABCDE')+pos(MidStr('51',2,1),'1234567890ABCDE');
(十六进制转十进制):StrToInt('$'+IntToStr(51))
 
我是这样写的:
str:=#$02+#$01+#$A+#$03; //01表示地址位
Comm1.WriteCommData(Pchar(str),length(str));

可是就是发不过去,下位机没反应。主要我们的下位机要接收的是十六进制的代码。
还有地址是十进制的,怎么转换成十六进制的呢?
 
十进制转十六进制:IntToHex
先去吃饭,回来再分析:)
 
反正总是感觉自己的那个发送的数据包有些问题。

实在郁闷的唆!!!
 
主要我们的下位机要接收的是十六进制的代码。
这个和你发送成十进制没关系,你就是变成十六进制格式(02 01 0A 03)发出去,那边的格式还是以字节的格式反映出来:(2,1,10,3 )

str:=#$02+#$01+#$A+#$03;
赋完值后str里面是什么值?
还有为什么发送的时候要用Pchar型呢?
 
赋值完后,str的值是#2#1#$A#3
至于用Pchar类型,借鉴于其他应用。呵呵...

还有就是用串口调试工具的话,输入02 33 0A 03 (33是51的十六进制数,51相当于下位机的地址号),把十六进制发送勾上,就能发过去!要是知道这个怎么使用的就方便咯。
 
可以看看原来VB的发送过程:
SendByte (&H2) 'send null
For i = 1 To 1000
DoEvents
Next i

SendByte (Addrh) 'send display mode & display room
For i = 1 To 1000
DoEvents
Next i
SendByte (&HA) 'send delay factor
For i = 1 To 1000
DoEvents
Next i
SendByte (&H3) 'send delay factor
For i = 1 To 1000
DoEvents
Next i

Private Sub SendByte(bData As Integer)
MSComm2.Output = Chr$(bData)
Do
'DoEvents
Loop While MSComm2.OutBufferCount > 0
End Sub

不过采用的是MSCOMM。
 
将十进制转换成16进制:
function IntToHex(Value: Integer; Digits: Integer): string;
 
我是这样发送下位机地址(Posid)的,你看是不是类似
stemp,Posid:PChar;
begin
GetMem(Posid,3);
Posid[0]:=Chr(vStaID mod $100);
Posid[1]:=Chr((vStaID mod $10000) div $100);
Posid[2]:=Chr(vStaID div $10000);

stempLength:=1;
GetMem(stemp,1);
stemp[0]:=Chr($A6);

CriticalSection[vCom].Enter;
Send_String(vCom,Posid,stemp,stempLength);
...........
 
刚才换成MSCOMM了,居然这样的过程就能发送到下位机了:
Comm1.PortOpen:=true;
sendbyte(02);
sleep(1);
sendbyte(num); //num是integer,地址号
sleep(1);
sendbyte(10);
sleep(1);
sendbyte(03);
sleep(1);
comm1.PortOpen:=false;

procedure TMainForm.SendByte(bData: byte);
begin
comm1.Output:=chr(bdata);
end;
 
呵呵,那就是你这里有问题了:
str:=#$02+#$01+#$A+#$03; //01表示地址位
Comm1.WriteCommData(Pchar(str),length(str));
应改为:
str:PChar;
begin
GetMem(str,4);
str[0]:=Chr(2);
str[1]:=Chr(1);
str[2]:=Chr(A);
str[3]:=Chr(3);
Comm1.WriteCommData(str,length(str));
 
我这么写法主要借鉴原来的跟其他种类下位机通讯的做法!
是把整个数据弄成一个包一个包的发送的。

可能这个下位机的程序不这么用吧!唉,能通讯就好。还是谢谢参与哈。
 

Similar threads

回复
0
查看
848
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部