解決 BeagleBoard-xM 讀取 Arduino 數據時出現 I/O Error 的問題
解決方法為修改 Arduino 代碼,只有當電腦傳送資料給它的時候,它才向電腦輸出資料:
#include <Wire.h> #include <Adafruit_BMP085.h> Adafruit_BMP085 bmp; int HIH_Pin = 2; float HIH_humid = 0; float temperature = 0; void setup() { Serial.begin(9600); bmp.begin(); } void loop() { if (Serial.available() > 0) { Serial.read(); temperature = bmp.readTemperature(); Serial.print("Temperature = "); Serial.print(temperature); Serial.println(" *C"); Serial.print("Pressure = "); Serial.print(bmp.readPressure()); Serial.println(" Pa"); HIH_humid = ((5 * analogRead(HIH_Pin) / 1024.0)/5 - 0.16) / 0.0062; HIH_humid = HIH_humid / (1.0546 - 0.00216 * temperature); Serial.print("RH = "); Serial.print(HIH_humid); Serial.println(" %"); Serial.println(); } }
修改程式之後我們便能以一個 console 傳送指令,另一接收數據。
先以 STTY 設定參數:
$ stty -F /dev/ttyACM0 cs8 9600 sane $ stty -F /dev/ttyACM0 cs8 9600 ignbrk -brkint -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts hupcl
接收:
$ cat < /dev/ttyACM0
每傳送以下指令一次,接收那邊便會出現數據:
$ echo "" > /dev/ttyACM0
或以以下 Python 程式,每隔兩秒下達指令再即時接收資料,再顯示出來:
import serial, time ser = serial.Serial('/dev/ttyACM0', 9600) time.sleep(2) while True: ser.write("a") for i in range(1,5): result = ser.readline() print result[0:len(result)-2] time.sleep(2)
本文連結