Отладка алгоритма и кода

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 5
Зарегистрирован: Пт авг 12, 2016 09:07:33

Сообщение DimaWyxapt »

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

Необходимо создать 2 программных СОМ порта, которые будут пропускать через себя все данные, эдакий буффер.
Но, в тот-же момент искать в потоке определённый пакет данных, и по обнаружению выполнять последовательность действий, которая заключается в отправке 6 раз двух пакетов, и по окончанию отправки отправить ещё 2 пакета данных.

Код: Выделить всё

#include <SoftwareSerial.h>
SoftwareSerial rxSerial(12, 13);                                                                                   // Установка пинов программного порта приема  (RX, TX)
SoftwareSerial txSerial(0,1);                                                                                      // Установка пинов программного порта передачи (RX, TX)
void setup() {
  Serial.begin(115200);                                                                                            // Запуск аппаратного порта ,115200
  rxSerial.begin(115200);                                                                                          // Запуск программного порта, 115200
  txSerial.begin(115200);                                                                                          // Запуск программного порта, 115200
}
void loop() {                                                                                                      // Главный цикл
  if (rxSerial.available()) {                                                                                      // буфферный режим  передачи из SOFTSerial в HWSerial
    txSerial.write(rxSerial.read());
  }
  if (txSerial.available()) {                                                                                        // буфферный режим  передачи из HWSerial в SOFTSerial
    rxSerial.write(txSerial.read());
  }
int buffInLoad[]={0xAA,0x00,0x4F,0x4B,0x5F,0x56,0x36,0x2E,0x38,0x03,0x07,0x08,0x00,0x00,0xCC,0x33,0xC3,0x3C,'\0'}; // Исходный пакет готовности аппарата
int buffOut[]={0xAA,0x73,0x01,0x92,0x01,0x6C,0xCC,0x33,0xC3,0x3C,'\0'};                                            // Первый пакет данных 0
int buffOut1[]={0xAA,0x72,0x01,0x92,0x01,0x6C,0xCC,0x33,0xC3,0x3C,'\0'};                                           // Второй пакет данных 0
int buffOk[]={0xAA,0x73,0x01,0xE5,0x01,0xAF,0xCC,0x33,0xC3,0x3C,'\0'};                                             // Первый пакет данных 1
int buffOk1[]={0xAA,0x72,0x01,0xE5,0x01,0xAF,0xCC,0x33,0xC3,0x3C,'\0'};                                            // Второй пакет данных 1
int var[17]={};                                                                                               // Буфферный масив
bool key = false;                                                                                             // Булевый ключ
int  flag =0;                                                                                                 // Флаг передачи пароля
int j,i;
  if (rxSerial.available()){                         // Если порт доступен, то побайтно забиваем массив var байтами из него
     while (rxSerial.available()&& i<18){
       var[i++] = rxSerial.read();
       if (buffInLoad[i]= var[i]){                     // Если принятые значения не равны исходным в массиве то
        
        delay(10000);                                   // задержка для загрузки
        for (int i=0; i<6; i++){                       // отправка пакета 0 , 6 раз
        
        for (int j=0; j<10; j++){                      // побайтная отправка первого пакета 0
        Serial.write(buffOut[j]);
        }
        delay(85);                                     //задержка 85 мс
        for (int j=0; j<10; j++){                      // побайтная отправка второго пакета 0
        Serial.write(buffOut1[j]);  
        }
        flag = flag++;
      }
       //bool key = true;                              // устанавливаем ключ в положение false
       }
       }
       var[i++] = '\0';
       }
   if (Serial.available(), key !=false){             //проверка на начало загрузки, с помощью доступности порта и значения ключа
           
        if (flag = 6){                                     // проверка, если пакет отправлен 6 раз, то отправка 2-х пакетов
          
            for (int j=0; j<10; j++);{
            Serial.write(buffOk[j]);                 // побайтная отправка 1 пакета 1
            }
      
            delay(85);
      
            for (int j=0; j<10; j++);{
            Serial.write(buffOk1[j]);                // побайтная отправка 2 пакета 1
            }
        }
                  
  } 
}

