【问题标题】:PySerial has problems reading ArduinoPySerial 在读取 Arduino 时出现问题
【发布时间】:2014-09-15 15:39:29
【问题描述】:

我想转储一个 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");
}

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

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 或 None 都不起作用。

编辑: 其他所有人都被邀请到 awnser!我正在使用 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

【问题讨论】:

    标签: python serial-port arduino pyserial


    【解决方案1】:

    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 字符串...确保您看到至少然后继续调整它以使其行为如您所愿(例如。在继续之前从读取中获取特定值,发送消息其他比你好世界...我的猜测是它不会超过你的Serial.read(),无论出于何种原因

    【讨论】:

    • 复制了您的代码,仍然没有打印任何内容。会不会是 arduino 发送速度太快而导致 python 捕获得太晚了?你确定 ser.flush() 和 ser.write("1") 的顺序吗?我不应该在写完缓冲区后刷新缓冲区吗?我读了一个ROM。所以串行流中有很多\Null、\EOF、\n、\r、...和其他控制序列,所以我认为最好通过以十六进制发送来避免这种情况。
    • hmmm 我从来没有遇到过任何问题......而且我已经用过很多次了
    • Ok .read() 不接受参数,但它有一个可用的返回码,因此:code void setup() { Serial.begin(115200); } void loop() { while(Serial.read() == -1); Serial.println("Hello World!\r"); } 根据需要在每个 Putty 上打印。但不是每个 PySerial。所以我尝试了:code void setup() { Serial.begin(115200); } void loop() { Serial.println("Hello World!\r"); },它的阅读效果很好!所以我想用 PySerial 发送有问题......
    • 太奇怪了!我添加了另一个 USB 串行转换器来“嗅探”TX、RX 线。 PySerial 发送良好,Arduino 应该做出反应。如果我将您的代码粘贴到 python 控制台中/将其作为脚本运行,则它不起作用,没有什么新东西。但是:如果我逐行输入代码,它的工作就像一个魅力!这是怎么来的?
    猜你喜欢
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多