【问题标题】:pyserial arduino bytearray decoding issuepyserial arduino bytearray 解码问题
【发布时间】:2020-05-15 03:52:01
【问题描述】:

我正在尝试与通过 USB 发送串行数据的 arduino 接口,以尽快记录 EMG 信号。以前我使用的是声卡 adc,因为它很容易直接与 adc 采样寄存器接口,但现在我正试图让我的设备完全无线。结果,我通过 arduino 进行了一端采样,通过 rf 收发器发送数据,然后串行传输。 arduino 端正在通道上写入一个字节。下面是测试代码:

void setup() { 

Serial.begin(115200);
  timer = micros();
}

void loop() {
  //timeSync(loopTime);

  int val = analogRead(1)-512;  
  sendToPC(&val);
}

void sendToPC(int* data)
{
  byte* byteData = (byte*)(data);
  Serial.write(byteData, 2);
}

这是我的 python sn-p

com = "COM3"
baud = 115200

ser = serial.Serial(com, baud)
res = bytearray(4)
#ser.readinto(res)

tik = time.time()
rec = []
while(time.time() - tik < 2):
    ser.readinto(res)
    value = struct.unpack('>HH', res)
    rec.extend(value)

所以当我将模拟引脚强制为 5V 时,我会读回 512(应该如此)。现在,如果我创建一个分压器,一端在 Vcc (5V),另一端是我的输入信号,我出于某种原因从解码中得到一个 4 字节数而不是 2(即 0xFFe0,或类似的东西)。

我正在使用除法器,因为传入的数据可以是正数或负数,所以我的思考过程是在做除法器时,我可以记录负值。然而,它似乎搞砸了转换!任何想法(代码明智/硬件明智?)

编辑:我意识到 511 对于直接 5V 是错误的(应该是 1023),但是我在发送它之前做了位移(例如,如果信号是 0V,分频器在量化时会给出 2.5V ~ 512 . 因此-512 会给出 0V)

【问题讨论】:

  • “4 字节数”是什么意思?您正在读取 4 个字节并将它们解压缩为 2 个无符号 16 位整数。如果你想要负数,那显然是行不通的。
  • 使用 struct.unpack 解包 int 需要 4 个字节作为我相信的参数。它解压缩成一个(2字节,2字节)的元组。不幸的是,有时似乎 LSB 开始就是问题所在。负数很容易。 (val-512)/1023*5 将给出负数,因为分压器保持电压为正。

标签: python c++ arduino pyserial


【解决方案1】:

这个解决方案有点麻烦,但就是这样。

所以我注意到,有时当我通过读取两个字节来收集数据时,我会得到一个字节数组,格式如下:

字节数组(b'xFF/x01/xFF/x01')

通过检查读取的第一个字节(无符号)是否>1023,我刷新串行输入和输出缓冲区,读取一个字节,然后继续读取两个字节:

rxbuffer =b''
ser.flushInput()
ser.flushOutput()
time.sleep(2)
tik = time.time()
rec = []
while(time.time() - tik < 1):
    rxbuffer = ser.read(2)
    if(int.from_bytes(rxbuffer, 'big', signed=True) > 1023):
        print("out of sync")
        tik = time.time()
        ser.flushInput()
        ser.flushOutput()
        time.sleep(0.1)
        ser.read(1)
        continue

    conv = int.from_bytes(rxbuffer, 'big', signed=True)
    rec.append(conv)
    print(conv)

【讨论】:

    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 2021-10-06
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多