// (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());
}
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");
}
可以看到程式正常的傳字串出來。
沒有留言:
張貼留言