来自序列

时间:2015-05-07 16:01:52

标签: python string list usb text-formatting

我是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符号时。

所以我的问题是:

  1. 是否可以强制Python以定义的格式给出答案?
  2. 如果没有,是否可以处理列表或我可以从列表中获得的字符串,以便以所需的格式获取我的值?
  3. 有人可以给我一个提示,如何从列表中提取我的寄存器值,并将每个寄存器的两个十六进制数转换为每个寄存器的一个整数值(第一个值是高字节,第二个值是低字节) ?
  4. 提前感谢您的回答

    真诚

    罗兰

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。 在程序的一个小测试中,我偶然发现变量 seread 已经为我提供了合适且可用的格式的数据。

我认为Spyder编辑器在显示字节类型对象时会导致格式更改。 如果我使用seread [i]访问单个字节,而i在0到len(seread)-1的范围内,我会收到单个字节的正确值。

所以我可以访问我的数据并根据需要计算我的测量值。

尽管感谢 keety 阅读我的问题。