Robofun 機器人論壇

標題: 請教 如何在UNO上讀取與接收兩個HC-05 [打印本頁]

作者: liu5123    時間: 2017-9-8 16:13
標題: 請教 如何在UNO上讀取與接收兩個HC-05
本帖最後由 liu5123 於 2017-9-8 16:22 編輯

如何在UNO板上可以同時接收與讀取兩塊HC-05的資料
當我把兩個HC-05接在UNO版子上  只有一塊HC-05能讀取和接收
也不知道程式該怎麼改 程式我也有改過但就是跑不動
請各位專家幫我看一下


#include <SoftwareSerial.h>   // 引用程式庫

// 定義連接藍牙模組的序列埠
SoftwareSerial BT(8, 9); // 接收腳, 傳送腳(第一組)
SoftwareSerial BT(6, 7); // 接收腳, 傳送腳(第二組)
char val;  // 儲存接收資料的變數

void setup() {
  Serial.begin(9600);   // 與電腦序列埠連線
  Serial.println("BT is ready!");

  // 藍牙透傳模式的預設連線速率。
  BT.begin(9600);
}

void loop() {
  // 若收到「序列埠監控視窗」的資料,則送到藍牙模組
  if (Serial.available()) {
    val = Serial.read();
    BT.print(val);
  }

  // 若收到藍牙模組的資料,則送到「序列埠監控視窗」
  if (BT.available()) {
    val = BT.read();
    Serial.print(val);
  }
}
作者: 超新手    時間: 2017-9-8 16:41
宣告第二組的時候,要改一下名字
例如
SoftwareSerial BT2(6, 7);
不過,softwareserial
不支援兩組同時接收
要呼叫 bt.listen()
或 bt2.listen()
所以
不見得很適合你用
作者: liu5123    時間: 2017-9-8 16:51
本帖最後由 liu5123 於 2017-9-8 16:56 編輯

這是我修改過的程式
但儲存變數 共用一個OK嗎??
而且下面都改過了


#include <SoftwareSerial.h>   // 引用程式庫

// 定義連接藍牙模組的序列埠
SoftwareSerial BT1(8, 9); // 接收腳, 傳送腳(第一組)   修改過
SoftwareSerial BT2(6, 7); // 接收腳, 傳送腳(第二組)   修改過
char val;  // 儲存接收資料的變數

void setup() {
  Serial.begin(9600);   // 與電腦序列埠連線
  Serial.println("BT is ready!");

  // 藍牙透傳模式的預設連線速率。
  BT1.begin(9600);   修改
  BT2.begin(9600);   新增
}

void loop() {
  // 若收到「序列埠監控視窗」的資料,則送到藍牙模組
  if (Serial.available()) {
    val = Serial.read();
    BT1.print(val);  修改
    BT2.print(val);  新增
  }

  // 若收到藍牙模組的資料,則送到「序列埠監控視窗」
  if (BT.available()) {
    val = BT1.read();  修改過
    Serial.print(val);  
    val = BT2.read();  新增
    Serial.print(val);    新增
  }
}
作者: 超新手    時間: 2017-9-8 19:41
不對,以下有個範例可參考
https://www.arduino.cc/en/Tutorial/TwoPortReceive
重覆一次
它不能兩個uart同時收資料
如果你不懂得要怎麼用,掉資料的機率是百分之百
作者: liu5123    時間: 2017-9-8 20:04
本帖最後由 liu5123 於 2017-9-8 20:29 編輯
超新手 發表於 2017-9-8 19:41
不對,以下有個範例可參考
https://www.arduino.cc/en/Tutorial/TwoPortReceive
重覆一次


這是原文  翻譯過來
她寫的意思是一個一個去讀取嗎??  那都會顯示出來嗎??
而且我不想只限USB端口   想要的是在UNO運行就能讀取



#include <SoftwareSerial.h>
//
SoftwareSerial portOne(10, 11);
SoftwareSerial portTwo(8, 9);

void setup() {
//打開串行通信並等待端口打開
  Serial.begin(9600);
  while (!Serial) {
    ; //等待串口連接。僅需要本機USB端口
  }


  // 開始每個軟件串口
  portOne.begin(9600);
  portTwo.begin(9600);
}

