Arduino: Cách tốt nhất để nhận và đọc Dữ liệu với SoftwareSerial là gì?


7

Tôi có Arduino kết nối với một mô-đun bluetooth HC-06.

Tôi sẽ không gửi dữ liệu từ một số Ứng dụng Android mà tôi đã viết cho Arduino và để Arduino thực hiện công việc tùy thuộc vào dữ liệu nhận được. Cho đến nay tôi đang gửi các giá trị Integer trong khoảng từ 0 đến 1024.

Thật không may mySerial.read () sẽ không kết thúc ở đây. Nó đọc dữ liệu dưới dạng một chuỗi lớn.

Chân mô-đun RX và TX của tôi được kết nối với chân Arduinos RX- và TX. (Bảng điều khiển không hiển thị bất kỳ dữ liệu nào khi tôi kết nối chúng với Cổng 10 và 11, vì vậy tôi nghĩ đây là cách SoftwareSerial định nghĩa Cổng RX và TX của Arduino ...)

Phác thảo của tôi:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
char character;
void setup()  
{
  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);

}
void loop() // run over and over
{
    String Data = "";
    while(mySerial.available()) {
     character = mySerial.read();
     Data.concat(character);
    // Serial.println(Data);
     Serial.println("foo");
    }

Điều này sẽ xuất ra:

154888143201270341421501588671750825906975101110241005969922864792711629540451369290213140600

Tôi không thể đọc dữ liệu này đúng cách và tôi không thể phân tích dữ liệu sang một số chức năng để xử lý nó, bởi vì mySerial.read () sẽ không kết thúc. Phải có một cách tốt hơn để nhận hoặc gửi Dữ liệu này.

Nguồn phát Bluetooth của tôi Nguồn:

public void sendPWM(int progress) {
            OutputStream tmpOut = null;
            try {
                tmpOut = mmSocket.getOutputStream();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                Log.e("error", "NO OUTPUT STREAM", e);
                e.printStackTrace();
                return;
            }

            try {
                // byte[] buffer = stringToBytesUTFCustom("1");

                byte[] buffer = String.valueOf(progress).getBytes();
                tmpOut.write(buffer);

                // tmpOut.flush(); /*I have turned this ON and OFF, to see if it
                // makes any difference*/

            } catch (IOException e) {
                // TODO Auto-generated catch block
                Log.e("error", "EXCEPTION DURING WRITE", e);
                e.printStackTrace();
            }

        }

Tôi không đóng outputStream, vì điều này cũng sẽ hủy kết nối với HC-06 và tôi phải gửi rất nhiều dữ liệu. Tôi không thể để người dùng kết nối lại với mô-đun mỗi lần anh ta gửi dữ liệu. Bạn có thể giúp tôi ra ở đây?


Trừ khi tôi thiếu một cái gì đó, bạn không cần phải nói rằng tiền gửi xe vào cuối mỗi lần đọc? Sau đó, trên Arduino khi bạn nhận được rằng bạn biết bạn đã đọc xong và có thể xóa bộ đệm tiếp theo cho lần đọc tiếp theo.
PeterJ

Tôi đã cố gắng và thêm vào +"\r\n"chuỗi của tôi. Điều này sẽ chỉ thêm một lần nghỉ và sẽ không dừng lạimySerial.read();
Wolfen

Tôi không chắc điều này có liên quan đến vấn đề của bạn không, nhưng tôi sẽ nghĩ rằng "while (mySerial.av Available ())" của bạn sẽ kết thúc trước Serial.println, nếu không bạn sẽ gửi lại cùng một đối tượng String mỗi lần nhân vật mới được thêm vào. Và vì bạn đang làm điều đó, bạn có thể sẽ lãng phí thời gian, do đó có khả năng thiếu một số nhân vật đến. Tôi giả sử những gì bạn muốn là đọc mySerial miễn là có nội dung cần đọc, thêm giá trị vào "Dữ liệu" và cuối cùng chỉ truyền được chuỗi "Dữ liệu" đầy đủ.
fm_andreas

Tôi đặt nó trong vòng lặp vì tôi muốn kiểm tra, liệu nó có in "foo" hay không. Như bạn có thể thấy, nó không bị kẹt. Ngay cả khi tôi đã thêm `mySerial.println (" foo my serial ");` nó sẽ không in.
Wolfen

Nó có in "foo my serial" khi nó ở trước vòng lặp while hay ngay cả trong setup () không?
fm_andreas

Câu trả lời:


5
#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX
String Data = "";

void setup()  
{
    mySerial.begin(9600);
}

void loop() // run over and over
{
    while (mySerial.available())
    {
        char character = mySerial.read(); // Receive a single character from the software serial port
        Data.concat(character); // Add the received character to the receive buffer
        if (character == '\n')
        {
            Serial.print("Received: ");
            Serial.println(Data);

            // Add your code to parse the received line here....

            // Clear receive buffer so we're ready to receive the next line
            Data = "";
        }
    }
}

Không làm việc. Nó bị kẹt tại mySerial.read (); thậm chí sẽ không kiểm tra dữ liệu đến cho \n...
Wolfen

3

Tôi biết nó hơi cũ, nhưng tôi đã làm cho nó hoạt động.

    #include <SoftwareSerial.h>

    SoftwareSerial mySerial(10, 11); // RX, TX
    String data = "";

    void setup()  
    {
        mySerial.begin(9600);
    }

    void loop() // run over and over
    {
      while(mySerial.available()==0)
      {}

      char character;
      while(mySerial.available()>0)
      {
        character = mySerial.read();
        mySerial.write(character);
      }

      data += character;

      if (character == 13) {  
        mySerial.print("Received: ");
        mySerial.println(data);
        data = "";
      } 
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.