PySerial在阅读Arduino时遇到了问题

时间:2014-09-15 15:39:29

标签: python serial-port arduino pyserial

我想转储ROM。 Arduino一直等到收到一位数的密钥。我使用这个数字作为起始命令,并作为参数告诉Arduino ROM有多大。这是我的Arduino代码(简化测试):

void setup() {
  Serial.begin(115200);
}

void loop() {
  uint8_t key = 10;

  while(key > 2){
    key = Serial.read();
    key -= '0';
  }

  Serial.print("75 A E8 98 D4 E8 8A E4 E8 EB E4 F9 C3 60 3C 55");
  Serial.println("");
  Serial.print("74 C E8 35 3 E8 79 E1 88 96 9F 0 EB F E8");
  Serial.println("");
  Serial.print("0 E8 9 1 FF 76 19 E8 4F DC 8F 46 19 61 F8 C3");
  Serial.println("");
  Serial.print("E8 5E E1 33 C0 EB 29 B8 1 0 81 BE A0 0 0 51");
  Serial.println("");

  Serial.println("EOF");
}

这是我的Python代码,告诉Arduino开始转储并阅读响应:

line = " "

ser = serial.Serial("COM10", 115200, timeout=1)
ser.write("1")
ser.flush()

while line != "EOF":
    line = ser.readline().strip
    print line

ser.close()

问题:它什么都没打印。

PS:已经尝试了不同的超时值,但0或无效。

编辑:邀请其他人参加!我使用的是Python 2.7.6 - Anaconda 1.9.2 32bit @ Win7x64

EDIT2 解决方案是在python中第一次写入之前添加2secs(time.speep(2))的延迟。更多详情:pySerial works fine in Python interpreter, but not standalone

1 个答案:

答案 0 :(得分:0)

Pyserial肯定没有问题阅读arduino序列...我已经做了很多次

试试这个

ser = serial.Serial("COM10", 115200, timeout=5)
ser.flush()
ser.write("1")
print ser.read(1000)
ser.close()

或进一步抽象

class MySerial:
    def __init__(self,*args,**kwargs):
       kwargs["timeout"] = kwargs.get("timeout",5) #ensure timeout set
       self.ser = serial.Serial(*args,**kwargs)

    def query(self,cmd):
       self.ser.flush()
       self.ser.write(cmd)
       return self.ser.read(100000)

ser = MySerial("COM10", 115200, timeout=5)
print ser.query("1")

我也有点好奇你为什么要把字符串写成一个字符串所有空格分开,而不是只写字节...

您可以验证您可以按如下方式获取读数

void setup() {
  Serial.begin(115200);
}

void loop() {
    Serial.read();
    Serial.println("Hello World!\r");
}

这将等待任何事情然后发送hello world字符串...确保你看到至少然后继续调整它以按照你想要的行为(EG。在继续之前从读取中获取特定值,发送消息其他比你好世界...我的猜测是它不会因为某种原因超过你的Serial.read()