HAL库源码移植解析与使用之USART

九引脚串口接口其实就是通过sp3232芯片转成ttl电平变成普通出口而已,和usb转ttl得ch340一样

A.接收一个字节

先用 HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);接收一个指定字节RXBUFFERSIZE到指定字符串g_rx_buffer,你把RXBUFFERSIZE=1,就是每次只接收一个字节

HAL_UART_MspInit()函数是初始配置USART函数

HAL_UART_Receive_IT()或函数是开启UART到中断nvic的通道,后面再打开nvic就会有完整的中断信号了

编写中断服务函数,USARTx_IRQHandler()  UARTx_IRQHandler()是两个中断服务函数头,对应实现UART和USART的中断触发

/******************************************************************************************/

uint8_t g_rx_buffer[1];          /* HAL库使用的串口接收数据缓冲区 */
uint8_t g_usart1_rx_flag = 0;    /* 串口接收到数据标志 */

UART_HandleTypeDef g_uart1_handle;  /* UART句柄 */

/* 串口1初始化函数 */
void usart_init(uint32_t baudrate)
{
    g_uart1_handle.Instance = USART1;
    g_uart1_handle.Init.BaudRate = baudrate;
    g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B;
    g_uart1_handle.Init.StopBits = UART_STOPBITS_1;
    g_uart1_handle.Init.Parity = UART_PARITY_NONE;
    g_uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    g_uart1_handle.Init.Mode = UART_MODE_TX_RX;
    HAL_UART_Init(&g_uart1_handle);
    
    HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t*)g_rx_buffer, 1);
}

HAL_UART_IRQHandler()实现清除标志位,关闭receive_it中断上传和调用callback函数

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 初始化HAL_UART_Receive_IT()已经会把你收到的指定字节数据存到指定数组里你直接读取就行,但是为什么这个函数不能直接读取一个指定字节的字符串呢?

因为这个函数会死等!!!!!!你指定他读取100个字符他没读到100字符前绝对不会跳出来,很占用资源,所以才要一个一个字符存到另外一个数组去构成一个字符串,这样做的好处是,没字符来时我可以干其他事

B.接收一个字符串

HAL_UART_Receive_IT()里除了会调用接收指定个字节数据进指定数组外,它还会调用void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)函数

这个函数带__weak()可以人为重定义

其实说白了就是每触发一次中断进行一次接收一次数据,就会调用一次这个函数,这时你就可以对数据进行一些操作

eg:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART_UX)                    /* 如果是串口1 */
    {
        if ((g_usart_rx_sta & 0x8000) == 0)             /* 接收未完成 */
        {
            if (g_usart_rx_sta & 0x4000)                /* 接收到了0x0d(即回车键) */
            {
                if (g_rx_buffer[0] != 0x0a)             /* 接收到的不是0x0a(即不是换行键) */
                {
                    g_usart_rx_sta = 0;                 /* 接收错误,重新开始 */
                }
                else                                    /* 接收到的是0x0a(即换行键) */
                {
                    g_usart_rx_sta |= 0x8000;           /* 接收完成了 */
                }
            }
            else                                        /* 还没收到0X0d(即回车键) */
            {
                if (g_rx_buffer[0] == 0x0d)
                    g_usart_rx_sta |= 0x4000;
                else
                {
                    g_usart_rx_buf[g_usart_rx_sta & 0X3FFF] = g_rx_buffer[0];
                    g_usart_rx_sta++;

                    if (g_usart_rx_sta > (USART_REC_LEN - 1))
                    {
                        g_usart_rx_sta = 0;             /* 接收数据错误,重新开始接收 */
                    }
                }
            }
        }

        HAL_UART_Receive_IT(&g_uart1_handle, (uint8_t *)g_rx_buffer, RXBUFFERSIZE);
    }
}

对他进行识别然后放到一个自定义的字符串数组里,这里的g_rx_buffer[0];就是一个自定义的  int  g_rx_buffer【100】={0}

其实你还可以创建自己的识别数据包机制不用看这个
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

广药门徒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值