|
楼主 |
发表于 2013-8-22 22:30:28
|
显示全部楼层
好久没有来逛论坛了,发现有人对我的程序有疑问,特此添加一些注释。
int n = 1;
int flagCount = 0; '接收到数据包FF的数量,如果数值等于0表示接收到数据包头,等于2表示接收到数据包尾
int tempData = 0; ' 存放读取到的缓冲区的第一个字节
int UARTReveived = 0; 接收到数据包的结尾,也就是第二个FF的时候该变量的值为1,这时表示数据包已经接收完整,准备执行命令;执行完后该值变为0
int rxData[5];
void loop()
{
if(Serial.available())
{
tempData = Serial.read();
delay(3);
if(tempData == UART_FLAG && flagCount < 2) ' flagCount < 2成立时有两种情况:flagCount == 0或者 flagCount == 1。等于0时表示之前没有接收过FF,这次接收到的FF是数据包的开头。等于1则表示之前已经接受过一次FF,这次接收到的第二个FF是数据包的结尾。假如发送的是“FF000100FF”,那第一次检测到FF(也就是tempData == UART_FLAG )时flagCount == 0 ,所以条件为真,执行大括号的内容。注意一个字节是十六进制的0xFF,而不是F! {
rxData[0] = tempData; '把接收到的FF存放到数组 rxData的第一位。这里其实有一点逻辑错误!!当接收到数据包的结尾,也就是flagCount == 1 时,也会往数组的第一位写进FF,但这完全不会影响到程序的执行。
flagCount++; ' 每接收到第一个FF,这个值就会加1。
}
else ' 如果上述条件不成立则表示正在接收数据包中
{
rxData[n] = tempData;
n++;
}
if(flagCount == 2) '当接收到第二个FF时,这个条件就会成立,表示数据包接收完毕
{
rxData[4] == UART_FLAG;
UARTReveived = 1;
n = 1;
flagCount = 0;
tempData = 0;
Serial.flush();
}
}
if(UARTReveived == 1)
{
if(rxData[1] == MOTO)
{
switch(rxData[2])
{
case FORWARD:
carGoFwd();
break;
case BACKWARD:
carGoBwd();
break;
case TURNLEFT:
carTurnL();
break;
case TURNRIGHT:
carTurnR();
break;
case CARSTOP:
carStop();
break;
}
UARTReveived = 0;
}
else if(rxData[1] == SERVO)
{
servoSet(rxData[2], rxData[3]);
UARTReveived = 0;
}
else if(rxData[1] == MOTOSPEED)
{
CHNSpeed(rxData[2], rxData[3]);
UARTReveived = 0;
}
}
} |
|