解決 BeagleBoard-xM 讀取 Arduino 數據時出現 I/O Error 的問題

先前嘗試經 serial port 讀取資料,常遇上 I/O Error,經調查,問題似乎在於打開 Arduino 的 port 前,它已經有資料經電路輸出,這會導致問題出現。

解決方法為修改 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)


本文連結