【发布时间】: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