HC-12 модуль радиосвязи uart
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: HC-12 модуль радиосвязи uart
Ну я понял. У меня есть avr910. Я записал загрузчик и фьюз биты скачал
- Реклама
Re: HC-12 модуль радиосвязи uart
это надо сидеть разбираться с библиотекой...mixon46 писал(а):Есть класс serial. В нём есть список методов. Но в этом списке нет метода Serial.readSerial. Этот метод берётся из класса Stream.
Кто может помочь разобраться как это работает на живом примере
это долго и нудно))
проще писать на С. Можно прямо в самой среде ардуино писать.
например надо передать байт по UART. Это две строчки кода.))
UDR = 1; // передать байт 1
while ( ! (UCSRA & (1<<UDRE) ); // ждём окончания передачи байта 1
Всё))
и т.д. и т.п.
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: HC-12 модуль радиосвязи uart
Понимаю. Но немного не хватает знаний. Допустим я отправляю в uart текст из трёх байт. У uart же буфер 64 байта верно? Как мне "123" считать строку в С? Записать в массив а потом поочерёдно проверять байты? Я это не понимаю
Re: HC-12 модуль радиосвязи uart
а что там понимать... всё предельно просто))
если артдуино собрано на ATmega328 то просто открываем даташит и смотрим как работает UART в ATmega328... Добавлено after 11 minutes 37 seconds:
в режиме передачи:
- записываем байт в регистр UDR.
- как только в регистре UDR появляется байт он сразу передаётся в передающий регистр.
- из передающего регистра идёт передача... аналогично в режиме приёма... только всё в обратной последовательности... вывод:
передавать и принимать по UART можно только по одному байту...
Например так:
UDR = 1; // передать байт 1
while ( ! (UCSRA & (1<<UDRE) ); // ждём окончания передачи байта 1
UDR = 2; // передать байт 2
while ( ! (UCSRA & (1<<UDRE) ); // ждём окончания передачи байта 2
UDR = 3; // передать байт 3
while ( ! (UCSRA & (1<<UDRE) ); // ждём окончания передачи байта 3
...
и т.д.
Что тут сложного ?))

точно так же работает и SPI...
если артдуино собрано на ATmega328 то просто открываем даташит и смотрим как работает UART в ATmega328... Добавлено after 11 minutes 37 seconds:
в режиме передачи:
- записываем байт в регистр UDR.
- как только в регистре UDR появляется байт он сразу передаётся в передающий регистр.
- из передающего регистра идёт передача... аналогично в режиме приёма... только всё в обратной последовательности... вывод:
передавать и принимать по UART можно только по одному байту...
Например так:
UDR = 1; // передать байт 1
while ( ! (UCSRA & (1<<UDRE) ); // ждём окончания передачи байта 1
UDR = 2; // передать байт 2
while ( ! (UCSRA & (1<<UDRE) ); // ждём окончания передачи байта 2
UDR = 3; // передать байт 3
while ( ! (UCSRA & (1<<UDRE) ); // ждём окончания передачи байта 3
...
и т.д.
Что тут сложного ?))
точно так же работает и SPI...
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: HC-12 модуль радиосвязи uart
А если я хочу передать по типу Serial.print ("text") ;
Или же хочу принять по типу String stroka = Serial.readString ();
Как такое сделать в cvavr?
Или же хочу принять по типу String stroka = Serial.readString ();
Как такое сделать в cvavr?
- Реклама
Re: HC-12 модуль радиосвязи uart
во-первых надо вспомнить какие бывают переменные...
байтовые...
строковые...
булевы...
...
Serial.print ("text") ; // передаём в функцию Serial.print () переменную "text".
далее функция Serial.print () переводит переменную "text" в массив байт (74 65 78 74) и передаёт по UART байты (74 65 78 74).
Как имеено это делает библиотека ардуино... я без понятия)) это надо сидеть и разбираться... а это долго и нудно))
unsigned char x;
unsigned char bufer[]={"text"};
for (x=0; x<4 ; x++) {
UDR = bufer[x]; // передать байт из bufer
while ( ! (UCSRA & (1<<UDRE) ); // ждём окончания передачи байта
};
или можно так:
unsigned char x;
unsigned char bufer[]={"text|"};
for (x=0; bufer[x] != '|' ; x++) {
UDR = bufer[x]; // передать байт из bufer
while ( ! (UCSRA & (1<<UDRE) ); // ждём окончания передачи байта
};
можно и по другому...
в любом случае cvavr при компиляции автоматом переводит bufer[]={"text"}; в bufer[]={74 65 78 74}; и далее передаёт по UART байты (74 65 78 74).
Так же делают и другие компиляторы и программы...

Добавлено after 8 minutes 14 seconds:
[uquote="mixon46",url="/forum/viewtopic.php?p=4179880#p4179880"]Или же хочу принять по типу String stroka = Serial.readString ();[/uquote]
не понятно зачем это надо...
не знаю как в ардуино а в других прогах надо указать функции Serial.readString () массив куда сохранять принятые байты...
типа так:
unsigned char bufer[100]={};
String stroka = Serial.readString (bufer);
Но это не точно)) я без понятия как работает библиотека ардуино... ))

