Страница 1 из 1

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

Добавлено: Пт авг 12, 2016 09:20:02
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
            }
        }
                  
  } 
}

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

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

Добавлено: Пт авг 12, 2016 12:02:41
Пока_без_кота
Я не експерт, и это немного оффтоп, но я спрошу. Зачем Вам 2 виртуальных COM-порта ? Чем 1 не справится с этой задачей ?

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

Добавлено: Пт авг 12, 2016 15:51:16
DimaWyxapt
Один не справится, тк ардуина ставится в разрыв СОМ линии.
Или Вы о том, что хватило бы поставить один программный а другой аппаратный?

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

Да. Странный проект.

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

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

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

Добавлено: Пт авг 12, 2016 22:25:04
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);
ответить, и дальше сидеть в буферном режиме.
Ардуина используется как отладочный инструмент. Если удастся реализовать алгоритм и отладить код то будет установлено что-то попроще.

Таки есть замечания по коду?

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

Добавлено: Сб авг 13, 2016 00:54:50
pcb

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

if (buffInLoad[i]= var[i]){                     // Если принятые значения [b]не равны исходным в массиве[/b] то
Это так и должно или всё таки там неравенство подразумевалось "!="?

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

Добавлено: Сб авг 13, 2016 09:38:32
DimaWyxapt
Нет, это опечатка

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

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

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

Добавлено: Вс авг 14, 2016 12:03:35
DimaWyxapt
Ага, спасибо, опробую