USART3_RX_BUF
时间: 2023-08-06 22:05:15 浏览: 62
USART3_RX_BUF是一个接收缓冲区,用于存储从USART3串口接收到的数据。它是一个长度为USART3_MAX_RECV_LEN的数组,最大可以存储USART3_MAX_RECV_LEN个字节的数据。\[2\]
#### 引用[.reference_title]
- *1* *2* *3* [STM32笔记---USART3配置及收发数据](https://blog.csdn.net/Shen_KL/article/details/116562314)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
相关问题
if(strncmp(USART3_RX_BUF,"cmd=2",5)==0) { for(i=0;i<strlen(USART3_RX_BUF)+1;i++) { data_tiqu[s]=USART3_RX_BUF[i]; s++; }
这段代码是在判断收到的 USART3_RX_BUF 字符串是否以 "cmd=2" 开头,如果是,则将整个字符串复制到 data_tiqu 数组中。具体解释如下:
- strncmp 函数用于比较两个字符串的前 n 个字符是否相同,这里的参数为 "cmd=2" 和 USART3_RX_BUF,n 为 5,即只比较前 5 个字符。
- 如果 strncmp 返回值为 0,说明两个字符串相同,即 USART3_RX_BUF 以 "cmd=2" 开头。
- 接着用 for 循环将整个 USART3_RX_BUF 复制到 data_tiqu 数组中。
- 变量 s 用于记录 data_tiqu 数组的下标,每次循环将 USART3_RX_BUF 的一个字符复制到 data_tiqu 中,并将 s 加 1,最终得到完整的字符串。
STM32 标准库 将结构中6个不同的数据与之后更新的这六个数据进行对比,如果不同则标志位++并保存之前的数据在结构体数组中, 但是没有将USART3中的数据传给要检测是否一样的数据,请修改void Openmv_RXtask(void) { if((Openmv_Flag == 1)&&(USART3_RX_BUF[3]!=0 )) { Openmv.Color_Num = USART3_RX_BUF[2]; Openmv.Shape_Num = USART3_RX_BUF[3]; Openmv.Openmv_X = USART3_RX_BUF[4] | USART3_RX_BUF[5] <<8; Openmv.Openmv_Y = USART3_RX_BUF[6] | USART3_RX_BUF[7] <<8; Openmv.Openmv_W = USART3_RX_BUF[8] | USART3_RX_BUF[9] <<8; Openmv.Openmv_H = USART3_RX_BUF[10]| USART3_RX_BUF[11]<<8; Openmv_Flag = 0; USART3_RX_STA = 0; // printf("%d\r\n",Openmv.Shape_Num); //USART_ITConfig(USART3,USART_IT_RXNE,ENABLE); } }inline void checkAndUpdate(Openmv_InitTypeDef *myStruct) { printf("没进来了\r\n"); static uint16_t prevData1, prevData2, prevData3, prevData4, prevData5, prevData6; printf("%d\r\n",prevData1); if (myStruct->Color_Num != prevData1 || myStruct->Shape_Num != prevData2 || myStruct->Openmv_X != prevData3 || myStruct->Openmv_Y != prevData4 || myStruct->Openmv_W != prevData5 || myStruct->Openmv_H != prevData6) { printf("进来了\r\n"); OpenmvArray[myStruct->flag] = *myStruct; myStruct->flag++; // 保存之前的数据到结构体数组中 prevData1 = myStruct->Color_Num; prevData2 = myStruct->Shape_Num; prevData3 = myStruct->Openmv_X; prevData4 = myStruct->Openmv_Y; prevData5 = myStruct->Openmv_W; prevData6 = myStruct->Openmv_H; } }
你需要把 USART3 接收到的数据传递给 checkAndUpdate 函数进行比较。修改后的代码如下:
```
void Openmv_RXtask(void) {
if((Openmv_Flag == 1)&&(USART3_RX_STA & 0x8000)) {
Openmv.Color_Num = USART3_RX_BUF[2];
Openmv.Shape_Num = USART3_RX_BUF[3];
Openmv.Openmv_X = USART3_RX_BUF[4] | USART3_RX_BUF[5] <<8;
Openmv.Openmv_Y = USART3_RX_BUF[6] | USART3_RX_BUF[7] <<8;
Openmv.Openmv_W = USART3_RX_BUF[8] | USART3_RX_BUF[9] <<8;
Openmv.Openmv_H = USART3_RX_BUF[10]| USART3_RX_BUF[11]<<8;
Openmv_Flag = 0;
USART3_RX_STA = 0;
checkAndUpdate(&Openmv); // 将结构体传递给 checkAndUpdate 函数进行比较
}
}
inline void checkAndUpdate(Openmv_InitTypeDef *myStruct) {
static uint16_t prevData1, prevData2, prevData3, prevData4, prevData5, prevData6;
if (myStruct->Color_Num != prevData1 || myStruct->Shape_Num != prevData2 ||
myStruct->Openmv_X != prevData3 || myStruct->Openmv_Y != prevData4 ||
myStruct->Openmv_W != prevData5 || myStruct->Openmv_H != prevData6) {
OpenmvArray[myStruct->flag] = *myStruct;
myStruct->flag++;
prevData1 = myStruct->Color_Num;
prevData2 = myStruct->Shape_Num;
prevData3 = myStruct->Openmv_X;
prevData4 = myStruct->Openmv_Y;
prevData5 = myStruct->Openmv_W;
prevData6 = myStruct->Openmv_H;
}
}
```
修改后的代码中,我们增加了一个判断 USART3_RX_STA 是否为接收完成标志位的判断,只有当接收完成后才会进行处理。同时,在 Openmv_RXtask 函数中,我们将结构体传递给 checkAndUpdate 函数进行比较。