本教程将给出一种通用的,适用于arduino(uno和mega等)单片机的一个通信的教程,通过对例程的修改,可以做成任意的符合需求的代码,下面请看。
// 函数定义
String detectString_openmv();
int recv_order();
String detectString_openmv() // 判断传入的字符串能否被接收
{
// 我们传入的数据形式 {int&}
while (Serial2.read() != '{')
;
//返回"{}"中的字符串
return (Serial2.readStringUntil('}'));
}
int recv_order() // 接收openmv指令
{
int order;
while (1) {
if (Serial2.available()) break;
}
String s = detectString_openmv();
Serial2.flush(); // 清除openmv串口现在还有的缓存数据
String numStr = "";
for (int i = 0; i < s.length(); i++) {
if (s[i] == '&') // 终止标志
{
order = numStr.toInt();
} else {
numStr += s[i];
}
}
return order; // 指令
}
上面定义了两个函数,分别是
detectString_openmv
和recv_order
,recv_order
中调用detectString_openmv
, 可根据自己的实际需求对recv_order
中的for
循环的具体的内部逻辑进行修改,来得到自己想要的数据,当然也可自己约定两个设备间的通信的协议,保证数据不会乱。Serial2.flush();
这个操作其实是比较重要的,因为经测试发现,其在通信的过程中,总会有多余的数据残留在缓存区,此时在这进行一个清除操作,即可保证下次数据再进来的时候或者进行类似于Serial2.available()
这种判断是不会出错。
整个代码其实是比较巧妙的,充分利用了可自定义协议的优势,摆脱了用Serial2.read()
读出来的数据类型不确定的劣势,也省了很多麻烦,而且这样设计也有助于构建请求-响应
的模型,也进一步提升了整个代码运行的稳定性。