while (1) { Elude_detect_barrier(); // 进入死循环 char buf[10]; // 定义一个长度为10的字符数组用于存储串口接收到的数据 int i = 0; // 初始化计数器变量i为0 while (1) { // 进入一个无限循环,用于读取串口接收到的数据 // 判断USART3接收到数据标志是否被设置,如果被设置则表示USART3接收到了数据 if (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == SET) { buf[i] = USART_ReceiveData(USART3); // 读取USART3接收到的数据,并存储在buf数组中 i++; // 计数器变量i加1 if (i == 9) { // 如果i等于9,则表示buf数组已经存满了9个数据 break; // 跳出内层循环 } } } formaldehyde = (buf[2] << 8) + buf[3]; // 将buf数组中的第三个和第四个数据合并为一个16位的值,存储在formaldehyde变量中 sprintf(display, "Formaldehyde: %d", formaldehyde); float formaldehyde_f = (float)formaldehyde / 10.0; // 将formaldehyde转换为浮点型,并且除以10.0 if (formaldehyde_f > 0.1) { sprintf(display, "Formaldehyde: %.1f", formaldehyde_f); Car_Stop(0); // 将浮点数格式化为带有1位小数点的字符串 OLED_Clear(); // 清空OLED屏幕 OLED_ShowString(0, 0, display, 16); // 在OLED屏幕上显示display数组中的字符串 delay(30000); // 延时30秒 Beep_Alert(); } else { sprintf(display, "Formaldehyde: OK"); Car_forward(20); OLED_Clear(); // 清空OLED屏幕 OLED_ShowString(0, 0, display, 16); // 在OLED屏幕上显示display数组中的字符串 } // 将formaldehyde变量的值以字符串的形式存储在display数组中 //没有障碍物 if( S_Elude_Input == Not_Find_Barrier ) { Car_forward(20); // 前进 } //左侧发现障碍物 else if( S_Elude_Input == Left_Find_Barrier || S_Elude_Input == Left_Middle_Find_Barrier) { Car_Turn_Right(); // 右转 } //右侧发现障碍物 else if( S_Elude_Input == Right_Find_Barrier || S_Elude_Input == Right_Middle_Find_Barrier) { Car_Turn_Left(); // 左转 } //中间/全部发现障碍物 else if( S_Elude_Input == Middle_Find_Barrier || S_Elude_Input == All_Find_Barrier) { Car_Backward(20); // 后退 delay_ms(500); Car_Turn_Left(); //左转 delay_ms(200); } else if( S_Elude_Input == Left_Right_Find_Barrier) { Car_forward(20); // 前进 }
时间: 2023-12-06 19:42:35 浏览: 57
这段代码是一个循环,不断检测气体传感器检测到的甲醛浓度,并根据浓度值控制小车行驶。同时,如果有障碍物出现,小车会根据障碍物位置进行转向或后退等操作。在循环中,先检测气体传感器是否检测到数据,并将数据存储到一个字符数组中。然后将数组中的数据转换为16位的整型变量,之后根据浓度值判断是否需要进行报警,并在OLED屏幕上显示浓度值。接着根据障碍物位置进行小车的控制,包括前进、后退、左转或右转等操作。
相关问题
while (1) { // 进入死循环 char buf[10]; // 定义一个长度为10的字符数组用于存储串口接收到的数据 int i = 0; // 初始化计数器变量i为0 while (1) { // 进入一个无限循环,用于读取串口接收到的数据 // 判断USART3接收到数据标志是否被设置,如果被设置则表示USART3接收到了数据 if (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == SET) { buf[i] = USART_ReceiveData(USART3); // 读取USART3接收到的数据,并存储在buf数组中 i++; // 计数器变量i加1 if (i == 9) { // 如果i等于9,则表示buf数组已经存满了9个数据 break; // 跳出内层循环 } } } formaldehyde = (buf[2] << 8) + buf[3]; // 将buf数组中的第三个和第四个数据合并为一个16位的值,存储在formaldehyde变量中 sprintf(display, "Formaldehyde: %d", formaldehyde); float formaldehyde_f = (float)formaldehyde / 10.0; // 将formaldehyde转换为浮点型,并且除以10.0 if (formaldehyde_f > 0.1) { sprintf(display, "Formaldehyde: %.1f", formaldehyde_f); Car_Stop(0); // 将浮点数格式化为带有1位小数点的字符串 OLED_Clear(); // 清空OLED屏幕 OLED_ShowString(0, 0, display, 16); // 在OLED屏幕上显示display数组中的字符串 delay(30000); // 延时30秒 Beep_Alert(); } else { sprintf(display, "Formaldehyde: OK"); Car_forward(20); OLED_Clear(); // 清空OLED屏幕 OLED_ShowString(0, 0, display, 16); // 在OLED屏幕上显示display数组中的字符串 } // 将formaldehyde变量的值以字符串的形式存储在display数组中 }结合while(1) { Elude_detect_barrier(); //没有障碍物 if( S_Elude_Input == Not_Find_Barrier ) { Car_forward(20); // 前进 } //左侧发现障碍物 else if( S_Elude_Input == Left_Find_Barrier || S_Elude_Input == Left_Middle_Find_Barrier) { Car_Turn_Right(50); // 右转 } //右侧发现障碍物 else if( S_Elude_Input == Right_Find_Barrier || S_Elude_Input == Right_Middle_Find_Barrier) { Car_Turn_Left(50); // 左转 } //中间/全部发现障碍物 else if( S_Elude_Input == Middle_Find_Barrier || S_Elude_Input == All_Find_Barrier) { Car_Backward(20); // 后退 delay_ms(200); Car_Turn_Left(50); //左转 delay_ms(200); } else if(
S_Elude_Input的值不在定义的范围内,可能会导致程序出现未知错误。建议加上一个默认情况的处理方式,例如:
else {
// 未知情况,停车等待下一次检测
Car_Stop(0);
delay_ms(200);
}
此外,建议在每次循环结束后加上适当的延时,以避免程序过于繁忙,导致系统资源占用过高。可以使用delay函数或者定时器等方式实现。
int main(void) { SystemInit(); USART3_Init(); OLED_GPIO_Init(); OLED_Init(); while (1) { Elude_detect_barrier(); // 进入死循环 char buf[10]; // 定义一个长度为10的字符数组用于存储串口接收到的数据 int i = 0; // 初始化计数器变量i为0 while (1) { // 进入一个无限循环,用于读取串口接收到的数据 // 判断USART3接收到数据标志是否被设置,如果被设置则表示USART3接收到了数据 if (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == SET) { buf[i] = USART_ReceiveData(USART3); // 读取USART3接收到的数据,并存储在buf数组中 i++; // 计数器变量i加1 if (i == 9) { // 如果i等于9,则表示buf数组已经存满了9个数据 break; // 跳出内层循环 } } } formaldehyde = (buf[2] << 8) + buf[3]; // 将buf数组中的第三个和第四个数据合并为一个16位的值,存储在formaldehyde变量中 sprintf(display, "Formaldehyde: %d", formaldehyde); float formaldehyde_f = (float)formaldehyde / 10.0; // 将formaldehyde转换为浮点型,并且除以10.0 if (formaldehyde_f > 0.1) { sprintf(display, "Formaldehyde: %.1f", formaldehyde_f); Car_Stop(0); // 将浮点数格式化为带有1位小数点的字符串 OLED_Clear(); // 清空OLED屏幕 OLED_ShowString(0, 0, display, 16); // 在OLED屏幕上显示display数组中的字符串 Beep_Alert(); delay(30000); // 延时30秒 }怎么加入一个存储超过浓度阈值的环节
你可以在检测到超过浓度阈值后,将数据存储到一个数组中或者写入到一个文件中。例如:
1. 定义一个数组或者文件,在其中存储超过浓度阈值的数据。
2. 在检测到超过浓度阈值后,将数据存储到数组或者文件中。
3. 在程序中添加一个定时任务或者定时器,在指定的时间间隔内检查数组或者文件中存储的数据,如果超过一定数量则触发相应的报警或者处理机制。
下面是一个示例代码,用于将超过浓度阈值的数据存储到一个数组中:
```C
#define MAX_DATA_NUM 100 // 定义数组的最大容量为100
int data[MAX_DATA_NUM]; // 定义一个长度为100的数组用于存储数据
int data_num = 0; // 定义一个变量用于记录已经存储的数据数量
while (1)
{
Elude_detect_barrier();
char buf[10];
int i = 0;
while (1)
{
if (USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == SET)
{
buf[i] = USART_ReceiveData(USART3);
i++;
if (i == 9)
{
break;
}
}
}
formaldehyde = (buf[2] << 8) + buf[3];
sprintf(display, "Formaldehyde: %d", formaldehyde);
float formaldehyde_f = (float)formaldehyde / 10.0;
if (formaldehyde_f > 0.1)
{
sprintf(display, "Formaldehyde: %.1f", formaldehyde_f);
Car_Stop(0);
OLED_Clear();
OLED_ShowString(0, 0, display, 16);
Beep_Alert();
// 将超过浓度阈值的数据存储到数组中
if (data_num < MAX_DATA_NUM)
{
data[data_num] = formaldehyde;
data_num++;
}
}
// 检查数组中存储的数据是否超过一定数量,如果超过则触发相应的报警或者处理机制
if (data_num >= 10)
{
// TODO: 触发报警或者处理机制
data_num = 0; // 重置数据数量
}
delay(30000);
}
```
阅读全文