首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pyserial arduino字节数组解码问题

pyserial arduino字节数组解码问题
EN

Stack Overflow用户
提问于 2020-05-15 11:52:02
回答 1查看 181关注 0票数 0

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

代码语言:javascript
复制
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代码片段

代码语言:javascript
复制
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)

EN

回答 1

Stack Overflow用户

发布于 2020-05-16 03:11:08

这个解决方案有点不靠谱,但它就在这里。

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

bytearray(b'xFF/x01/xFF/x01')

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

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61811446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档