МК меня не понимать. Serial команды не опознаются.

UserDead
UserDead аватар
Offline
Зарегистрирован: 29.11.2015

Снова здравствуйте всеуважаемые.

Снова я. Сновас с трудностью и надеждой хоть какой-то подскзки)

Суть: Организовал softwareSerial между двумя девайсами. Команды устроены таким образом что одни идут с ПК конкретно на девайс 1, другие команды идут транзитом через 1-й второму. Причем отсылаю на аппаратный порт строку TX2690XT а тот понимает то нужно сделать и шлет его дальше на программный порт второму с изменением первой цифры чтобы тот принял команду. Первая цифра это адрес кому сообщение. Метки TX-XT маркеры пакета команды. 

Кусочек активного кода. (Упрощен)


#include <ShiftRegister74HC595.h>
#include <SoftwareSerial.h>
SoftwareSerial softSerial(3, 4); // RX, TX
int netReqpin = 19;
int errSignalPin = 12;
String rxData; //receive data buffer patriculator
String rxCheck; //receive packer validator
String netComm; // receive command (net - network)
String netOutbuffer; // ouput data buffer. for what? i thing this is better than formatting directly in Serial.println("data"blablabla_vars) size? i don't know....
String netDatax; //received data in 3-rd section
int netCommSwitch; //var for define 3-rd part of command stores a 0, 1, 3 difits (disable, enable + switch, error)
int compare; //compare strings var for compare function for detect errore on receive
int netCommdigit; //extracted from srting typed variable and converted to integer digit (tell about number of device)
int devPinouts[61] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};  //variable for store status of switchers&leds



void setup() {
  Serial.begin(9600);
  softSerial.begin(9600);
  softSerial.println("Started///_W");
  Serial.println("Write_module_started///");
  pinMode(netReqpin, INPUT);
  pinMode(13, OUTPUT);

}

void loop() {
  readSerialDatax();

}



void readSerialDatax() {
  //function for write data to another controller when he request that
  //if (digitalRead(netReqpin) == 1)
  //{
    val = rxData;
  rxData = "";
  netDatax = "";
  netComm = "";
  netCommdigit = 0;
  while (Serial.available())    //if we have something on serial buffer
  {
    char buff = Serial.read();     //read that
    rxData += buff;  //add to string
  }
   while (softSerial.available())    //if we have something on serial buffer
  {
    char buff = softSerial.read();     //read that
    rxData += buff;  //add to string
  }
  rxCheck = rxData.substring(0, 2);  //copy portion of start string mark
  compare = rxCheck.compareTo("TX"); //compare to
  if (compare == 0) //if compare success
  {
    rxCheck = rxData.substring(6); //copy a ner end mark string portion to another variable
    compare = rxCheck.compareTo("XT"); //compare to
    if (compare == 0) //if start and end marks are ok
    {
      //packet valid, continue...
      if (rxData.substring(2, 3) == "3") //Read device address
      {
        netComm = rxData.substring(3, 5); //current number
        netCommdigit = netComm.toInt();  /////////////////////////////////////////////////////////optimize?!
        if (netCommdigit == 61) {
          //|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
          Serial.print("DISABLE---");
          softSerial.println("DISABLE---");
          sr.setAllLow();
          for(int i=0; i<61; i++){
            devPinouts[i] = 0; 
          }
        }
        if (netCommdigit == 62) {
          //|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
          Serial.print("ENABLE---");
          softSerial.println("ENABLE---");
          sr.setAllHigh();
                    for(int i=0; i<61; i++){
            devPinouts[i] = 1; 
          }
        }

        if (netCommdigit > 20 && netCommdigit < 41)
        {
          netDatax = rxData.substring(5, 6); //this is define command or req
          if (netDatax == "0") {
            //this is an disable device command
            devPinouts[tS1] = 0;
            devPinouts[tS2] = 0;
            Serial.println("Off");
            softSerial.println("Off");
          }
          if (netDatax == "1") {
            devPinouts[tS1] ++; //do what we do
            }

        }
      }
    }
    if (compare != 0) //if compare fail (bad packet)
    {
      if (compare != -84) //-84 this is empty data, ignore this
      {

        //|00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
        Serial.print("ERR receivening|||   i receive: ");
        Serial.println(rxData);
        softSerial.print("ERR receivening.WRITER|||   i receive: ");
        softSerial.println(rxData);
        rxData = "";
      }
    }
  }
  delay(200);
}

Такие пирожки. Проблема в том что я шлю с ПК комманду, та по идее принимается и дублируется с изменением адреса устройства  (в нашем случае он 3) и шлет ее по программому порту. А тот пишет правильный пакет в ошибке. ERR receivening.WRITER||| i receive: TX3621XT

Прямое подключение рабоатет как нужно, транзит не понимает. Маркеры TX-XT на месте. Длина команды фиксированная. Что я упустил?

UserDead
UserDead аватар
Offline
Зарегистрирован: 29.11.2015

Ах да, я научил первый МК читать что отвечает второй МК. Поэтому я вывел ошибку. До этого я не смог подключиться через UART как снифер для прослушки обмена.

Краткий алгоритм разбора: Проверяем есть ли метки TX-XT на своих местах. Так и другие данные после проверки меток. Они смотрятся в первую очередь. Вывел метки отдельно и использую compareTo из-за того что просто сравнение не катит почемуто.

Если пакет меньше-больше - ошибка. Если повреждено начало-конец тоже. Только тело не имеет защиты. Да и не нужна она на мой взгляд в теле.

UserDead
UserDead аватар
Offline
Зарегистрирован: 29.11.2015

Неужели никто не сталкивался?  Как вы парсите команды по серийному порту?

UserDead
UserDead аватар
Offline
Зарегистрирован: 29.11.2015

Начал играться.

Заменил сравненеие меркеров на startsWith и endsWith работает как надо.

Создаю удаленный serial сервер.  Из самого сервера все понимается нормально. Шлю команду через putty в сервер к которому подключен serial - не понимает. В буфере команда правильная. Тоесть проблема в конкретном формате отправки?! Потому что ту же ошибку я получил и на аппаратном порте.

И тут тоже интересно. Подключаюсь к программному порту. Шлю с сервера. Все правильно. Шлю с удаленной консоли, не понимает снова. Тоесть проблема в самой передаче. Если напрямую с пк (сервера) понимает, то что не так в связке

мк - мк

UserDead
UserDead аватар
Offline
Зарегистрирован: 29.11.2015

Разобрался. Как хотите, можно тему и удалить. Если нет, тогда причина.

Отследил монитором и дошло. Использовались функции serial.println(blablabla) суть как раз в println. Он шлет вконце два байта, и какие же?! Правильно! CR-LF (0d 0a). В итоге было TX3621XT..  

Только не доходит почему в старой проверке где была привязка к позиции символов последние два символа XT были на месте, и только потом эти две команды окончания строки. В общем загадка. Теперь проблему повторить не могу. Ну и ладно, нечего насиловать. 

Изменение на Serial.print(blablabla); дало результат.