Arduino принимает решение в соответствии с пакетом, полученным от последовательного порта - PullRequest
2 голосов
/ 26 января 2012

Программа прослушивает сообщения от последовательного порта в виде или где первый символ (A или D) означает аналоговый или цифровой, 2-й символ - контактный, 3-й символ - 1/0 или от 0 до 255. Маркеры < и> показать начало и конец пакета.

Например, если пакет получен, индикатор включает digitalWrite (13,1) Но ничего не происходит. Например, когда я посылаю через последовательный монитор: свет должен мигать, но это не так. То же самое с аналоговыми выходами.

bool started = false;
bool ended = false;
char inData[5];
byte index;


void setup() 
{
  Serial.begin(9600);
}

void loop() 
{
  while (Serial.available() > 0)
  {
    char inChar = Serial.read();


    if (inChar == '<')
    {
      index = 0;
      started = true;
      ended = false; 
    }

    else if (inChar == '>')
    {
      ended = true;
      break;
    }

    else
    {
      if (index <= 4)
      {
        inData[index] = inChar;
        index++;
      }
    }



     if (started && ended)
    {
      if (inData[0] == 'A')
      {
        pinMode(inData[2],OUTPUT);
        analogWrite(inData[2],inData[4]);
      }


      else if (inData[0] == 'D')
      {
        if (inData[4] == 1)
        {
          pinMode(inData[2],OUTPUT);
          digitalWrite(inData[2],HIGH);
        }

        else if (inData[4] == 0)
        {
           pinMode(inData[2],OUTPUT);
           digitalWrite(inData[2],LOW);
        }
      }
      started = false;
      ended = false;
      index = 0; 
    }

  }


Serial.println("Sending");  



}

Ответы [ 4 ]

4 голосов
/ 30 января 2012

Следующий код позволит вам выполнить метод с примером последовательной строки:

<power,led>

Как только он обработает эту строку, он выполнит следующий метод:

sendCommand(cmd, val);

См. Ниже пример того, как включить светодиод на PIN 11.

#include <avr/pgmspace.h>

int IRledPin = 11;

#define SOP '<'
#define EOP '>'

bool started = false;
bool ended = false;

char inData[80];
byte index;

void setup() {
  pinMode(IRledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  // Read all serial data available, as fast as possible
  while (Serial.available() > 0) {
    char inChar = Serial.read();

    if (inChar == SOP) {
       index = 0;
       inData[index] = '\0';
       started = true;
       ended = false;
    } else if (inChar == EOP) {
       ended = true;
       break;
    } else {
      if (index < 79) {
        inData[index] = inChar;
        index++;
        inData[index] = '\0';
      }
    }
  }

  // We are here either because all pending serial
  // data has been read OR because an end of
  // packet marker arrived. Which is it?
  if (started && ended) {
    // The end of packet marker arrived. Process the packet
    char *cmd = strtok(inData, ",");

    if (cmd) {
       char *val = strtok(NULL, ",");
       if (val) {
          sendCommand(cmd, val);
       }
    }

    // Reset for the next packet
    started = false;
    ended = false;
    index = 0;
    inData[index] = '\0';
  }
}

void sendCommand(char *command, char *value) {
  if (strcmp(command,"power") == 0) {
    power(value);
  }
}

void power(char* value) {
  if (strcmp(value, "led") == 0) {
    digitalWrite(IRledPin, HIGH);
  }
}
1 голос
/ 26 января 2012
  • Почему вы переходите с inData[0] на inData[2]?Разве второй символ не будет в inData[1]?

  • Вы устанавливаете pinMode в фактическое значение inData[2].Это означает, что для включения контакта 13 необходимо отправить символ возврата каретки ('\r').

1 голос
/ 26 января 2012

Если 2-ой символ является пин-кодом, тогда вы хотите inData[1] для ваших номеров контактов вместо inData[2].

0 голосов
/ 26 января 2012

Код не запускается ниже, но он должен помочь вам разобраться в вашей проблеме.

Он пытается разбить inData на массив Tokens [].

Затем он превращает данные ASCII в целые числа с помощью оператора atoi ().

Надеюсь, это поможет.

Получил сплиттер из Ошибка сегментации при использовании strtok_r

bool started = false;
bool ended = false;
char inData[5];
byte index;


void setup() 
{
  Serial.begin(9600);
}

void loop() 
{
  while (Serial.available() > 0)
  {
    char inChar = Serial.read();


    if (inChar == '<')
    {
      index = 0;
      started = true;
      ended = false; 
    }

    else if (inChar == '>')
    {
      ended = true;
      break;
    }

    else
    {
      inData[index] = inChar;
      index++;
    }


     if (started && ended)
    {

// /1652132/oshibka-segmentatsii-pri-ispolzovanii-strtokr
// Splint up input data
    char *p = inData;
    char *tokens[50];
    int i = 0;

    while (i < 50) {
      tokens[i] = strtok_r(p, ",", &p);
      if (tokens[i] == NULL) {
         break;
         }
      i++;
    }

    if (tokens[0] == '<A')
      {
        pinMode(tokens[1],OUTPUT);
        analogWrite(tokens[2],tokens[3]);
      }


      else if (token[0] == '<D')
      {
        if (atoi(token[3]) == 1)
        {
          pinMode(atoi(token[1]),OUTPUT);
          digitalWrite(atoi(token[1]),HIGH);
        }

        else if (atoi(tokens[3]) == 0)
        {
           pinMode(atoi(tokens[1]),OUTPUT);
           digitalWrite(atoi(tokens[1]),LOW);
        }
      }
      started = false;
      ended = false;
      index = 0; 
    }

  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...