谢谢各位佬的阅读,本文是我自己的理解,如果您发现错误,麻烦请您指出,谢谢
首先谈谈我自己对于串口的理解,随便拿一个嵌入式的板子,它上面有两个引脚,一个是rx,一个是tx,rx用于接收来自上位机,也就是电脑的数据,就是我们在串口调试助手的对话框输入的东西,我们需要串口接收函数来接收读取的数据,并将这个数据存放到一个数组中供我们的后续使用
这个函数就是串口回调函数void HAL_UART_RxCpltCallBack(UART_HandleTypeDef *huart)
void HAL_UART_RxCpltCallBack(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART1)
{
rxdata[rx_pointer++]=rxdat;//先用后加
//每次只能接收一位,每进一次中断就会把上一次的存进中断里,然后1位1位拼起来就是完整的字符串了。
HAL_UART_Receive_IT(&huart1,&rxdat,1);
}
}
在串口回调函数中,每用一次HAL_UART_Receive_IT(&huart1,&rxdat,1);这个串口接收中断使能函数,我们从对话框输入的一大串字符的一个字符就会赋值给rxdat,例如CNBR:A392:200202120000这一大串字符,就会按顺序将C,N,B,R,:,A,3,9,2,:.........0将字符依次赋值给rxdat,而rxdata这是一个数组,它会按顺序的将rxdat的值存入数组,实现这个功能主要归功于rx_pointer这个变量在程序每进一次串口回调函数就会加1,使rxdat的值依次存入rxdata数组,并且最终在数组里的顺序与我们在对话框中输入的数据完全一致。
也就是rxdata[22]={CNBR:A392:200202120000};
如果我们想要分析这个数组里的数据,这时候就要用到sscanf函数
sscanf(rxdata,"%4s:%4s:%12s",car_type,car_data,car_time);
你能看的懂这个函数的用法吗?是不是很简单,我们先看%4s:%4s:%12s
发现4,4,12分别对应的是CNBR, A392, 200202120000,也就是说我们不需要':',所以将CNBR赋值给car_type, A392赋值给car_data, 200202120000赋值给car_time
这时候分析起来数据就简单了
我们再来谈谈串口的发送,这个相较于串口的接收简单很多,
sprintf(text,"please input key:\r\n");
HAL_UART_Transmit(&huart1,(uint8_t *)text,sizeof(text),50);
HAL_Delay(1000);
串口调试助手上面显示的数据只能是嵌入式板子发送给它的数据,你自己在对话框中发送的数据是直接传送给板子,不会在显示界面显示