Отправка и приём данных HC-12

Dimasikooo
Offline
Зарегистрирован: 17.12.2020

Хотел с помощью модулей HC-12 передавать зашифрованные данные.

По итогу у меня получается так, что на приёме данные бьются.

Пример:

Отправил - f4f2b6db26f3666f4f00a7d588416f8330f5574d96e707f3f60eace320f21276

Принял - f4f2b6db26f3666f⸮f60eace320f21276

Возможно так выходит из-за того, что мк просто не успевает обрабатывать данные, но я не знаю, как это можно исправить.

Если строка короткая (Например - 123456) - данные принимаются нормально.

Помогите пожалуйста разобраться и решить данную проблему

+ почему-то данные нормально принимаются только в режиме FU3 (если не считать того, что длинные строки бьются), в других режимах данные не принимаются.

Передатчик - Arduino Nano, настройки дефолтные

Приёмник - Arduino Uno, настройки дефолтные

Код передатчика:
#include <SoftwareSerial.h>

SoftwareSerial radio(5, 4); // RX, TX

char data[100];

void setup()
{
  Serial.begin(9600);
  radio.begin(9600);
  
  // VCC,GND на HC12
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  digitalWrite(2, HIGH);
  digitalWrite(3, LOW);
}

void loop()
{
  radio.write(0xCD);
  char data[100] = "f4f2b6db26f3666f4f00a7d588416f8330f5574d96e707f3f60eace320f21276";
  radio.write(data, sizeof(data));
  radio.write('\n');
  delay(5000);
}

Код приёмника:

#include <SoftwareSerial.h>

SoftwareSerial radio(5, 4); // RX, TX

char data[100]; 

void setup() {
  Serial.begin(9600);
  radio.begin(9600);

  // VCC,GND на HC12
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  digitalWrite(2, HIGH);
  digitalWrite(3, LOW);
}

void loop() {
  if (radio.available() && radio.read() == 0xCD){
    radio.readStringUntil('\n').toCharArray(data, sizeof(data));
    Serial.println(String(data));              
  } 
}

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016
1) f4f2b6db26f3666f4f00a
2) radio.readStringUntil('\n')
 
0A == LF == '\n'
Dimasikooo
Offline
Зарегистрирован: 17.12.2020

sadman41 пишет:

1) f4f2b6db26f3666f4f00a
2) radio.readStringUntil('\n')
 
0A == LF == '\n'

Вот еще несколько кодов проверил

Заменил перенос строки на 0xAA

radio.readStringUntil(0xAA).toCharArray(data, sizeof(data));

Тут дело не в этом

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Для начала уберите из схемы радио и проверьте, передается ли информация напрямую.

sadman41
Offline
Зарегистрирован: 19.10.2016

Принимайте побайтово и выводите в Serial , чтобы локализовать проблему. Скорость вывода должна быть гораздо выше скорости приема.

Dimasikooo
Offline
Зарегистрирован: 17.12.2020

sadman41 пишет:

Принимайте побайтово и выводите в Serial , чтобы локализовать проблему. Скорость вывода должна быть гораздо выше скорости приема.

Не подскажете, как можно это реализовать?

Dimasikooo
Offline
Зарегистрирован: 17.12.2020

andriano пишет:

Для начала уберите из схемы радио и проверьте, передается ли информация напрямую.

Сейчас проверю, отпишусь

b707
Offline
Зарегистрирован: 26.05.2017

да вообще идея передавать зашифрованные данные в виде строк, вычитывая их с помощью readStringUntil() - абсолютно нежизнеспособна

Dimasikooo
Offline
Зарегистрирован: 17.12.2020

andriano пишет:

Для начала уберите из схемы радио и проверьте, передается ли информация напрямую.

Проверил, все передается нормально

Dimasikooo
Offline
Зарегистрирован: 17.12.2020

b707 пишет:

да вообще идея передавать зашифрованные данные в виде строк, вычитывая их с помощью readStringUntil() - абсолютно нежизнеспособна

Тогда какие есть адекватные аналоги?

b707
Offline
Зарегистрирован: 26.05.2017

Dimasikooo пишет:

Тогда какие есть адекватные аналоги?

свой протокол с заголовком. суффиксом и контрольной суммой

Dimasikooo
Offline
Зарегистрирован: 17.12.2020

b707 пишет:

Dimasikooo пишет:

Тогда какие есть адекватные аналоги?

свой протокол с заголовком. суффиксом и контрольной суммой

Я пока не сильно в этом разбираюсь, поэтому пока это сложновато, хотелось бы что-то проще

b707
Offline
Зарегистрирован: 26.05.2017

Dimasikooo пишет:

Я пока не сильно в этом разбираюсь, поэтому пока это сложновато, хотелось бы что-то проще

"проще" в протоколе - сложнее в передаче и приеме.

Эта задача имеет два решения - 1)простое 2)правильное. Простое ты уже попробовал.

Dimasikooo
Offline
Зарегистрирован: 17.12.2020

b707 пишет:

"проще" в протоколе - сложнее в передаче и приеме.

Эта задача имеет два решения - 1)простое 2)правильное. Простое ты уже попробовал.

Понял, хорошо. Есть примеры какие-то, как можно реализовать протокол этот?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вот буквально на днях была тема: http://arduino.ru/forum/programmirovanie/peredacha-dannykh-s-korrektsiei-oshibok

Dimasikooo
Offline
Зарегистрирован: 17.12.2020

andriano пишет:

Вот буквально на днях была тема: http://arduino.ru/forum/programmirovanie/peredacha-dannykh-s-korrektsiei-oshibok

Спасибо, буду разбираться

sergey.4kin
Offline
Зарегистрирован: 27.07.2022

Извиняюсь на некропостинг, но решение проблемы автора вот тут https://www.youtube.com/watch?v=NOfOsLXPY88. Там все из за 0 ломается. Нужно править библиотеку.