九引脚串口接口其实就是通过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);
}
}