сеть RS-232 между arduino - нужна помощь

Тема в разделе "Arduino & Shields", создана пользователем SergeySV, 9 мар 2014.

  1. SergeySV

    SergeySV Нуб

    Коллеги подскажите делаю два взаимодействующих по RS232 устройства на базе Arduino Mega и Arduino Uno. В зависимости от внешних факторов одно из них передает в Serial порт текстовое сообщение. Которое надо потом сравнить с имеющимся значением в другом устройстве и отреагировать. Сеть двунаправленная - тоесть оба устройства в ней равнозначны и могут отправлять друг другу сообщения.

    Пробовал такой вариант но не работает. Чтото не так
    При компизяции пишет что error: invalid conversion from 'int' to 'const char*'

    Код (Text):
    if (Serial1.available()) {
      int inByte = Serial1.read();
      if(!strcmp(inByte,"TEST"))

    читаю из сериал порта фразы типа TEST
    Надо сравнить с значением

    Помогите начинающему ))))))
    Если не сложно то лучше примером



    Заранее СПАСИБО !
     
  2. geher

    geher Гуру

    Естественно. Попытка сравнения числа, представляющего код одного символа со строкой не имеет никакого смысла.
    Нужно либо читать посимвольно и сравнивать с символами строки, либо считать всю строку и сравнить со строкой.

    Например, реализация посимвольного ввода:
    Код (Text):
    char teststring[5]="TEST";
    int i=0;
    while (i<4){
      if (!Serial1.available()) break;
      int inByte = Serial1.read();
      if(inByte!=teststring[i]) break;
      i++;
    }
    if (i==4) {
       // Действия по строке "TEST"
    }
    Если придется сравнивать с несколькими строками-командами, то лучше делать считывание строки и сравнение ее с командой. В этом случае лучше каждую команду начинать с некоторой последовательности символов, обозначающей начало команды, и завершать другой последовательностью, обозначающей завершение команды. Эти последовательности не должны содержать символов, которые могут встретиться в самой команде.
    Это можно реализовать примерно следующим способом:
    Код (Text):

    int readstring(char startsym, char endsym, char* commandbuf, int commandbuflength)
    {
        char c=0;
        byte i=0;
        //firstsym
        while (i<commandbuflength)
        {
           if (Serial1.available()) {
              c=Serial1.read();
              commandbuf[0]=c;
              if (commandbuf[0]==startsym)  {
                 i++;
                 break;
              }
           }
        }
        if (i<1) return(0);
        //to end
       while ((i<commandbuflength)&&(c!=endsym))
       {
          if (Serial1.available()) {
             c=Serial1.read();
             commandbuf[i]=c;
             i++;
          }
       }
       return(i);
    }

    .....
    char teststring[7]="@TEST#";
    char readbuf[255];
    int L=readstring('@','#',readbuf,254);
    if (L && (!strcmp(readbuf,teststring)))
    {
      ...
    }
    .....
     
    В этом случае все команды должны начинаться с символа @, заканчиваться символом # и не должны содержать эти символы.
    функция readstring считывает данные из порта, пока не встретится символ начала команды и записывает данные в выходной буфер, начиная с этого символа, пока не кончится буфер или не встретится символ конца команды. Дальше можно анализировать строку команды.

    PS. Код набивал по памяти, возможны опечатки.
     
    Последнее редактирование: 9 мар 2014
  3. SergeySV

    SergeySV Нуб

    Вот спасибо Вам большое !!!! Я к сожалению в програмировании не бум бум - умею только из кусков готового кода собирать (((

    Можно последнюю просьбу
    Собрал загрузочник на базе вашего примера - но что то не компилится - ругается
    Можете глянуть что то не вижу в чем ошибка


    Код (Text):
    void setup() {
      // initialize both serial ports:
      Serial.begin(9600);
      Serial1.begin(9600);
    }

    void loop() {
    int readstring(char startsym, char endsym, char* commandbuf, int commandbuflength)
    {
        char c=0;
        byte i=0;
        //firstsym
        while (i<commandbuflength)
        {
          if (Serial1.available()) {
              c=Serial1.read();
              commandbuf[0]=c;
              if (commandbuf[0]==startsym)  {
                i++;
                break;
              }
          }
        }
        if (i<1) return(0);
        //to end
      while ((i<commandbuflength)&&(c!=endsym))
      {
          if (Serial1.available()) {
            c=Serial1.read();
            commandbuf[i]=c;
            i++;
          }
      }
      return(i);
    }

    char teststring[7]="@TEST#";
    char readbuf[255];
    int L=readstring('@','#',readbuf,254);
    if (L && (!strcmp(readbuf,teststring)))
    {
          Serial.print("YEAH!!!");

    }
    }
     
  4. geher

    geher Гуру

    Насколько я помню, в языке С не предусмотрено объявление функции внутри другой функции, а потому функцию readstring нужно вынести за пределы функции loop.

    Короче говоря строку
    Код (Text):

    void loop() {
     
    перенести после
    Код (Text):

       return(i);
    }
     
     
  5. geher

    geher Гуру

    Кстати об обещанных опечатках.
    Перед
    return(i);
    в функции readstring надо поставить
    Код (Text):

    commandbuf[i]=0;
     
    А то вызов strcmp не обнаружит в строке readbuf завершающего нуля, и программа будет работать неправильно.
     
  6. SergeySV

    SergeySV Нуб

    Тоесть так ?

    Код (Text):
    void setup() {
      // initialize both serial ports:
      Serial.begin(9600);
      Serial1.begin(9600);
    }

    int readstring(char startsym, char endsym, char* commandbuf, int commandbuflength)
    {
        char c=0;
        byte i=0;
        //firstsym
        while (i<commandbuflength)
        {
          if (Serial1.available()) {
              c=Serial1.read();
              commandbuf[0]=c;
              if (commandbuf[0]==startsym)  {
                i++;
                break;
              }
          }
        }
        if (i<1) return(0);
        //to end
      while ((i<commandbuflength)&&(c!=endsym))
      {
          if (Serial1.available()) {
            c=Serial1.read();
            commandbuf[i]=c;
            i++;
          }
      }
      commandbuf[i]=0;
      return(i);
    }

    void loop() {

    char teststring[7]="@TEST#";
    char readbuf[255];
    int L=readstring('@','#',readbuf,254);
    if (L && (!strcmp(readbuf,teststring)))
    {
          Serial.print("YEAH!!!");

    }
    }
     
  7. SergeySV

    SergeySV Нуб

    Странно но не загружается ((( хотя компилируется