void Openmv_Receive_Data(int16_t data)//接收Openmv传过来的数据 { static u8 state = 0; if(state==0&&data==0x2C) //开头 { state=1; RxBuffer1[RxCounter1++]=data; } else if(state==1) { state=2; RxBuffer1[RxCounter1++]=data; } else if(state==2) { RxBuffer1[RxCounter1++]=data; if(RxCounter1>=4||data == 0x5B) state=3; //the last of char is openmv[19] } else if(state==3) //state == 3 检测是否接受到结束标志 { if(RxBuffer1[RxCounter1-1] == 0x5B) { state = 0; // USART_ITConfig(USART1,USART_IT_RXNE,DISABLE); } else //wrong thing { state = 0; RxCounter1=0; } } else //wrong thing { state = 0; RxCounter1=0; } }
时间: 2024-04-13 10:27:34 浏览: 25
这段代码是用来接收Openmv传过来的数据的函数。它通过判断数据的值和状态来确定接收的过程。
首先,定义了一个静态变量state,并初始化为0。然后通过if语句判断当前状态state和接收到的数据data的值。
如果state为0且data为0x2C(逗号),表示接收到了开头标志,将state设置为1,并将data存入RxBuffer1数组中。
如果state为1,表示已经接收到了开头标志,将state设置为2,并将data存入RxBuffer1数组中。
如果state为2,表示正在接收数据阶段,将data存入RxBuffer1数组中。如果RxCounter1大于等于4(即已经接收了4个数据)或者data等于0x5B(即接收到了结束标志),则将state设置为3。
如果state为3,表示正在检测是否接收到结束标志。如果RxBuffer1数组的最后一个元素等于0x5B,则表示接收到了结束标志,将state设置为0;否则表示接收过程出错,将state设置为0,并将RxCounter1重置为0。
最后,如果state不满足以上条件,则表示接收过程出错,将state设置为0,并将RxCounter1重置为0。
请注意,该代码只是一个函数的片段,可能需要在其他地方使用和调用。
相关问题
以下代码在不同文件中使用为啥出现语法错误 void checkAndUpdate(Openmv_InitTypeDef *myStruct); typedef struct Openmv { uint16_t Color_Num; uint16_t Shape_Num; uint16_t Openmv_X; uint16_t Openmv_Y; uint16_t Openmv_W; uint16_t Openmv_H; uint16_t flag; }Openmv_InitTypeDef; 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) { myStruct->flag++; OpenmvArray[myStruct->flag] = *myStruct; // 保存之前的数据到结构体数组中 prevData1 = myStruct->Color_Num; prevData2 = myStruct->Shape_Num; prevData3 = myStruct->Openmv_X; prevData4 = myStruct->Openmv_Y; prevData5 = myStruct->Openmv_W; prevData6 = myStruct->Openmv_H; } }
这段代码出现语法错误是因为在使用它的文件中没有包含定义 Openmv_InitTypeDef 结构体类型的头文件。需要在使用它的文件中添加以下代码:
```c
#include "header_file.h" // 替换为实际的头文件名
// 或者直接在文件中定义结构体类型 Openmv_InitTypeDef
typedef struct {
uint16_t Color_Num;
uint16_t Shape_Num;
uint16_t Openmv_X;
uint16_t Openmv_Y;
uint16_t Openmv_W;
uint16_t Openmv_H;
uint16_t flag;
} Openmv_InitTypeDef;
// 然后再使用 checkAndUpdate 函数
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) {
myStruct->flag++;
OpenmvArray[myStruct->flag] = *myStruct; // 保存之前的数据到结构体数组中
prevData1 = myStruct->Color_Num;
prevData2 = myStruct->Shape_Num;
prevData3 = myStruct->Openmv_X;
prevData4 = myStruct->Openmv_Y;
prevData5 = myStruct->Openmv_W;
prevData6 = myStruct->Openmv_H;
}
}
```
其中,header_file.h 是定义 Openmv_InitTypeDef 结构体类型的头文件的文件名,需要替换成实际的头文件名。
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 函数进行比较。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.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)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)