早上好!最近我购买了一块Arduino板,想用它来制作类似于房间“光控”的东西。这是我编写的固件代码:
int control = 0;
int pin = 0;
void setup()
{
Serial.begin(9600);
for(pin = 0; pin <= 13; pin++) pinMode(pin, OUTPUT);
}
void loop()
{
control = Serial.read();
if (control > 0 && control <= 13) digitalWrite(control, HIGH);
if (control < 256 && control >= (256-13)) digitalWrite((256-control), LOW);
}
之后,我使用Python解释器中的pySerial控制引脚,一切都运行良好。以下是解释器输出的一部分:
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import serial
>>> ser = serial.Serial('/dev/ttyUSB0', 9600)
>>> ser.write(chr(12))
>>> # The light turned on here
...
>>> ser.write(chr(256-12))
>>> # The light turned off here
...
于是我决定编写一个简单的Python脚本来完成同样的任务:
#!/usr/bin/env python
import serial
import time
ser = serial.Serial('/dev/ttyUSB0', 9600)
ser.write(chr(12))
time.sleep(1)
ser.write(chr(256-12))
但它根本不起作用! Arduino显示在我启动脚本期间接收到了一些信息,但什么也没有发生。以下是脚本的一部分strace输出:
open("/dev/ttyUSB0", O_RDWR|O_NOCTTY|O_NONBLOCK) = 3
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(3, SNDCTL_TMR_START or TCSETS, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B9600 -opost -isig -icanon -echo ...}) = 0
open("/dev/ttyUSB0", O_RDWR|O_NOCTTY|O_NONBLOCK) = 4
ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(4, SNDCTL_TMR_START or TCSETS, {B9600 -opost -isig -icanon -echo ...}) = 0
ioctl(4, SNDCTL_TMR_TIMEBASE or TCGETS, {B9600 -opost -isig -icanon -echo ...}) = 0
write(4, "\f", 1) = 1
close(4) = 0
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f45cf4c88f0}, {0x4d9820, [], SA_RESTORER, 0x7f45cf4c88f0}, 8) = 0
exit_group(0) = ?
看起来一切都应该是好的,所以我不知道问题在哪里。我会感激任何帮助,提前致谢!
顺便说一下,当我在PDB下运行程序时,一切都正常。一个Heisenbug。
更新:我让控制器把它接收到的数据发回给我,结果在我运行脚本时它似乎没有接收到任何数据,但是在我从解释器发送数据时,它可以接收到所有数据。固件代码现在像这样:
int control = 0;
int pin = 0;
void setup()
{
Serial.begin(9600);
for(pin = 0; pin <= 13; pin++) pinMode(pin, OUTPUT);
}
void loop()
{
if (Serial.available() > 0)
{
control = Serial.read();
if (control <= 13) digitalWrite(control, HIGH);
if (control < 256 && control >= (256-13)) digitalWrite((256-control), LOW);
Serial.println(control);
}
}
ser.write(chr(12)); time.sleep(1); ser.write(chr(256-12))
是否正常工作? - seriyPSprint ser
是否相同?1. 将代码放入def main():..
中,并使用if __name__=="__main__": main()
进行调用保护。2. 在第一个ser.write()
之前添加time.sleep(2)
。3. 每次写入后添加flush()
。4. 添加ser.close()
。 - jfswhile not ser.isOpen(): time.sleep(0.04)
。 - jfs