从串行连接中获取b'\ x08'b'\ x9e'b'\ x1d'或b'\ xe0'b'\ xe0'b'错误

时间:2019-06-25 08:49:24

标签: python serial-port putty

我有一个连接到device的USB连接,该串口发出串行信息。 当在下面(在Jupyter笔记本中)运行我的Python脚本时,我从其中得到了奇怪的信息。

import serial

ser = serial.Serial(port='COM3', baudrate=115200, bytesize=serial.EIGHTBITS, 
    parity=serial.PARITY_NONE, timeout=1)
ser.flushInput()

while True:
    print(ser.read())

当我将波特率设置为115200时,我将获得以下信息: b'\ xe0'b'\ xe0'b'\ x00'b'\ x00'b'\ xe0'b'\ x00'b'\ x00'b'\ xe0'...

在9200,我得到了: b'\ x08'b'\ x9e'b'\ x1d'b'\ xca'b'L'b'k'b'\ x84'b'\ xff'b'\ x90'b'\ x8c'b' G'b'\ x9b'

有人知道如何获取真实数据吗? 我应该获得有关太阳能充电控制器之类的信息

V:12

A:1

编辑: 我现在有以下内容,没有打印任何内容: 第一个单元格:

import os, serial, argparse

class vedirect:

    def __init__(self, serialport, timeout):
        self.serialport = serialport
        self.ser = serial.Serial(serialport, 19200, timeout=timeout)
        self.header1 = '\r'
        self.header2 = '\n'
        self.hexmarker = ':'
        self.delimiter = '\t'
        self.key = ''
        self.value = ''
        self.bytes_sum = 0;
        self.state = self.WAIT_HEADER
        self.dict = {}


    (HEX, WAIT_HEADER, IN_KEY, IN_VALUE, IN_CHECKSUM) = range(5)

    def input(self, byte):
        if byte == self.hexmarker and self.state != self.IN_CHECKSUM:
            self.state = self.HEX


        if self.state == self.WAIT_HEADER:
            self.bytes_sum += ord(byte)
            if byte == self.header1:
                self.state = self.WAIT_HEADER
            elif byte == self.header2:
                self.state = self.IN_KEY

            return None
        elif self.state == self.IN_KEY:
            self.bytes_sum += ord(byte)
            if byte == self.delimiter:
                if (self.key == 'Checksum'):
                    self.state = self.IN_CHECKSUM
                else:
                    self.state = self.IN_VALUE
            else:
                self.key += byte
            return None
        elif self.state == self.IN_VALUE:
            self.bytes_sum += ord(byte)
            if byte == self.header1:
                self.state = self.WAIT_HEADER
                self.dict[self.key] = self.value;
                self.key = '';
                self.value = '';
            else:
                self.value += byte
            return None
        elif self.state == self.IN_CHECKSUM:
            self.bytes_sum += ord(byte)
            self.key = ''
            self.value = ''
            self.state = self.WAIT_HEADER
            if (self.bytes_sum % 256 == 0):
                self.bytes_sum = 0
                return self.dict
            else:
                print ('Malformed packet')
                self.bytes_sum = 0
        elif self.state == self.HEX:
            self.bytes_sum = 0
            if byte == self.header2:
                self.state = self.WAIT_HEADER
        else:
            raise AssertionError()

    def read_data(self):
        while True:
            byte = self.ser.read(1)
            packet = self.input(byte)

    def read_data_single(self):
        while True:
            byte = self.ser.read(1)
            packet = self.input(byte)
            if (packet != None):
                return packet


    def read_data_callback(self, callbackFunction):
        while True:
            byte = self.ser.read(1)
            if byte:
                packet = self.input(byte)
                if (packet != None):
                    callbackFunction(packet)
            else:
                break


def print_data_callback(data):
    print (data)


#print(ve.read_data_single())

第二:

ve = vedirect("COM3", 1)

STILL永远运行[*]的三级:

print(ve.read_data_single())

与此同时,我得到了this

当我发消息[0]时,我得到\ t,但是里面没有更多的值

1 个答案:

答案 0 :(得分:0)

如果您尝试使用 VE-Direct 协议,请按照manual进行操作:

  

加电时,VE.Direct接口将始终处于文本模式,并连续传输所有运行时字段。收到有效的十六进制消息后,它将立即切换到十六进制模式。只要经常收到十六进制消息,它将一直处于十六进制模式。产品未收到任何有效货后   十六进制消息几秒钟,它将切换回文本模式并开始自动传输   运行时字段再次定期出现。从开始,某些产品将发送异步HEX消息   以“:A”结尾,并以换行符“ \ n”结尾。这些消息可能会打断常规   文字模式框架。

您的问题似乎是您没有正确设置波特率,默认情况下,该波特率为19200

如果要在HEX模式下工作,可以使用Python 3.x进行操作,只需解码HEX消息即可:

received_hex=ser.read()
received_utf=received_hex.decode()
print(received_utf)

在其他问题中,您可以找到有关此特定问题的一些很好的指导。以this为例,看看。

您可能需要查看手册第4页和设备的固件版本,以查看是否支持 VE-Direct 协议

如果不确定设置(波特率停止位等),则可以使用像腻子这样的终端程序(似乎已经在使用)开始连接设备。如果您使用的是Windows,我认为RealTerm更易于使用,并且可以轻松地从HEX切换为ASCII。

编辑:事实证明,对于此特定协议,已经完成了很多有用的工作。 This script看起来很有希望。

如果要运行此脚本,请打开DOS终端(确保您的Python文件夹C:\Python3.x\bin在路径中,移至存储脚本的文件夹(C:\Example),然后键入:< / p>

C:\Example\python vedirect.py --port COM3

看看下面的评论,看来您已经可以使用脚本了,但是仍然需要一些工作才能使其可用。现在,只要稍微改变一下循环,就可以看到设备的输出:

message=""
while True:
    message += ser.read()
    print(message)

输出显然很丑陋,但是通过一些工作,您可以使其看起来像上面的脚本。手册上还提供了一些有关如何读取这些设备的数据的很好的指导。看看是否可以放在一起。现在,根据您的需求,您可能更喜欢使用自己的脚本或从另一个脚本开始。如果您正在学习,请在解决方案之前尝试自己做,如果需要尽快解决,那么我认为github脚本是您可以去的地方。