2016年2月6日 星期六

ROSA 系統開發 24 ─ 以軟體序列埠程式連接 Arduino 藍芽通訊

https://4rdp.blogspot.com/2016/02/rosa-24-arduino.html

雖然在 ROSA 系統開發 21 已經說明 HC-05 藍牙連線,但是這個方法會佔用 Arduino 的 pin 0 及 1,它是會影響 Arduino 程式的 USB 燒錄,如果你有多餘的空腳,可以改用軟體序列埠程式連接 Arduino 藍芽通訊,它會使用 Arduino 兩隻 IO 腳,本文選用 pin 3 及 13,












// (C) 2015-2016, Bridan Wang, CC BY-NC-SA 3.0 TW
// http://4rdp.blogspot.tw/search/label/ROSA%20(Arduino)

#include "SoftwareSerial.h"
SoftwareSerial BT(3,13);      // pin 3 RX   pin 13 TX

void setup(void) {
  BT.begin(9600);      // max 57600
}

void loop()
{
  if (BT.available())
    BT.write(BT.read());
}

注意本文的 HC-05 TXD 要接 Arduino 的 pin 3 RX,RXD 要接 Arduino 的 pin 13 TX,此外建議接一顆 1kΩ 電阻在 HC-05 RXD 與 Arduino pin 13 之間,請參考 http://swf.com.tw/?p=705 一文。

SoftwareSerial 是以軟體方式模擬 UART 通訊功能,因此它是很耗 Arduino MCU 的時間處理資源,無論字元傳送發射(TX)還是接收(RX),都需要一個字元一個字元處理,尤其 RX 無法處理連續字元傳入,上圖就是例子,由於連續傳送 AB 字元,Arduino 程式接到 A 字元傳入後,就立即處理傳出 A 字元,但是這時 B 字元也同時傳入,Arduino 程式沒有充裕的時間處理,造成 B 字元從中間開始接收,因此回傳 B 字元時,也就會回傳錯誤的 B 字元。

解決的辦法就是 Arduino 在資料接收期間,不要同時傳送資料,等資料或指令接收完畢後,再處理回傳資料,或是電腦端或手機端的程式一個字元一個字元傳送,字元之間至少間隔一個字元時間

順便說明,我如何確認這樣的因果狀況,其實這是經過多次 try and error 所得的結論,當發現這奇怪的問題時,先確認問題是在傳送還是接收端,首先只傳字元測試
void loop()
{
  BT.write("OK\r\n");
}
可以看到程式正常的傳字串出來。

然後 PC 端用 HyperTerminal 程式驗證,以打字的方式原 Arduino 程式也可以正常執行,不過以字串貼上方式輸入,可以看到空字出現,到此就可以推論出軟體序列埠程式庫無法同步全雙工通訊,未來 ROSA 引用這功能時,需要小心這部分限制。

沒有留言:

張貼留言