Arduino与pySerial的问题

1 投票
5 回答
3513 浏览
提问于 2025-04-16 07:50

我遇到了一些问题。我最近买了一块 Arduino Uno 板。我想做一些有趣的事情,比如通过我的电脑控制输入。我使用了 Python 和 pySerial,程序如下:

arduino = serial.Serial(portaCOM, 9600, timeout = 1)
... in loop ->
arduino.write(value)


  def sliderUpdate(self, event):
        pos = self.slider.GetValue()
        arduino.write(pos)
        time.sleep(.1)
        print arduino.readline()

try:
    arduino = serial.Serial(portaCOM, 9600, timeout = 1)
except:
    print "Errore di connessione alla porta seriale"

这个写入的值应该通过 USB 发送到我的板子上。加载到板子上的程序是:

 const int ledPin = 11;
 byte brightness;

 void setup(){
     Serial.begin(9600);
     pinMode(ledPin, OUTPUT);
 }

 void loop(){
     while(Serial.available()){
         brightness = Serial.read();
         Serial.print(brightness);
         analogWrite(ledPin, brightness); //LED doesn't refresh the brightness
         delay(10);
     }
 }

我的 LED 工作得很好。我尝试了 Arduino 提供的 Fade 示例,它也能正常工作。

我检查了程序是否正确发送数据。是的,它确实发送了,我收到的和我之前发送的是一样的。

它应该接收发送的值并设置 analaogWriter(pin, VALUE),但似乎有什么地方出错了或者没有正常工作。

我该如何解决这个问题呢?

解决方案

Arduino 代码:

const int ledPin = 11;
byte valoreLed;

void setup(){
    Serial.begin(9600);
    pinMode(ledPin, OUTPUT);
}

void loop(){
    while(Serial.available()){
        valoreLed = Serial.read();
        analogWrite(ledPin, valoreLed);
        delay(20);
    }
}

Python 脚本代码:

pos = self.slider.GetValue()
arduino.write(chr(pos))

谢谢大家!! :)

5 个回答

1

我看到你在评论里提到,LED在第一个字符时能正常工作,但在不同字符时没有变化。一定要确保你发送的ASCII字符和之前的字符有明显的区别,比如可以先发送ASCII 0,然后再发送ASCII 255。

编辑: 既然你说FadeLED的例子能正常工作,那你可以在这个例子上加上串口功能吗?比如,只有在接收到串口字符后才进行渐变。这至少能让你确认串口和LED可以在你写的代码中一起工作。另外,我假设你使用的是这里的FadeLED例子。如果是这样,确保你设置了正确的引脚编号,因为参考代码使用的是引脚9,而你的示例代码使用的是引脚11。

另一个编辑: 你说从Arduino那里正确接收到了字符,但你使用的是pySerial的ReadLine函数,这个函数会一直等待直到看到换行符,而我在Arduino的代码中没有看到会生成换行符的内容。为了减少问题中的变量,试着使用HyperTerminal或类似的串口程序来发送字节到Arduino,而不是用你的Python程序。例如,你可以发送空格字符(ASCII 32)和'}'字符(ASCII 125),这两个字符的差异应该足够明显,能在LED上产生可见的变化。

1

我怀疑 arduino.readline() 这个命令是在等着接收到一个换行符,而你的Arduino代码从来没有发送过换行符。所以,当Python代码发送第一个值后,就会一直卡在那里,不会继续往下执行。

2
  1. 首先,确保你的LED灯连接正确。长脚(阳极)要接到PWM 11端口,短脚(阴极)要接到地线。如果你的LED需要的话,可能还需要在阴极和地线之间加一个电阻。
  2. 确保你在Python中写入的是正确的端口(这个端口是和你的操作系统中的FTDI线缆关联的)。
  3. 如果你没有使用带USB接口的FTDI线缆,确保所有的引脚都连接到正确的输入上。
  4. 在你的例子中,value的值是什么?试试用arduino.write(chr(0xFF)),看看LED灯是否保持亮着?

撰写回答