void loop() {
  // 默認情況下,最後一個初始化端口正在偵聽。
  // 當你想在一個端口上偵聽時,明確地選擇它:
  portOne.listen();
  Serial.println("Data from port one:");
  // 當有數據進來時,讀取
  // 並發送到硬件串行端口:
  while (portOne.available() > 0) {
    char inByte = portOne.read();
    Serial.write(inByte);
  }

  // 空行從兩個端口分離數據:
  Serial.println();

  // 現在在第二個端口上
  portTwo.listen();
  // 當有數據進來時,讀取
  // 並發送到硬件串行端口:
  Serial.println("Data from port two:");
  while (portTwo.available() > 0) {
    char inByte = portTwo.read();
    Serial.write(inByte);
  }

  //空行從兩個端口分離數據:
  Serial.println();
}



作者: 超新手    時間: 2017-9-9 07:40
1)SoftwareSerial 雖然號稱支援兩個以上 serial
但是有限制,也就是不能同時收資料
一旦用bt1.listen 切到 bt1
如果此時 bt2有資料送進來,bt2資料就會不見.用 bt2.listen 切到 bt2 , bt1的
資料也會收不到,所以很難用,需要一點程式技巧
建議改用 mega
2)這樣寫才對
BT1.listen();
while(BT1.available()) {
val = BT1.read();
Serial.print(val);
}
BT2.listen();
while(BT2.available()) {
val = BT2.read();  
Serial.print(val);
}

作者: liu5123    時間: 2017-9-9 20:01
本帖最後由 liu5123 於 2017-9-9 20:31 編輯

用官方的範例是成功了  可是我用手機傳送資料給HC-05 有顯示出來了


作者: liu5123    時間: 2017-9-15 05:32
本帖最後由 liu5123 於 2017-9-15 06:56 編輯

依照你的建議 去買了一塊MEGA2560 請問要怎麼去修改現有的程式碼  而且不懂要怎麼用他4個PORT 可以跟我說一下嗎= =  

附上之前的程式碼
#include <SoftwareSerial.h>

// 定義連接藍牙模組的序列埠
SoftwareSerial BT(8, 9); // 接收腳, 傳送腳(第一組)
SoftwareSerial BT2(6, 7); // 接收腳, 傳送腳(第二組)
char val; // 儲存接收資料的變數

void setup() {
Serial.begin(9600); // 與電腦序列埠連線

// 藍牙透傳模式的預設連線速率。
BT.begin(9600); // 非主控HC05
BT2.begin(9600); //主控HC05

Serial.println("BT & BT2 is ready!");
}

void loop() {

if (Serial.available()) {
val = Serial.read();
BT.print(val);
}

//非主控 HC 05 收一個資料 主控 HC 05 傳一個資料
while(BT.available())
{
val=BT.read();
BT2.write(byte(val));
delay(200);
}

}

作者: 超新手    時間: 2017-9-15 08:23
1) 把 softwareSerial 宣告拿掉(只要拿掉宣告即可)
也就是去掉以下

#include <SoftwareSerial.h>
SoftwareSerial BT(8, 9); // 接收腳, 傳送腳(第一組)
SoftwareSerial BT2(6, 7); // 接收腳, 傳送腳(第二組)

2) 把其他部份的
BT改成 Serial1
BT2改成 Serial2
就可以了
接腳的部份, 在版子上有定義
18, 19, 16, 17
作者: liu5123    時間: 2017-9-15 09:22
可以用了  發現改用MEGA 2560顯示訊息變得比較簡單了
但是依然無法分行..  就算是分行也沒辦法整組顯示  項訊息HELLO WORLD 只要分行就變成一行一個字..

作者: 超新手    時間: 2017-9-15 10:08
無法分行是指?
作者: liu5123    時間: 2017-9-15 15:10
我傳送訊息 第一次是 hello world  第二次也是hello world 第三次則是傳送123
但三個訊息黏在一起  像這樣(hello worldhello world123)  
但當我在傳送訊息的後面還是前面加了一行 BT.print("\r\n")
再次傳送訊息卻變成這樣
H
E
L
L
O

W
O
R
L
D
作者: 超新手    時間: 2017-9-15 15:35
本帖最後由 超新手 於 2017-9-15 15:59 編輯

應該是寫錯了
要把程式貼出來才知道為什麼
原則很簡單
如果是負責轉送的
就是 available,  read, write,
不用加delay或雜七雜八的東西
而主要傳送的, 就用
println("Hello world");


作者: 超新手    時間: 2017-9-15 16:18
如果用的是序列監控視窗,
記得要選  NL&CR

1.jpg (33.36 KB, 下載次數: 473)

1.jpg





歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2