串口介绍
串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。
通信的目的是进行信息传递,双方约定的规则就是通信协议。
(1)通信方向:
全双工)一般是两根通信线,一根发送,一根接收,可以同时进行,互不干涉
(半双工)一根通信线,双向,也可以发送和接收,发送和接收不能同时进行
(单工)一根通信线,单向,发送方向和接收方向固定
(2)时钟:
(同步)有时钟线,双方约定好时钟信号,接收方根据时钟信号进行采样
(异步)没有时钟线,双方约定好采样频率,接受方根据频率进行采样,并且还加帧头帧尾等,进行采样位置的对齐
(3)串口通信原理:
STM32中的串口通信是通过USART模块来实现的,USART模块包括串行通信接口和同步串行接口两个部分。其中串行通信接口支持异步通信和同步通信两种模式,而同步串行接口只支持同步通信模式。
在STM32中,串口通信需要将数据进行格式化处理,然后以一定的帧格式发送出去,接收方通过解析帧格式来获取数据。在格式化数据时,需要将数据进行加码和校验处理,以保证数据的准确性和可靠性。
UART串口通信
1、Cubemx配置:
2、代码:
发送:
//串口发送
char temp[20];
sprintf(temp,"FRQ=%d\r\n",frq1);
HAL_UART_Transmit(&huart1,(uint8_t*)temp,strlen(temp),50);
接收:
main.c(部分):
HAL_UART_Receive_IT(&huart1,&rxdat,1); //初始化(放在while外)
if(rx_pointer!=0)
{
int temp=rx_pointer;
HAL_Delay(1);
if(temp==rx_pointer)
uart_rx_proc();
}
main.c(部分):
void uart_rx_proc() //处理接收的内容
{
if(rx_pointer>0)
{
if(rx_pointer==22) //接收22个字符
{
sscanf(rxdata,"%4s:%4s:%12s",car_type,car_data,car_time); //拆分,格式化
}
else
{
char temp[20];
sprintf(temp,"Error");
HAL_UART_Transmit(&huart1,(uint8_t*)temp,strlen(temp),50);
}
rx_pointer=0;
memset(rxdata,0,30);
}
}
interrupt.c(部分):
char rxdata[30];
uint8_t rxdat;
uchar rx_pointer;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) //接收的回调函数
{
rxdata[rx_pointer++]=rxdat; //存放
HAL_UART_Receive_IT(&huart1,&rxdat,1); //接收
}
3、串口通信小助手:
最终效果