我不知道跟readLine
同步COMM的一个很好的方式,因为它不是一个阻塞调用。您可以使用阻止呼叫ser.read(numBytes)
。您需要知道Arduino发送了多少字节才能正确解码字节流。下面是一个简单的例子,它读取8个字节和在Python
try:
data = [struct.unpack('<HHL', handle.read(8)) for i in range(PACKETS_PER_TRANSMIT)]
except OSError:
self.emit(SIGNAL("connectionLost()"))
self.connected = False
这里他们解压缩到2个无符号短和长(所述<HHL
一部分)对以该进入的struct.unpack()
Arduino的代码的引用。它读取两个模拟传感器值和微时间戳,并通过串行发送它们。
unsigned int SensA, SensB;
byte out_buffer[64];
unsigned int buffer_head = 0;
unsigned int buffer_size = 64;
SensA = analogRead(SENSOR_A);
SensB = analogRead(SENSOR_B);
micr = micros();
out_buffer[buffer_head++] = (SensA & 0xFF);
out_buffer[buffer_head++] = (SensA >> 8) & 0xFF;
out_buffer[buffer_head++] = (SensB & 0xFF);
out_buffer[buffer_head++] = (SensB >> 8) & 0xFF;
out_buffer[buffer_head++] = (micr & 0xFF);
out_buffer[buffer_head++] = (micr >> 8) & 0xFF;
out_buffer[buffer_head++] = (micr >> 16) & 0xFF;
out_buffer[buffer_head++] = (micr >> 24) & 0xFF;
Serial.write(out_buffer, buffer_size);
Arduino游乐场和加工论坛是环顾这类代码的好地方。
UPDATE 我想我可能误导了你,readLine
没有阻塞。无论哪种方式,上面的代码应该工作。关于同一主题,我还在SO上发现了这个other thread。
UPDATE您不需要使用模拟传感器,这正是我碰巧使用的项目,您当然可以自由地通过串行数据。因此,Arduino代码正在做的是它有一个byte
类型的缓冲区,输出在发送之前被存储。然后将传感器值和微处理器写入缓冲区,并通过串口发送缓冲区。所述(SensA & 0xFF)
是一个位掩码操作,是以SensA
值和面具它与0xFF
或255十进制的位模式的位模式。基本上,这需要来自这个Arduino短的16位值的前8位。下一行执行相同的操作,但将位右移8位,从而取最后的8位。
你需要了解位模式,位掩码和位这个转变。然后缓冲区被写入串行。
的Python代码反过来做一次读取来自串行端口的8位的位。看看struct.unpack文档。理解只是为了允许发送一组以上的值。由于Arduino板和Python代码不同步,我补充说,每次发送都能够发送多个“线路”。你可以用struct.unpack('<HHL',handle.read(8))
来代替它。请记住,当Arduino发送代码处理比特时,'handle.read()'需要多个字节。
你能解释一下这是多一点?为什么我需要使用模拟传感器?对不起,新手在这里:)我看到了另一个线程,但它似乎并没有真正解决我的问题。 – HankSmackHood 2011-01-23 11:52:27