2011-01-22 105 views
1

从阿尔杜伊诺发送最新的性格,我在这两个Arduino的和Python初学者,我有一个想法,但我不能得到它的工作。基本上,当在Arduino中按下按钮时,它通过串口发送“4”。我在Python中想要的只要它读取一个4,它就应该做些什么。这是我走到这一步:阅读在Python

import serial 
ser = serial.Serial('/dev/tty.usbserial-A900frF6', 9600) 
var = 1 
while var == 1: 
    if ser.inWaiting() > 0: 
    ser.readline(1) 
    print "hello" 

但显然这个打印Hello不管。我需要的是这样的:

import serial 
ser = serial.Serial('/dev/tty.usbserial-A900frF6', 9600) 
var = 1 
while var == 1: 
    if ser.inWaiting() > 0: 
    ser.readline(1) 
    if last.read == "4": 
    print "hello" 

但是我怎样才能定义last.read?

回答

1

我不知道跟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()'需要多个字节。

+0

你能解释一下这是多一点?为什么我需要使用模拟传感器?对不起,新手在这里:)我看到了另一个线程,但它似乎并没有真正解决我的问题。 – HankSmackHood 2011-01-23 11:52:27

0

我认为它可能与此修改工作:

import serial 
ser = serial.Serial('/dev/tty.usbserial-A900frF6', 9600) 
var = 1 
while var == 1: 
    if (ser.inWaiting() > 0): 
    ser.readline(1) 
    print "hello"