Arduino和pySerial的问题

时间:2010-11-30 22:01:20

标签: python c arduino pyserial

我遇到了问题。我最近买了一块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 个答案:

答案 0 :(得分:2)

  1. 首先,确保您的LED正确连接。阳极(较长引脚)至PWM 11端口和阴极(较短引脚)接地,您可能需要在阴极和地之间添加一个电阻,具体取决于LED。
  2. 确保您从python写入正确的端口(FTDI电缆与您的操作系统相关联)。
  3. 如果您没有使用带有USB接口的FTDI电缆,请确保所有引脚都连接到右侧输入。
  4. 您的示例中value的价值是多少?试试arduino.write(chr(0xFF)),LED是否会一直亮着?

答案 1 :(得分:1)

我在你的评论中看到LED与第一个字符一起工作,但你看不到不同字符的变化。绝对要确保您发送的ASCII字符与之前的字符明显不同,例如发送ASCII 0后跟ASCII 255。

编辑: 既然您说FadeLED示例有效,那么您可以采用该示例并为其添加串行端口功能吗?例如,仅在收到序列字符后淡出。这至少可以让您确信串口和LED可以在您编写的代码中共存。另外,我假设您正在使用here中的FadeLED示例。如果是这样,请确保设置正确的引脚编号,因为参考代码使用引脚9,但示例代码使用引脚11。

另一个编辑: 你说你从Arduino中正确地接收了字符,但是你正在使用pySerial ReadLine函数,它应该阻塞直到它看到换行符,并且我在Arduino代码中看不到任何会生成没有先发送给它的换行符。要消除问题中的变量数量,请尝试使用HyperTerminal或类似的COM端口程序将字节发送到Arduino,而不是Python程序。例如,您可以发送空格字符(ASCII 32)和'}'字符(ASCII 125),它们应该足够不同,以便在LED中创建可见的差异。

答案 2 :(得分:1)

我怀疑arduino.readline()等待换行符,而你的Arduino代码永远不会发送换行符。因此,Python代码在发送第一个值后无限期地阻塞。

答案 3 :(得分:0)

我首先要确定串口的哪一侧存在问题。

首先,您可以使用Arduino上的硬编码循环驱动LED吗? LED是否按预期改变亮度?

一旦这样做了,你可以让Arduino在终端应用程序(例如内置于Arduino IDE中)手动发送内容时做一些明显正确的事情。这可能需要更改Arduino代码。

一旦有效,我就会专注于Python代码,确保你正在使用正确的COM端口等。

答案 4 :(得分:-1)

“写入值应通过USB将值发送到我的电路板”

如果这不是拼写错误,则无法使用PySerial访问USB端口。有替代pyUSB,可能还有其他人。