关于DELPHI的串口通讯问题。读取数组的问题。
发布网友
发布时间:2022-04-30 04:36
我来回答
共2个回答
热心网友
时间:2023-10-13 05:15
你读出来的是一个整型,这是对的。注意,你定义的Arr1数组长度为5字节了。下面是我写的测试代码,显示的结果就是13761317:
//我这里字节和你说的反过来了,不知道是不是你弄错了还是你读出来的就是反的,如果读出来就是反的需要自己处理一下
var Arr1:Array[0..3] of byte;
begin
Arr1[0]:=37;
Arr1[1]:=251;
Arr1[2]:=209;
Arr1[3]:=0;
Showmessage(inttostr(PInteger(@Arr1)^));
end;
显示的结果正是你要的结果13761317,所以你把数据读到Arr1数组以后,需要通过PInteger指针类型转成整型,就行了,如下:
PInteger(@Arr1)^追问0xCEA4 ,我的题目没有错,是这样的顺序,
追答如果是这样的顺序,自己把字节反转然后象我说的用PInteger转成整型就可以了,看我测试的代码还没看出规率吗
热心网友
时间:2023-10-13 05:16
d等于接收字节长度有利接收正确率提高.由于你的几个下位机返回数据包字节不等长,你可根据寻址命令发出前预先改变Rthreshold值来保证接收返回符合要求的字节长度.
不然你接收多少字节符合你改发下一寻址命令呢?程序代码处理难度较高.
实际下位机返回数据包可在其代码中补一定其它字节来达到等长,从而使接收代码变得简洁.
等长接收数据后可对接收处理清0来等待下次接收.
补充:
假如下位机的返回数据按地址号能确定接收字节长度,下列代码可实现接收不等长数据,仅供参考:
Private Sub MSComm1_OnComm()
On Error Resume Next
Dim BytReceived() As Byte
Dim strBuff As String
Dim strData As String
Dim i As Integer
Dim x As Integer
Select Case MSComm1.CommEvent
Case 2
MSComm1.InputLen = 0
strBuff = MSComm1.Input
BytReceived() = strBuff
For i = 0 To UBound(BytReceived)
If Len(Hex(BytReceived(i))) = 1 Then
strData = strData & "0" & Hex(BytReceived(i))
Else
strData = strData & Hex(BytReceived(i))
End If
Next
Text3 = Text3 + strData
If Left(strData, 2) = "00" And Len(strData) = 8 Then
Text1(0).Text = Left(strData, 8)
Call DataClear
ElseIf Left(strData, 2) = "01" And Len(strData) = 10 Then
Text1(1).Text = Left(strData, 10)
Call DataClear
End If
End Select
End Sub
Public Sub DataClear()
MSComm1.OutBufferCount = 0 '清空发送缓冲区
MSComm1.InBufferCount = 0
Text3 = ""
End Sub
Private Sub Form_Load()
MSComm1.CommPort = 1 'COM端口
MSComm1.Settings = "9600,n,8,1"
MSComm1.InputMode = comInputModeBinary '采用二进制传输
MSComm1.InBufferCount = 0 '清空接受缓冲区
MSComm1.OutBufferCount = 0 '清空传输缓冲区
'MSComm1.SThreshold = 1 '如果传输缓冲区完全空时产生MSComm事件
MSComm1.RThreshold = 1 '不产生MSComm事件
MSComm1.PortOpen = True
Text3 = "" '打开端口
End Sub追问s2omzllwg ,VB我看不懂。