在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()方法里,是对键值对的解释程序。
有分隔符能够很有效地避免传递时丢失字节的问题,保证前面发生的错误不会影响后面数据的传递。一次传输错误最多只影响一个指令的执行,不会对后续的数据传递造成麻烦。
发表回复