python - 使用相同的参数初始化两个Python类,得到不同的结果

标签 python python-2.7 class serial-port

目标:了解使用相同参数初始化的两个类的奇怪行为,并产生不同的结果。

背景:

我的项目涉及 Raspberry Pi 3 通过串行(通过 USB 端口)通信与 Arduino MEGA 上的各种传感器进行通信。通信协议(protocol)简单。

Raspberry Pi 发送两个字节:

  1. 传感器的地址(例如 '\x04' )
  2. 第二个空字节,可以包含其他命令(例如 '\x00' )

MEGA等待两个字节,然后根据大case/switch回复请求的信息。树。

我已经用Python封装了处理各种传感器的代码class es.给我带来麻烦的是 Encoder()类(class)。这是一个最小的例子:

import serial

class Encoder(object):
    def __init__(self, hex_name):
        self.hex_name = hex_name

    def value(self):
        temp = self.hex_name + '\x00'
        arduino.write(temp)
        return int(arduino.readline())

if __name__ == '__main__':
    arduino = serial.Serial('/dev/ttyACMO', 115200)

    encoder_one = Encoder('\x03')
    encoder_two = Encoder('\x04')

    print encoder_one.value()
    print encoder_two.value()

Arduino 处理请求如下所示:

if(Serial.available() >= 2){
    temp1 = Serial.read();
    temp2 = Serial.read();

    switch(temp1){
        case 1:
          ...
        case 3:
            Serial.println(positionLeft);
            break;
        case 4:
            Serial.println(positionRight);
            break;
        case 5:
         ...
    }
}

问题:

我从编码器中得到了无意义的值。特别令人担忧的是,当我使用相同十六进制名称(即 '\x04' )初始化两个编码器时,我从 encoder_one.value() 获得不同的值。和encoder_two.value() .

假设:

  1. 有关类结构的某些内容有误。

在将其封装到类中之前,我已经正常工作了。我想知道我是否正在分配 encoder_oneencoder_two到同一个对象或类似的愚蠢的东西。

我在 return 之前添加了一行在value()这将打印 hex_name (即 print self.hex_name )。当我将两个编码器设置为'\x04'时我打印了相同的非字母数字字符。当我将一个编码器设置为'\x03'时另一个为'\x04'我得到两个不同的非字母数字字符 - 一个是上次测试中的字符。

  • 通信中的移帧。
  • MEGA 需要两个字节。它等待两个字节,发送请求的信息,然后清除缓冲区。是否有可能将十六进制值存储为我的 Python 程序中的字符串,当执行 arduino.write() 时会添加一个额外的字节。像\n之类的东西或其他不可打印的字符。

    结论:

    我已经花了大约三个小时来研究这个错误,我认为解决它需要一些关于我不理解的类如何工作的信息。

    最佳答案

    结果是第二个假设。显然,十六进制字节的连接步骤中包含一些不可打印的字符。切换到以下顺序解决了问题。

    编辑:我发现在 write() 之后立即执行 readline() 会出现间歇性错误。我在两个操作之间添加了 10 毫秒的延迟。

    旧:

    def value(self):
        temp = self.hex_name + '\x00'
        arduino.write(temp)
        return int(arduino.readline())
    

    新:

    def value(self):
        arduino.write(self.hex_name)
        arduino.write('\x00')
        time.sleep(0.010)
        return int(arduino.readline())
    

    完整的(现在正在运行)示例如下所示。

    import serial
    
    class Encoder(object):
        def __init__(self, hex_name):
            self.hex_name = hex_name
    
        def value(self):
            arduino.write(self.hex_name)
            arduino.write('\x00')
            time.sleep(0.010)
            return int(arduino.readline())
    
    if __name__ == '__main__':
        arduino = serial.Serial('/dev/ttyACMO', 115200)
    
        encoder_one = Encoder('\x03')
        encoder_two = Encoder('\x04')
    
        print encoder_one.value()
        print encoder_two.value()
    

    关于python - 使用相同的参数初始化两个Python类,得到不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38126546/

    相关文章:

    python - 添加矩阵时出错

    python - Pandas 到 Excel : Keep Existing Data

    python-2.7 - 将两个数据框列中的数据合并为一列

    c# - 如何在另一个类(class)中使用一个类(class)的公共(public) boolean ? C#

    c++ - C++ 中灵活的类行为

    jquery - 禁用 jquery 中的元素

    python - 修改NLTK word_tokenize以防止括号标记化

    Python BaseHTTPRequestHandler : Respond with JSON

    python - MATLAB 到 Python 转换 : vectors, 数组,索引元素

    python - 多处理 Python 中的写入错误