项目要求控制12路电磁阀,电磁阀的控制帧格式尾 头帧0xFB ,数据位xxx ,尾帧0xFB 。在串口中断回调函数中做出如下的实现。
uint8_t start_Flag=0;
uint8_t cont=0;
uint8_t RX_Buff[16];
uint8_t flash_Fiag=0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART1)
{
if(temp==0xFB)
{
start_Flag=1;
RX_Buff[cont++]=temp;
}
else if(temp==0xBF)
{
start_Flag=0;
RX_Buff[cont]=temp;
flash_Fiag=1;
cont=0;
}
else
{
if(start_Flag==1)
{
RX_Buff[cont++]=temp;
if(cont>=16)
{
start_Flag=0;
}
}
}
}
HAL_UART_Receive_IT(huart,&temp,1);
}
清除接受缓冲区数据
void clean_RX_Data(void)
{
for(int i=0;i<16;i++)
{
RX_Buff[i]=0;
}
}
主循环while(1)中添加如下函数,之后改进以后可以使用定时器专门负责接收数据,每50ms接收一次数据。
if(flash_Fiag==1)
{
flash_Fiag=0;
for(int i=0;i<16;i++)
{
final_Data[i]=RX_Buff[i];
}
clean_RX_Data();
}
实验现象:阿波罗F429测试,发送报头报尾,返回数据和发送数据一致。 项目拓展:在此基础上,可以直接通过final_Data[i] 中的数组元素做出相应的控制判断!!!
|