根据数据包的Arduino决策决定从串口接收 [英] Arduino making decision according to a packet received from serial port

查看:162
本文介绍了根据数据包的Arduino决策决定从串口接收的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

该计划听的形式从串行端口的消息或者第一个字符(A或D)是指模拟或数字,第二角色 - 针,第三个字符 - 1/0或从0到255的标记&LT ;和>显示的开始和分组的结束。

例如,如果接收到分组时,光被digitalWrite接通(13,1)
但没有任何反应。当我通过串口发送显示器,例如:灯应该闪烁,但事实并非如此。同样与模拟输出。

 布尔开始= FALSE;
布尔结束= FALSE;
炭INDATA [5];
字节索引;
无效设置()
{
  Serial.begin(9600);
}无效循环()
{
  而(Serial.available()大于0)
  {
    焦炭INCHAR = Serial.read();
    如果(INCHAR =='<')
    {
      索引= 0;
      启动= TRUE;
      截至= FALSE;
    }    否则,如果(INCHAR =='>')
    {
      结束= TRUE;
      打破;
    }    其他
    {
      如果(指数< = 4)
      {
        INDATA [指数] = INCHAR;
        指数++;
      }
    }     如果(开始和放大器;&安培;端)
    {
      如果(INDATA [0] =='A')
      {
        pinMode(INDATA [2],输出);
        analogWrite(INDATA [2],INDATA [4]);
      }
      否则如果(INDATA [0] =='D')的
      {
        如果(INDATA [4] == 1)
        {
          pinMode(INDATA [2],输出);
          digitalWrite(INDATA [2],高);
        }        否则如果(INDATA [4] == 0)
        {
           pinMode(INDATA [2],输出);
           digitalWrite(INDATA [2],低);
        }
      }
      开始= FALSE;
      截至= FALSE;
      索引= 0;
    }  }
Serial.println(发送);}


解决方案

以下code可以让你用一个例子串行执行字符串的方法:

 <电力,带动>

一旦它处理这个​​字符串,它会执行下面的方法:

  sendCommand(CMD,VAL);

请参阅以下如何打开一个引脚11的LED的例子。

 的#include< AVR / pgmspace.h>INT IRledPin = 11;#定义SOP'<'
EOP的#define'>'布尔开始= FALSE;
布尔结束= FALSE;焦炭INDATA [80];
字节索引;无效设置(){
  pinMode(IRledPin,OUTPUT);
  Serial.begin(9600);
}空隙环(){
  //读取所有串行数据可用,尽可能快
  而(Serial.available()大于0){
    焦炭INCHAR = Serial.read();    如果(INCHAR == SOP){
       索引= 0;
       INDATA [指数] ='\\ 0';
       启动= TRUE;
       截至= FALSE;
    }否则如果(INCHAR == EOP){
       结束= TRUE;
       打破;
    }其他{
      如果(指数< 79){
        INDATA [指数] = INCHAR;
        指数++;
        INDATA [指数] ='\\ 0';
      }
    }
  }  //我们在这里是因为所有未决的序列
  //数据已被读出或因的端
  //数据包标记到达。这是什么呢?
  如果(开始和放大器;&安培;端){
    //数据包标记的抵达终点。处理数据包
    字符* CMD = strtok的(INDATA,);    如果(CMD){
       字符* VAL =的strtok(NULL,);
       如果(VAL){
          sendCommand(CMD,VAL);
       }
    }    //重置为下一个数据包
    开始= FALSE;
    截至= FALSE;
    索引= 0;
    INDATA [指数] ='\\ 0';
  }
}无效sendCommand(字符*命令,字符*值){
  如果(STRCMP(指挥,权力)== 0){
    功率(值);
  }
}无效功率(字符*值){
  如果(STRCMP(价值,LED)== 0){
    digitalWrite(IRledPin,HIGH);
  }
}

The program listen to messages from serial port in the form or where first character (A or D) means analog or digital, the 2nd character - pin, the 3rd character - 1/0 or from 0 to 255. The markers < and > show the beginning and the end of packet.

For example, if packet is received, the light is turned on by digitalWrite(13,1) But nothing happens. When I send via serial monitor, for instance: light is supposed to blink but it does not. The same with analogue outputs.

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");  



}

解决方案

The following code will allow you to execute a method with an example serial string:

<power,led>

Once it processes this string, it'll execute the following method:

sendCommand(cmd, val);

See below for an example of how to turn on an LED on 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);
  }
}

这篇关于根据数据包的Arduino决策决定从串口接收的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