使用键值对进行串口通讯

在Arduino与电脑/手机之间通过串口通讯,比较麻烦的地方有以下几点:

  • 确定一条指令的开始与结尾
  • 防止字节数据丢失引起的错误
  • 编码与解码

简单的办法通常是每个字节作为一个指令,也就是一个BYTE数值或字符。这样做的缺点是表示的数据范围小,而且不够灵活。如果要发送几种不同类型的指令,这种方法也不行。

而表示一个复合命令,则需要断开每一个字段。使用键值对是一个很便利的方式。能够表示大部分操作指令:

name,value;

我们以逗号和分号作为分隔符和结束标记,只要将指令表示成键值对发送就可以了。在接收的一端,按照分隔符将字串断开,获取名称和数值,然后进行解释。

示例代码如下:

char input;
String value;
String name;

const int NAME = 1;
const int VALUE = 2;

int readProcess = NAME;

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

void loop() {
  if(Serial.available()){
    input = Serial.read();
    process();
  }
}

void process() {
  if(input==','){
    readProcess = VALUE;
    Serial.println(name);
  }
  else if(input==';'){
    Serial.println(value);
    run(name, value);
    name = "";
    value = "";
    readProcess = NAME;
  }
  else if(readProcess==NAME){
    name+=input;
  }
  else if(readProcess==VALUE){
    value+=input;
  }
}

void run(String name, String value){
  if(name=="speed"){
    int num = value.toInt();
    if(num==-1023){
      digitalWrite(13, HIGH);
    }
    else{
      digitalWrite(13, LOW);
    }
  }
}

在run()方法里,是对键值对的解释程序。

有分隔符能够很有效地避免传递时丢失字节的问题,保证前面发生的错误不会影响后面数据的传递。一次传输错误最多只影响一个指令的执行,不会对后续的数据传递造成麻烦。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据