Текст, отправляемый через HC-05, разбивается на первый символ на принимающей стороне?

На принимающей стороне у меня есть приложение mit app inventor, которое действует как клиент.

В arduino я проверяю состояние соединения и выполняю последовательную запись для отправки текста. Код для этого приведен ниже:

#include <SoftwareSerial.h>

#define D2 2
#define D3 3
#define BT_STATE_PIN 4

SoftwareSerial BTSerial(D3, D2);
long lastMark;

void setup() {
  // поместите сюда свой установочный код, чтобы запустить его один раз:
  Serial.begin(38400);
  BTSerial.begin(9600);
  pinMode(BT_STATE_PIN, INPUT);    

  int counter = 0;
  lastMark = millis();
}

bool isBTConnected() {
  return (digitalRead(BT_STATE_PIN) == HIGH);
}

void sendText(char* message) {
  Serial.println("SEND: " + String(message));
  if(isBTConnected()) {
    BTSerial.write(message);
  }
  else {
    Serial.println("did not send");
  }
}

int msgCount = 0;
void loop() {
  long now = millis();

  if(now - lastMark > 2500) {
    msgCount++;
    String msg = "This is a really really long MSG" + String(msgCount);
    sendText(msg.c_str());  
    if(msgCount == 5) {
      msgCount = 0;  
    }    
    lastMark = millis();
  }  
}

Вот как в настоящее время подключено устройство:

schematic

Что касается app inventor, то у меня есть очень простое приложение, которое подключается к модулю Bluetooth; оно прослушивает все полученные данные, а затем просто получает текст.

файл aia

Вот рисунок, показывающий проблему, с которой я сталкиваюсь в настоящее время:

Иногда расставание происходит случайно в каком-то другом месте. Надеясь, что кто-нибудь сможет помочь разобраться в этой проблеме.

, 👍1


2 ответа


Лучший ответ:

0

Не имея опыта работы в AppInventor, я вижу следующую проблему:

В вашем приложении вы регулярно выводите полученные данные с помощью таймера в виде отдельных сообщений. Этот код, естественно, может отображать только текст, который уже был получен. Вы, кажется, думаете, что только потому, что вы используете одну строку кода на Arduino для отправки данных сообщения, данные будут отправлены одним большим куском. Для Serial это не так. На самом деле функция write() заполняет только буфер библиотек, и затем фактические данные будут отправляться последовательно (отсюда и название). Нет ничего лучше фрагмента данных или сообщения на последовательном интерфейсе, если только вы сами не применяете этот принцип к потоку данных. Все байты в буфере библиотек одинаковы и отправляются в порядке буфера. Более того, Bluetooth действительно состоит из пакетов данных, но они будут упакованы автоматически; таким образом, который не будет соответствовать вашим сообщениям.

Таким образом, в конечном итоге произвольные части вашего сообщения будут получены на телефон в произвольное время, которое сильно зависит от временных условий. В вашем коде вы должны постоянно получать данные и отображать сообщение только тогда, когда вы получили символ \n, который является разделителем сообщения. Это очень распространенный и полезный метод - сначала получить полное сообщение, а затем обработать его, когда сообщение будет завершено.

,

2

Я сделал что-то подобное (multiBT), используя HC-05 и PC BT, с тем же приложением. Результаты: все входящие данные с PC_BT на телефон верны, но с HC-05 иногда прерываются, как показывает @deostrol. Я думаю, это ошибка с прошивкой HC-05.

Чтобы исправить это, я внедрил символы StartBegin и StopFinish в полученную строку перед использованием.

,