Dzień dobry! Niedawno kupiłem planszę Arduino, żeby zrobić coś w rodzaju "kontroli światła" w moim pokoju. Oto kod firmware pisałem:pySerial działa dobrze w interpreterze Pythona, ale nie jest samodzielny.
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);
}
Następnie użyłem pyserial z interpretera Pythona kontrolować szpilki i wszystko działa dobrze. Oto kawałek wyjścia tłumacza:
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
...
Potem zdecydowałem się napisać prosty skrypt Pythona zrobić to samo:
#!/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))
Ale to nie działa w ogóle! Arduino pokazuje, że coś zostało odebrane podczas uruchamiania skryptu, ale nic się nie dzieje. Oto fragment wyjścia strace dla skryptu:
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) = ?
Wygląda na to, że wszystko powinno być w porządku, więc nie wiem, jaki może być problem. Byłbym wdzięczny za każdą pomoc, bardzo dziękuję z góry!
PS Po uruchomieniu programu pod PDB wszystko działa poprawnie. Heisenbug.
AKTUALIZACJA: Sprawiłem, że kontroler odsyła mi dane, które odbierał i wygląda na to, że nic nie otrzymuje po uruchomieniu skryptu, ale otrzymuje wszystko, gdy wysyłam dane z interpretera. Kod firmware teraz wygląda tak:
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);
}
}
Czy 'ser.write (chr (12)); time.sleep (1); ser.write (chr (256-12)) "działa dobrze z konsoli? – seriyPS
Tak. Światła włączają się, wyłączają, jpnevulator pokazuje dane zwrócone przez kontroler. Kiedy robię to samo ze skryptu, jpnevulator pokazuje brak danych i nic się nie dzieje. –
Uaktualniłem usługę pySerial, ale nie uzyskałem żadnych wyników. –