Sv-610 uart помогите с кодом!

prohor-nastya

✩✩✩✩✩✩✩
30 Ноя 2020
51
1
Есть такие модули:
https://drive.google.com/file/d/1wV1At9rJcVUQEyCPcBJwIaCk6AwXtw_q/view?usp=sharing
или
http://docs.voltbro.ru/gorocket/devices/sv610_Datasheet.pdf

Примеров для ArduinoIDE для них нет.
Как передать и принять данные вроде понятно, НО как зашить в них настройки не понятно.
К этим радиомодулям идет программка и USB преобразователь, через который можно вбить настройки с ПК.
Но нам необходимо менять канал в полевых условиях (по условию соревнований). Модуль уже будет впаян.
В даташите есть описание команд, при подтяжке разъема S к земле, команда отправляется в Serial и назад приходит ответ типа Ок или Ошибка.
Примеры из даташита:
Command : Read module name and version:
Instruction format: AA FA AA
Return value is:“SV610_VERx.x\r\n”
For example:
Instruction: AA FA AA
Return: SV610_Ver4.6 \r\n.
Command: Set the group parameters
Length of the command is 17 bytes, set 14 bytes of the parameters into the module, and format as follows:
Instruction format: AA FA 03 RF Channel / RF Band / RF Rate / RF Power / Serial transmission date
/ data bits / stop bits / parity / NET ID / NODE ID
The return is: "OK \ r \ n" or "ERROR \ r \ n"
Подскажите пожалуйста как это записать в коде. Как отправить эти 17 байт настроек и прочитать ответ.

Вот что я сам написал, но это явно дичь, знакомый говорит ответы надо парсить, а как это делать я не знаю. и он не знает, потому, что из под ассемблера программирует, и не знает С++.
Пожалуйста помогите.

Setup SV610:
#define Set  3
#define СS   4
byte setGrouParam[17]{AA,FA,03,14,01,01,07,03,02,01,01};
char nameVersion ;
char setParam ;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);                  // Инициируем аппаратный последовательный порт
  Serial1.begin(9600);                 // Инициируем программный последовательный порт

  pinMode(CS, OUTPUT);                  // Переводим вывод CS модуля в режим выход   
  digitalWrite(CS, HIGH);                // Назначаем выводу уровень логической единицы - включаем модуль
  delay(3000);           
  pinMode(Set, OUTPUT);                  // Переводим вывод S модуля в режим выход   
  digitalWrite(S, LOW);                // Назначаем выводу уровень логического нуля
  delay(2000); 
          
   nameVersion = Serial1.write(AA FA AA);
   delay(100);
   Serial.write(nameVersion);
   Serial.write('\n');
                                
   setParam = Serial1.write(setGrouParam,sizeof(setGrouParam)); //передаем настроечные байты из массива в Serial
   delay(100);
   Serial.print("Set the group parameters is ---");
   Serial.write(setParam);
 
  }

void loop() {
  // put your main code here, to run repeatedly:

}
 

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
для начала определите в каком формате данные должны передаваться, затем таймауты на прием и отправку ответа и после этого можно переходить к парсингу ответа
 

prohor-nastya

✩✩✩✩✩✩✩
30 Ноя 2020
51
1
Добрый день, подскажите пожалуйста как читать эту строку.
Непонятно как (чар) оказался перед сериал.
strData += (char)Serial.read();
strData = strData + (char)Serial.read(); как то не вяжется в голове...
 

prohor-nastya

✩✩✩✩✩✩✩
30 Ноя 2020
51
1
А можно отправить в UART какое то значение, и тут же это значение считать функцией Serial.read() ?
 

prohor-nastya

