【发布时间】:2013-03-20 14:26:04
【问题描述】:
我使用发送一系列字节的程序通过串行与 Arduino 通信。
为了让 Arduino 意识到它正在接收消息而不是垃圾,我用字符 'S' 'T' 'A' 'R' 'T' 标记了我的字节数组的开头。在这之后最终将遵循一系列将分配给内部变量的字节(尚未实现)。
Arduino 必须按顺序读取每个字节并将其与字节数组进行比较,如果所有字节都以正确的顺序出现,它将继续程序的下一部分,否则它将丢弃当前字节并等待更多字节到了。
我试图以最有效和最易读的方式来实现它,而不是使用一系列嵌套的 if 语句。
到目前为止,我得到了:
byte inByte = 0;
byte handShake[] = {'S','T','A','R','T'};
void setup() {
Serial.begin(9600);
}
void loop()
{
while (Serial.available())
{
for (int x =0; x < sizeof(handShake) ; x++)
{
inByte = Serial.read();
Serial.println(x);
if (inByte == handShake[x])
{
if (x == (sizeof(handShake)-1)) {setArduino();}
}
else break;
}
}
}
void setArduino () {
Serial.println("Ready To Set Parameters");
}
然而,这似乎没有超过第二个字节,我不知道为什么。
【问题讨论】:
-
更常见的是简单地使用控制字符(例如:*)来表示消息的结束。除非您的设置做一些不寻常的事情,否则接收垃圾序列字符的可能性很小。
-
我在连接时似乎确实收到了一些垃圾字符,所以这样我可以确定这是正确的信息。仅在一个字符上触发读取的概率为 1/256 或 0.3%,但每秒读取 100 次的概率为每秒 30% 的错误机会,而使用我的 5 个字符为 1/1099511627776 或 9x10^-11% 读取每秒 100 次是每秒 9X10-9%,我可以忍受。
-
只是尝试使用带和大括号的方法,我还将在数据包的末尾添加错误检查字节以防止不良数据。是的,这可能有点过头了,但为了练习,想象一下这个微控制器正在运行一个基本系统,你真的不希望错误的信息通过。
-
我发现如果我添加延迟(5),它会起作用;在第二个 if 语句之后允许下一个字节到达,但是我认为这是最好的方法。我真的需要程序在第一个字节之后暂停并等待下一个字节,而不是等待任意长度的时间。有什么想法吗?
标签: serial-port bytearray arduino handshake