Chào buổi sáng! Gần đây tôi đã mua một bảng Arduino để tạo ra loại "điều khiển ánh sáng" trong phòng của tôi. Đây là mã của chương trình cơ sở tôi đã viết:pySerial hoạt động tốt trong trình thông dịch Python, nhưng không độc lập
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);
}
Sau đó, tôi đã sử dụng pySerial từ trình thông dịch Python để điều khiển chân và mọi thứ hoạt động tốt. Dưới đây là một phần của đầu ra thông dịch viên:
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
...
Sau đó, tôi quyết định viết một kịch bản Python đơn giản để làm điều tương tự:
#!/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))
Nhưng nó không hoạt động ở tất cả! Arduino cho thấy một cái gì đó đã được nhận trong thời gian tôi phát hành kịch bản, nhưng không có gì xảy ra. Đây là một đoạn đầu ra cho kịch bản:
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) = ?
Dường như mọi thứ đều ổn, vì vậy tôi không biết vấn đề có thể là gì. Tôi sẽ đánh giá cao bất kỳ sự giúp đỡ, cảm ơn rất nhiều trước!
PS Khi tôi chạy chương trình trong PDB, mọi thứ đều hoạt động tốt. Một Heisenbug.
CẬP NHẬT: Tôi đã khiến bộ điều khiển gửi lại cho tôi dữ liệu đã nhận và có vẻ như nó không nhận được bất cứ thứ gì khi tôi chạy tập lệnh, nhưng nhận mọi thứ khi tôi gửi dữ liệu từ thông dịch viên. Mã của firmware bây giờ trông như thế này:
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);
}
}
Đã làm 'ser.write (chr (12)); time.sleep (1); ser.write (chr (256-12)) 'hoạt động tốt từ giao diện điều khiển? – seriyPS
Có. Đèn bật, tắt, jpnevulator cho thấy dữ liệu được trả về bởi bộ điều khiển. Khi tôi làm như vậy từ một kịch bản, jpnevulator cho thấy không có dữ liệu trả lại và không có gì xảy ra. –
Tôi nâng cấp pySerial, nhưng không có kết quả. –