我是python的新手。我有一些Pascal的经验和一些C ++的经验。 目前,我必须为研究项目演示者编写一些代码。 设置如下:
我们有一个868MHz无线电主设备。我可以通过USB端口与此设备通信(目前是COM4,但将来可能会改变)。 868MHz主设备与从设备通信。从属单元回复一条消息,我可以从USB端口读取。
在此之前一切正常。我请求数据包并接收它们。 从收到数据包的那一刻起,我有一个问题,我似乎没有 能够自己解决。
我在Spyder编辑器中使用Anaconda 32位
# -*- coding: utf-8 -*-
"""
Created on Thu May 7 13:35:59 2015
@author: roland
"""
import serial
portnr = 3 #Serial Port Number 0=Com1, 3=Com4
portbaud = 38400 #Baud rate
tiout = 0.1 #Timout in seconds
i = 1
wrword = ([0x02,0x04,0x00,0x00,0x00,0x02,0x71,0xF8])
try:
ser = serial.Serial(portnr, portbaud, timeout=tiout) # open port
except:
ser.close() # close port
ser = serial.Serial(portnr, portbaud, timeout=tiout) # open port
print(ser.name) # check which port was really used
while (i < 100):
ser.write(wrword)
seread = ser.readline()
print(seread)
i = i+1
sere = seread.split()
try:
readdat = str(sere[0])
except:
print("Index Error")
retlen = len(readdat)
print(retlen)
readdat = readdat[2:retlen-1]
print(readdat)
ser.close() # close port
变量wrword是我对868MHz无线电主机的请求。 格式如下:
0x02单位地址
0x04从某个寄存器范围发送信息的命令
0x00 0x00第一个寄存器的地址(起始地址0有效!)
0x00 0x02信息要发送多少寄存器(在这种情况下,寄存器0和1应发送到无线电主机)
0x71 0xF8命令句的校验和。
程序将命令序列成功发送到主单元,从单元应答。每次发送命令时都会有答案。然而,现在可能会发生正确答案,这就是为什么 try命令正在使用中。 我知道我使用ser.readline(),但这对应用程序来说已经足够了。
我从USB端口收到一个列表作为答案。 数据如下:
b'\ x02 \ x04 \ x04 \ x12 \ xb6 \ x12 \ xa5 \ xe0 \ xc1'(这是打印输出(seread))
为澄清这个答案是正确的,必须如下:
\ x02应答单元的地址 \ x04执行的功能(从某个寄存器区域读取) \ x04答案的字节数 \ x12 \ xb6第一个寄存器的值(2个字节) \ x12 \ xa5第二个寄存器的值(2个字节) \ xe0 \ xc1答案的校验和
如果来自com端口的数据具有所有这些格式,我可能能够从两个寄存器中获取数据值。但不幸的是,数据格式并不总是相同的。
有时我会收到以下风格的答案:
B '\ X02 \ X04 \ X04 \ X12 \ x8e \ X12 {\ xe1T'
答案类似于上面的例子(寄存器中的不同值和不同的校验和)但我收到的格式已经改变。
如果我使用十六进制ASCII码代码显然不是十六进制值,我会找到一个有效的答复电报。
b'\ x02 \ x04 \ x04 \ x12 \ x8e \ x12 {\ xe1T'
变为
b'\ x02 \ x04 \ x04 \ x12 \ x8e \ x12 \ x7b \ xe1 \ x54'
当我用手将十六进制代码交换ASCII符号时。
所以我的问题是:
提前感谢您的回答
真诚
罗兰
答案 0 :(得分:0)
我找到了解决方案。 在程序的一个小测试中,我偶然发现变量 seread 已经为我提供了合适且可用的格式的数据。
我认为Spyder编辑器在显示字节类型对象时会导致格式更改。 如果我使用seread [i]访问单个字节,而i在0到len(seread)-1的范围内,我会收到单个字节的正确值。
所以我可以访问我的数据并根据需要计算我的测量值。
尽管感谢 keety 阅读我的问题。