[英]How do I get python IDLE/ GUI communicating with mbed board?
我需要一個與mbed(LPC1768)板通信的python GUI。 我可以將字符串從mbed板發送到python的IDLE,但是當我嘗試將值發送回mbed板時,它無法按預期工作。
我編寫了一個非常基本的程序,在該程序中,我從mbed板上讀取了一個字符串並將其打印在Python的IDLE上。 然后,程序應要求用戶鍵入一個值,該值應發送到mbed板。
該值應設置LED閃爍之間的時間。
python代碼
import serial
ser = serial.Serial('COM8', 9600)
try:
ser.open()
except:
print("Port already open")
out= ser.readline()
#while(1):
print(out)
time=input("Enter a time: " )
print (time)
ser.write(time.encode())
ser.close()
和mbed c ++代碼
#include "mbed.h"
//DigitalOut myled(LED1);
DigitalOut one(LED1);
DigitalOut two(LED2);
DigitalOut three(LED3);
DigitalOut four(LED4);
Serial pc(USBTX, USBRX);
float c = 0.2;
int main() {
while(1) {
pc.printf("Hello World!\n");
one = 1;
wait(c);
two=1;
one = 0;
wait(c);
two=0;
c = float(pc.getc());
three=1;
wait(c);
three=0;
four=1;
wait(c);
four=0;
}
}
該程序等待在IDLE中輸入該值並將其發送到mbed板,然后開始使用發送給它的值,但突然停止工作,我無法弄清原因。
您需要采取這一行:
c = float(pc.getc());
走出循環。
您的程序停止工作的原因是該行一直保持到您再次發送東西為止。 如果您僅發送一次,它將永遠等待。
如果要在程序進入while循環后動態設置等待時間,建議將回調函數附加到串行RX中斷。
RawSerial pc(USBTX, USBRX);
void callback() {
c = float(pc.getc());
}
Serial
使用互斥鎖,不能在mbed OS5的ISR中使用。 請改用RawSerial
。
int main() {
pc.attach(&callback, Serial::RxIrq);
while(1) {
// your code for LED flashing
// no need to call pc.getc() in here
one = 1;
wait(c);
one = 0;
wait(c);
}
}
這樣,LED會繼續閃爍,並且只要mbed接收到值,您就可以更新c
。
另外,您似乎正在發送ASCII字符。 ASCII 1
是十進制的49
。 因此,當您發送'1'
時, pc.get()
返回49
。 我認為那不是你想要的。 如果您總是發送一個數字( pc.getc() - 48
),則簡單的解決方法是pc.getc() - 48
。 但是您最好將string
解析為int
並在python端進行錯誤處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.