✩✩✩✩✩✩✩
30 Ноя 2020
51
1
[
подключайте ардуину к компу, отправлять будете Монитором порта, а принимать ардуиной
Афигеть! все работает, спасибо!

Осталось понять как отправить в модуль 17 байт, если из документации известно:
RF Channel = 1 - 40/ RF Rate = 0 - 9/ Serial transmission date = 0 - 9/ parity = 1 NODE ID = 00 00
RF Band = 01 - 04 / RF Power = 0 - 7/ data bits = 1 - 3 / NET ID = 00 00 00 00

Length of the command is 17 bytes, set 14 bytes of the parameters into the module, and format as follows:
Instruction format: AA FA 03 RF Channel / RF Band / RF Rate / RF Power / Serial transmission date
/ data bits / stop bits / parity / NET ID / NODE ID

У меня вызывают затруднения параметры которые в документации указаны целым числом. например, RF Rate должно равняться 3, а RF Band по документации должно равняться 01. Данные, как я понял из описания, должны отправляться в виде байт.

Я предположил, что это может выглядеть таким образом, первые три байта это хедер, а остальное настройки.
byte setGrouParam[17] {0xAA, 0xFA, 0x03, 0x14, 0x01 ,0x03, 0x07, 0x03, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
Serial1.write(setGrouParam, sizeof(setGrouParam));

Пожалуйста, подскажите, если я не правильно записал, как это будет правильно. 🙏 🙏 🙏
 

prohor-nastya

✩✩✩✩✩✩✩
30 Ноя 2020
51
1
Доброго времени суток всем!
Модуль принимает команды в таком формате: byte setGrouParam[17] {0xAA, 0xFA, 0x03, 0x14, 0x01 ,0x03, 0x07, 0x03, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; причем самое интересное какие-то значения встают в настройки в виде тех цифр которые отправляются, а какие-то переводятся в десятеричную систему. Но это в общем не проблема. Главное можно прошить модуль из под МК.
Но есть проблема:
При отправке в модуль команд:
Instruction format: AA FA AA // Return value is:“SV610_VERx.x\r\n” // For example: Instruction: AA FA AA // Return: SV610_Ver4.6 \r\n.
или
Instruction format: AA FA 02 // The return value in turn is: "OK \ r \ n" or "ERROR \ r \ n"
После этой команды модуль будет сброшен к настройкам по умолчанию, которые имеют следующие значения:
Frequency : Tx = Rx = CH20 = 433.92 MHz (Band = 433MHz)
RF data rate: Tx = Rx=9600 bps
RF power= 7 (Max output)
Serial: baud rate = 9600 bps Data bit= 8 Bits Stop bit = 1 Bits Parity bit=None
NET ID = 00 00 00 00 NODE ID = 00 00
приходит ответ в сериал, как положено в соответствии с инструкцией, типа: ОК и SV610_VER4.66

но при отправке команд:

Команда: для вывода всех параметров:
Instruction format: AA FA 01
The return value in turn is:
RF channel / RF band / RF data rate / RF power / Serial data rate / Series Data bit / Series Stop bit /Series Parity bit / NET ID / NODE ID /\r\n
Например, если модуль установлен по умолчанию, то возвращенные значения будут выглядеть следующим образом:


или
Команда: установки группы параметров
Instruction format: AA FA 03 RF Channel / RF Band / RF Rate / RF Power / Serial transmission date/ data bits / stop bits / parity / NET ID / NODE ID
The return is: "OK \ r \ n" or "ERROR \ r \ n"
ни какого ответа нет, при чем, вроде, даже в сериал ни чего не приходит, или если приходит, то пустота.
Но при этом настройки записываются в модуль... И очень хочется увидеть что записалось...

Где-то я чего-то не дописал, посмотрите пожалуйста, где нужно исправить?

вот код и результат выполнения кода:

2020-12-18 23-01-47.JPG

Setup SV610:
#define Set 4
#define Cs 5
byte setGrouParam[17]{0xAA,0xFA,0x03,0x14,0x01,0x03,0x07,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00};
byte nameVersionQ[3] {0xAA,0xFA,0xAA};
byte readOutParamQ[3] {0xAA,0xFA,0x01};


String dataString = "";
boolean recievedFlag;

  void readSerialData()
  {  Serial.println("Work read function... ");
    while (Serial1.available() > 0)         // ПОКА есть что то на вход 
    {
      dataString += (char)Serial1.read();   // забиваем строку принятыми данными
      recievedFlag = true;                   // поднять флаг что получили данные
      delay(5);                              // ЗАДЕРЖКА. Без неё работает некорректно!
    }
      if (recievedFlag)                      // если данные получены
    {
      Serial.print ("I am read ---- ");         
      Serial.println(dataString);               // выводим принятые данные на экран
      dataString = "";                          // очищаем переменную
      recievedFlag = false;                  // опустить флаг
    }
  }


void setup() {

  Serial.begin(9600);                  // Инициируем программный последовательный порт
  Serial1.begin(9600);                 // Инициируем аппаратный последовательный порт
  while (!Serial)
  {
    ;
  }
              
  pinMode(Cs, OUTPUT);                  // Переводим вывод CS модуля в режим выход 
  digitalWrite(Cs, HIGH);                // Назначаем выводу уровень логической единицы - включаем модуль
  delay(3000);
          
  pinMode(Set, OUTPUT);                  // Переводим вывод S модуля в режим выход 
  digitalWrite(Set, LOW);                // Назначаем выводу уровень логического нуля
  delay(2000);
  Serial.println("Serial is OK");        //проверка Serial
  Serial1.setTimeout (100);              // задержка 50мс

   Serial.println("Write command 1 to Serial1...");
   Serial1.write(nameVersionQ,3);        //отправляем модулю команду на вывод названия и версии модуля
   delay(10);
   readSerialData();

   Serial.println("Write command 2 to Serial1...");
   Serial1.write(setGrouParam,sizeof(setGrouParam)); //передаем настроечные байты из массива в Serial
   delay(10);
   readSerialData();

   Serial.println("Write command 3 to Serial1...");
   Serial1.write(readOutParamQ,3);        //отправляем модулю команду на вывод текущих настроек модуля
   delay(10);
   readSerialData();
  
  }

void loop()
{
  // put your main code here, to run repeatedly:

}
2020-12-18 23-01-47.JPG
 

prohor-nastya

✩✩✩✩✩✩✩
30 Ноя 2020
51
1
И снова здравствуйте.
Оказалось после отправки команды
byte setGrouParam[17]{0xAA,0xFA,0x03,0x14,0x01,0x03,0x07,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00};
потом ни чего не выводится - модуль не отвечает.
Если отправить команды
byte nameVersionQ[3] {0xAA,0xFA,0xAA};
byte readOutParamQ[3] {0xAA,0xFA,0x01};
отдельным кодом, тогда настройки выводятся на экран.
Наверное особенность модуля.
Вопрос решен тема может быть закрыта.
 

bort707

★★★★★★✩
21 Сен 2020
3,066
915
Оказалось после отправки команды
byte setGrouParam[17]{0xAA,0xFA,0x03,0x14,0x01,0x03,0x07,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00};
потом ни чего не выводится - модуль не отвечает.
наверно в этой команде есть что-то такое, что выключает вывод сообщений или вообще подвешивает модуль.
У вас четкое описание, что значит эта последовательность байт? Или вы просто троллите модуль вслепую ?
 

prohor-nastya

✩✩✩✩✩✩✩
30 Ноя 2020
51
1
Каждый байт, это настройка. После передачи данной команды в модуль, настройки меняются в соответствии с установленными.
Но ответ от модуля ОК или Error, не приходит. На другие команды если они отправлены раньше настроек ответ приходит в соответствии с документацией.
но есть странность, - последние 4 байта это имя модуля они отправляются 00 00. Но команда чтения настроек, на их месте выводи какие-то значения, сейчас не помню какие... Однако при подключении через USB - UART преобразователь в специальной (китайской) программке для настроек, видны 00 00.
Но на работу модуля не влияет. все передается...