STM32 HAL库串口收发数据
许多传感器的使用方法是:单片机给传感器发送一帧数据,然后传感器返回单片机一帧有用数据,所以串口的收发功能十分重要。
STM32cubeMX的配置
时钟和下载方式就不讲了 串口配置,因为要接收数据,所以通常打开串口中断 注意要选到模块需要的波特率,数据位,校验位,停止位,很多模块的波特率是9600,不是我们常用的115200不一样。 打开中断: 串口配置就这些
串口发送
发送函数:
HAL_UART_Transmit_IT(&huart1, (uint8_t *)CO2AskBuffer, sizeof(CO2AskBuffer));
其中第一个参数是串口号,第二个参数是要发送的数据起始地址,第三个是要发送的数据长度,一般都用sizeof函数专业一点。 把要发送的数据放在一个数组里:
uint8_t CO2AskBuffer[9]={0xFF,0x01,0x03,0x02,0x00,0x00,0x00,0x00,0xFB};
串口接收
首先需要打开中断,通常是在单片机发送完指令后开中断:
uint8_t RecieveBuffer[1]={0};
HAL_UART_Receive_IT(&huart1, (uint8_t *)RecieveBuffer, 1);
不定长接收:
uint8_t CO2Buffer[12];
uint8_t RxLine=0;
uint8_t errorBuffer[]="\r\nerror\r\n";
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
UNUSED(huart);
RxLine++;
CO2Buffer[RxLine-1]=RecieveBuffer[0];
if (RxLine>12)
{
RxLine=0;
memset(CO2Buffer,0,sizeof(CO2Buffer));
HAL_UART_Transmit_IT(&huart1, (uint8_t *)errorBuffer,sizeof(errorBuffer));
}
if (RecieveBuffer[0]==0x0A)
{
HAL_UART_Transmit_IT(&huart1, (uint8_t *)CO2Buffer,RxLine);
RxLine=0;
}
RecieveBuffer[0]=0;
HAL_UART_Receive_IT(&huart1, (uint8_t *)RecieveBuffer, 1);
}
数据帧的检验和处理
我们可能需要判断传感器发送来的数据是否是正确的,也可能需要对数据帧的某几个字节做处理,这种情况可以用状态机的写法:
uint8_t NH3Buffer[10];
uint8_t RxLine=0;
uint8_t RecieveBuffer[1]={0};
uint8_t gaozijie;
uint8_t dizijie;
uint16_t NH3concentration;
double NH3Dec;
uint8_t errorBuffer[]="\r\nerror\r\n";
extern uint8_t flag;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
UNUSED(huart);
RxLine++;
NH3Buffer[RxLine-1]=RecieveBuffer[0];
if (RxLine==1)
{
if(RecieveBuffer[0]==0xFF)
{
RxLine=1;
}
else
{
RxLine=0;
}
}
else if(RxLine==2)
{
if(RecieveBuffer[0]==0x01)
{
RxLine=2;
}
else
{
RxLine=0;
}
}
else if(RxLine==3)
{
if(RecieveBuffer[0]==0x07)
{
RxLine=3;
}
else
{
RxLine=0;
}
}
else if(RxLine==4)
{
if(RecieveBuffer[0]==0x02)
{
RxLine=4;
}
else
{
RxLine=0;
}
}
else if(RxLine==5)
{
gaozijie=RecieveBuffer[0];
}
else if(RxLine==6)
{
dizijie=RecieveBuffer[0];
NH3Dec=gaozijie*256+dizijie*1;
NH3Dec=NH3Dec*0.01;
}
else if(RxLine==7)
{
if(RecieveBuffer[0]==0x00)
{
RxLine=7;
}
else
{
RxLine=0;
}
}
else if(RxLine==8)
{
if(RecieveBuffer[0]==0x00)
{
RxLine=8;
}
else
{
RxLine=0;
}
}
else if(RxLine==9)
{
if(RecieveBuffer[0]==0x00)
{
RxLine=9;
}
else
{
RxLine=0;
}
}
else if(RxLine==10&flag==0)
{
printf("%.2f ppm",NH3Dec);
flag=1;
RxLine=0;
}
else
{
flag=1;
RxLine=0;
}
RecieveBuffer[0]=0;
HAL_UART_Receive_IT(&huart1, (uint8_t *)RecieveBuffer, 1);
}
|