байтовые...
строковые...
булевы...
...
Serial.print ("text") ; // передаём в функцию Serial.print () переменную "text".
далее функция Serial.print () переводит переменную "text" в массив байт (74 65 78 74) и передаёт по UART байты (74 65 78 74).
Как имеено это делает библиотека ардуино... я без понятия)) это надо сидеть и разбираться... а это долго и нудно))
Например так:mixon46 писал(а):Как такое сделать в cvavr?
unsigned char x;
unsigned char bufer[]={"text"};
for (x=0; x<4 ; x++) {
UDR = bufer[x]; // передать байт из bufer
while ( ! (UCSRA & (1<<UDRE) ); // ждём окончания передачи байта
};
или можно так:
unsigned char x;
unsigned char bufer[]={"text|"};
for (x=0; bufer[x] != '|' ; x++) {
UDR = bufer[x]; // передать байт из bufer
while ( ! (UCSRA & (1<<UDRE) ); // ждём окончания передачи байта
};
можно и по другому...
в любом случае cvavr при компиляции автоматом переводит bufer[]={"text"}; в bufer[]={74 65 78 74}; и далее передаёт по UART байты (74 65 78 74).
Так же делают и другие компиляторы и программы...
Добавлено after 8 minutes 14 seconds:
[uquote="mixon46",url="/forum/viewtopic.php?p=4179880#p4179880"]Или же хочу принять по типу String stroka = Serial.readString ();[/uquote]
не понятно зачем это надо...
не знаю как в ардуино а в других прогах надо указать функции Serial.readString () массив куда сохранять принятые байты...
типа так:
unsigned char bufer[100]={};
String stroka = Serial.readString (bufer);
Но это не точно)) я без понятия как работает библиотека ардуино... ))
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: HC-12 модуль радиосвязи uart
Сброшу сюда архив с flash, eeprom, fuse битами бутлоадера на 32U4. Вдруг кому либо потребуется при замене микроконтроллера в плате arduino proMicro
- Вложения
-
- ProMicro 32U4.rar
- (517.3 КБ) 130 скачиваний
Re: HC-12 модуль радиосвязи uart
Задержка будет по любому, и ощутимая.
По умолчанию там режим FU3, скорость порта 9600, символьная скорость по воздуху 15000, фиксированный размер воздушного пакета 256 бит, полезная нагрузка 1...17 байт.
Передача 4-х байт:
4,17мс по UART
17,07мс по воздуху
4,17мс по UART на другой стороне
Итого: 25,41мс
Но будет еще какая то задержка на то, что бы модуль догадался что "больше байт не будет, и надо начинать передачу этих 4-х".
На практике, у меня получилась задержка получения ответа от удаленной стороны (аналог пинга) 104...124мс для пакетов 16 байт с шифрованием AES-128 на 328-й Меге при тактовой 9,216МГц.
Еще имейте ввиду, что эти модули подделывают все кому не лень, и каждый клепает свою прошивку, по этому совместимости между различными клонами нет, ни по протоколу, ни по задержкам, ни по багам.
По умолчанию там режим FU3, скорость порта 9600, символьная скорость по воздуху 15000, фиксированный размер воздушного пакета 256 бит, полезная нагрузка 1...17 байт.
Передача 4-х байт:
4,17мс по UART
17,07мс по воздуху
4,17мс по UART на другой стороне
Итого: 25,41мс
Но будет еще какая то задержка на то, что бы модуль догадался что "больше байт не будет, и надо начинать передачу этих 4-х".
На практике, у меня получилась задержка получения ответа от удаленной стороны (аналог пинга) 104...124мс для пакетов 16 байт с шифрованием AES-128 на 328-й Меге при тактовой 9,216МГц.
Еще имейте ввиду, что эти модули подделывают все кому не лень, и каждый клепает свою прошивку, по этому совместимости между различными клонами нет, ни по протоколу, ни по задержкам, ни по багам.
- mixon46
- Говорящий с текстолитом
- Сообщения: 1644
- Зарегистрирован: Сб фев 18, 2012 15:42:29
- Откуда: Курск
Re: HC-12 модуль радиосвязи uart
Ну не знаю. Я раньше испытывал. И каждый байтик приходил как надо. Правда расстояние было малым
Re: HC-12 модуль радиосвязи uart
А это не важно, на расстоянии 1км дополнительная задержка составит всего 3,3мкс 


