根据数据包的Arduino决策决定从串口接收 [英] Arduino making decision according to a packet received from serial port
问题描述
该计划听的形式从串行端口的消息或者第一个字符(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屋!