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数组中 }
时间: 2023-12-06 16:42:43 浏览: 30
这段代码是一个死循环,主要功能是读取串口接收到的数据,并根据读取到的数据来控制车辆的行驶方向和OLED屏幕的显示。具体流程如下:
1.定义一个长度为10的字符数组buf,用于存储串口接收到的数据。
2.进入一个无限循环,用于读取串口接收到的数据。
3.判断USART3接收到数据标志是否被设置,如果被设置则表示USART3接收到了数据。
4.读取USART3接收到的数据,并存储在buf数组中,计数器变量i加1。
5.如果i等于9,则表示buf数组已经存满了9个数据,跳出内层循环。
6.将buf数组中的第三个和第四个数据合并为一个16位的值,存储在formaldehyde变量中。
7.将formaldehyde转换为浮点型,并且除以10.0,得到浓度值。
8.根据浓度值的大小来控制车辆的行驶方向和OLED屏幕的显示,如果浓度值大于0.1,则停止车辆行驶,显示浓度值并发出警报声;否则,车辆继续前进,显示正常。
9.将formaldehyde变量的值以字符串的形式存储在display数组中,显示在OLED屏幕上。
10.延时30秒,再次进入循环,重复以上步骤。
相关问题
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函数或者定时器等方式实现。
C51单片机使用数组储存串口助手发送的字符串并转化为整数的代码
以下是一个简单的C51单片机程序,用于从串口接收一个整数字符串,并将其转换为整数并存储在数组中:
```c
#include <reg52.h>
#define BUF_SIZE 10
unsigned char buffer[BUF_SIZE];
unsigned char index = 0;
void uart() interrupt 4
{
if (RI) //接收中断标志位
{
RI = 0;
buffer[index++] = SBUF; //将接收到的字符存入缓冲区
if (index >= BUF_SIZE) //如果缓冲区满了,重置索引
{
index = 0;
}
}
}
unsigned int str_to_int(unsigned char *str)
{
unsigned int result = 0;
while (*str)
{
result = result * 10 + (*str - '0'); //将每个数字字符转换为对应的整数并累加
str++;
}
return result;
}
void main()
{
TMOD = 0x20; //设置计数器1为方式2(8位自动重装)
TH1 = 0xfd; //设置波特率为9600
TL1 = 0xfd;
SCON = 0x50; //设置串口工作方式为模式1,允许接收
IE = 0x90; //开启中断
TR1 = 1; //启动计数器1
while (1)
{
if (index > 0) //如果缓冲区中有数据
{
buffer[index] = '\0'; //将缓冲区最后一位设置为字符串结束符
unsigned int num = str_to_int(buffer); //将字符串转换为整数
//在这里可以将整数存储到数组中或者进行其他操作
index = 0; //重置索引
}
}
}
```
在此程序中,我们使用一个缓冲区来存储接收到的字符串,当缓冲区满了或者接收到了字符串结束符时,将缓冲区中的字符串转换为整数并进行处理。在实际应用中,您可以根据需要修改缓冲区大小和处理逻辑。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![c](https://img-home.csdnimg.cn/images/20210720083646.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)