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