Будьте добры, просмотрите что не так и где выползут косяки.
Реклама
Потрогал лапой паяльник
Сообщения: 359
Зарегистрирован: Чт авг 08, 2013 01:06:54

Сообщение Пока_без_кота »

Я не експерт, и это немного оффтоп, но я спрошу. Зачем Вам 2 виртуальных COM-порта ? Чем 1 не справится с этой задачей ?
Реклама
Родился
Сообщения: 5
Зарегистрирован: Пт авг 12, 2016 09:07:33

Сообщение DimaWyxapt »

Один не справится, тк ардуина ставится в разрыв СОМ линии.
Или Вы о том, что хватило бы поставить один программный а другой аппаратный?

Вообще это устройство делает следующее :
Общаются 2 устройства, и в какой-то момент одно запрашивает пароль. Необходимо словить этот момент, и отправить ей пароль и кнопку "ОК".
Программно убрать пароль с устройств не получится. Закрытый проект и так-же защиты от считывания и записи.

Да. Странный проект.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Можно несложной схемой на время передачи пароля перекинуть RX с устройства на контроллер (Ардуина тут сильно избыточна) и воспользоваться аппаратным UART'ом. Самое простое - реле, переключающее RX устройства, запрашивающего пароль либо на TX второго устройства, либо на TX контроллера. При этом RX контроллера и второго устройства могут быть подключены к TX устройства с паролем параллельно - это входы. Вариант чуть посложнее - внешняя логика, достаточно 4И-НЕ / 4ИЛИ-НЕ.
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 5
Зарегистрирован: Пт авг 12, 2016 09:07:33

Сообщение DimaWyxapt »

COKPOWEHEU, конечно, спасибо за вариант, но не хотелось бы усложнять схему. Варианты с перекидкой линии любыми способами неприемлемы. Данные идут от первого ко второму постоянно( индикация и метрология), и в момент переключения может случится ошибка.
Суть словить один пакет
int buffInLoad[]={0xAA,0x00,0x4F,0x4B,0x5F,0x56,0x36,0x2E,0x38,0x03,0x07,0x08,0x00,0x00,0xCC,0x33,0xC3,0x3C,'\0'}; // Исходный пакет готовности аппарата и запрос на ввод пароля
в начале, после инициализации, для этого и стоит
delay(10000);
ответить, и дальше сидеть в буферном режиме.
Ардуина используется как отладочный инструмент. Если удастся реализовать алгоритм и отладить код то будет установлено что-то попроще.

Таки есть замечания по коду?
Реклама
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Сообщение pcb »

Код: Выделить всё

if (buffInLoad[i]= var[i]){                     // Если принятые значения [b]не равны исходным в массиве[/b] то
Это так и должно или всё таки там неравенство подразумевалось "!="?
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Реклама
Родился
Сообщения: 5
Зарегистрирован: Пт авг 12, 2016 09:07:33

Сообщение DimaWyxapt »

Нет, это опечатка
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

А вы уверены что скорости хватит? Даже на максимальной частоте 20 МГц скорость обмена 115200 это 174 такта на бит, если тактовая частота Ардуины 16 МГц, это 139 тактов на бит. Два чисто программных приемника-передатчика такое скорее всего не потянут - лучше один аппаратный, второй - программно-аппаратный, на таймерах. Хорошим вариантом выглядит ATtiny2313, у которой есть одновременно UART и USI (на котором можно сделать UART), да еще два таймера.
Обмен по UART (неважно, программному или аппаратному) лучше вынести в отдельный "поток" или прерывания, это упростит программу и позволит избежать задержек.
Родился
Сообщения: 5
Зарегистрирован: Пт авг 12, 2016 09:07:33

Сообщение DimaWyxapt »

Ага, спасибо, опробую
Ответить

Вернуться в «AVR»