Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 2190|回復: 0
打印 上一主題 下一主題

是HC-05還是程式的問題?

[複製鏈接]
跳轉到指定樓層
1#
發表於 2015-6-4 01:25:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最後由 nethawk 於 2015-6-4 01:30 編輯

不好意思﹐我沒什麼電子基礎的﹐我會的是電腦上的程式﹐但我一直很想用電腦/手機去控制arduino ﹐所以一直想學習﹐但碰到一些情況一直不清楚是那裏的問題﹐特來請教一下。

我從微軟下載一支範例 https://code.msdn.microsoft.com/Bluetooth-communication-7130c260 ﹐依這個範例在電腦端按下button會讓燈號亮起來或關掉。依照範例將東西都準備好﹐執行後確實可行,但是﹐每一次在電腦端按鍵送出動作﹐在arduino收到訊息的情況並不穩。


  1. void loop() {
  2.     readBluetooth();
  3.     ........
  4.     ........
  5. }
  6. //connection handling
  7. void readBluetooth(){
  8.       while (btSerial.available()) {
  9.            int commandSize = (int) btSerial.read();
  10.            Serial.println("commandSize = " + String(commandSize));
  11.            char command[commandSize];
  12.            int commandPos = 0;
  13.            while (commandPos < commandSize) {
  14.                   if (btSerial.available()) {
  15.                         command[commandPos] = (char) btSerial.read();
  16.                         Serial.println("command=" + String(command));
  17.                         commandPos++;
  18.                   }
  19.             }
  20.             command[commandPos] = 0;
  21.             processMessage(command);
  22.     }
  23. }
複製代碼


我有兩個問題
1.我在上面的代碼中加上兩個Serial.println 由監控視窗來觀察﹐當我在電腦按下一個按鍵送出的資料是"TURN_ON_RED" 或者 "TURN_OFF_RED" 來控制arduino 端的燈號﹐當電腦端送出"TURN_ON_RED"﹐在監控視窗應該見到以下的資料

但是重覆的在電腦端按按鍵送出資料﹐在監控視窗會發現不是每一次的資料接收都是正確的﹐有時會變成以下帶有奇怪資料﹐因為接收到的資料不正確就無法控制

請問這是什麼原因?在電腦端送出的資料﹐我很確定送出的指令是 "TURN_ON_RED" 或者 "TURN_OFF_RED" ﹐那麼為什麼監控視窗顯示的資料錯的﹐看起來很像是 btSerial.read() 每次讀到的資料不一定正確﹐是HC-05 在資料接收上不穩嗎?是硬體的問題嗎?還是有其它原因?

2. readBluetooth() 是在 loop() 中不斷的被呼叫﹐每次readBluetooth()被呼叫應該在readBluetooth中的程式會重新執行跟上一次readBluetooth被呼叫應該是無關﹐我的意思是程式中的
int commandSize = (int) btSerial.read();
char command[commandSize];
這應該都是每次執行readBluetooth()會被重新宣告重新給值﹐但是當第1個問題的錯誤發生﹐重覆的由電腦端送出指令﹐char command[commandSize];就會一直是錯的﹐好像一直受到前一次錯誤的影響。除非我將程式改為以下多一個break的動作﹐才有可能在錯誤發生後還能再重新正常接收資料。這是為什麼?這好像和一般程式的觀念有些不同。

  1. while (commandPos < commandSize) {
  2.      if (btSerial.available()) {
  3.            command[commandPos] = (char) btSerial.read();
  4.            Serial.println("command=" + String(command));
  5.            commandPos++;
  6.       }else{
  7.            Serial.println("*************************");
  8.            break;
  9.       }
  10. }
複製代碼
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2025-1-31 07:17 , Processed in 0.096776 second(s), 10 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表