Embedded 无法理解蓝牙控制的bot代码
我正在制作一个蓝牙控制的机器人,但我无法编写代码。 所以我在互联网上搜索过,但不明白为什么我们不能直接使用“Serial.read()”的输出,而不是像下面的代码那样使用字符字符串来存储它的值 以下是我看到的代码(来自《电路文摘》): 有4个轮子,因此有4个马达Embedded 无法理解蓝牙控制的bot代码,embedded,microcontroller,arduino-uno,robotics,Embedded,Microcontroller,Arduino Uno,Robotics,我正在制作一个蓝牙控制的机器人,但我无法编写代码。 所以我在互联网上搜索过,但不明白为什么我们不能直接使用“Serial.read()”的输出,而不是像下面的代码那样使用字符字符串来存储它的值 以下是我看到的代码(来自《电路文摘》): 有4个轮子,因此有4个马达 #define frm1 2 //front right motor #define frm2 3 #define flm1 4 //front left motor #define f
#define frm1 2 //front right motor
#define frm2 3
#define flm1 4 //front left motor
#define flm2 5
#define rrm1 6 //rear right motor
#define rrm2 7
#define rlm1 8 //rear left motor
#define rlm2 9
char str[2], i;
void forward()
{
digitalWrite(frm1, HIGH);
digitalWrite(frm2, LOW);
digitalWrite(flm1, HIGH);
digitalWrite(flm2, LOW);
digitalWrite(rrm1, HIGH);
digitalWrite(rrm2, LOW);
digitalWrite(rlm1, HIGH);
digitalWrite(rlm2, LOW);
}
void right()
{
digitalWrite(frm1, LOW);
digitalWrite(frm2, HIGH);
digitalWrite(flm1, HIGH);
digitalWrite(flm2, LOW);
digitalWrite(rrm1, LOW);
digitalWrite(rrm2, HIGH);
digitalWrite(rlm1, HIGH);
digitalWrite(rlm2, LOW);
}
void backward()
{
digitalWrite(frm1, LOW);
digitalWrite(frm2, HIGH);
digitalWrite(flm1, LOW);
digitalWrite(flm2, HIGH);
digitalWrite(rrm1, LOW);
digitalWrite(rrm2, HIGH);
digitalWrite(rlm1, LOW);
digitalWrite(rlm2, HIGH);
}
void left()
{
digitalWrite(frm1, HIGH);
digitalWrite(frm2, LOW);
digitalWrite(flm1, LOW);
digitalWrite(flm2, HIGH);
digitalWrite(rrm1, HIGH);
digitalWrite(rrm2, LOW);
digitalWrite(rlm1, LOW);
digitalWrite(rlm2, HIGH);
}
void hault()
{
digitalWrite(frm1, LOW);
digitalWrite(frm2, LOW);
digitalWrite(flm1, LOW);
digitalWrite(flm2, LOW);
digitalWrite(rrm1, LOW);
digitalWrite(rrm2, LOW);
digitalWrite(rlm1, LOW);
digitalWrite(rlm2, LOW);
}
void setup() {
Serial.begin(9600);
pinMode(frm1, OUTPUT);
pinMode(frm2, OUTPUT);
pinMode(flm1, OUTPUT);
pinMode(flm2, OUTPUT);
pinMode(rrm1, OUTPUT);
pinMode(rrm2, OUTPUT);
pinMode(rlm1, OUTPUT);
pinMode(rlm2, OUTPUT);
}
这是我不明白的循环。
字符串在这里有什么用途?str[i-1]有什么帮助
void loop() {
while(Serial.available())
{
char ch = Serial.read();
str[i++] = ch;
if(str[i-1] == '1')
{
forward();
i=0;
}
else if(str[i-1]== '2')
{
left();
i=0;
}
else if(str[i-1] == '3')
{
backward();
i=0;
}
else if(str[i-1] == '4')
{
right();
i=0;
}
else if(str[i-1] == '5')
{
hault();
i=0;
}
delay(100);
}
}
使用索引变量i没有任何意义。首先,在str[i++]=ch中,作者在str[]中存储字符后增加i,然后立即使用str[i-1]引用添加的字符。然后他们设置i=0,这将清除一开始从未使用过的缓冲区!这里有一个更好的方法:
void loop() {
while (Serial.available()) {
switch (Serial.read()) {
case '1':
forward();
break;
case '2':
left();
break;
case '3':
backward();
break;
case '4':
right();
break;
case '5':
hault();
break;
default:
break;
}
delay(100);
}
}
请注意,一旦串行数据输入停止,循环(与原始循环一样)将退出。这可能是也可能不是所希望的
还请注意,您可能希望加倍缓冲来自Serial.read()的输入,以避免以更高的波特率丢弃字符-但是,原始代码没有这样做:
void loop() {
char ch;
char str[16];
int i, j = 0;
// buffer up to 16 chars
while(Serial.available()) {
ch = Serial.read();
str[i++] = ch;
if (i >= 16)
break;
}
// process buffered characters
for (j=0; j<i; j++) {
switch (str[j]) {
case '1':
forward();
break;
case '2':
left();
break;
case '3':
backward();
break;
case '4':
right();
break;
case '5':
hault();
break;
default:
break;
}
delay(100);
}
// reset buffer
i = 0;
}
void循环(){
char ch;
char-str[16];
int i,j=0;
//最多16个字符的缓冲区
while(Serial.available()){
ch=Serial.read();
str[i++]=ch;
如果(i>=16)
打破
}
//进程缓冲字符
谢谢你!那真的很有帮助!!