STM32G431RBT6(蓝桥杯)串口(发送)
一、基础配置
(1)
PA9和PA10就是串口对应在单片机上的端口
注意:一定要先选择PA9的TX和PA10的RX,再去打开异步的模式
(2)
二、查看单片机的端口连接至电脑的哪里
(1)此电脑->右击属性
(2)找到端口
若有很多端口,不确定是哪一个端口,那就先把设备给取下,然后再插入,看多出哪个,哪个就是串口
三、打开串口助手
(1)串口助手在D盘的蓝桥杯速成(杨心愉)里面
(2)调试串口
要选一个是板子的串口号
打开串口之后这里就变红了
(3)还是原来的串口助手好用
四、代码 USART1
(1)简单理论讲解
UART是工作在异步的模式下,USART可以工作在同步和异步的模式下
HAL_UART_Receive()
这个是通过查询的方式去接收数据
HAL_UART_Receive_DMA()
这个是通过DMA的方式去接收数据
HAL_UART_Receive_IT()
这个就是通过中断的方式去接收数据
发送数据也是同样
(2)简单代码
2.1 首先要定义一个数组
但是字符串的数据不能超过30,可以小于
uint8_t temp_txbuffer[30]={"Real Magic Origin"};
2.2 执行语句
HAL_UART_Transmit (&huart1,temp_txbuffer,17,10);
首先是句柄,然后是数组的名称,再就是传输字符串的字符数,最后是超时时间(单位是毫秒)
/* USER CODE BEGIN 2 */
uint32_t temp_cnt=0;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if (HAL_GetTick()-temp_cnt >1000)
{
HAL_UART_Transmit (&huart1,temp_txbuffer,17,10);
temp_cnt =HAL_GetTick();
}
}
先定义一个初始数据,然后加一个判断条件,当单片机获取到的数值减去上一次获取到的数值大于1毫秒之后,再执行发送数据的指令。也就相当于是每过1毫秒发送一次数据
但是使用HAL_UART_Transmit()这个函数,因为传输的数据是17位,假设把115200变成9600,那么用1除以9600所算出来传输一个字符的时间就会变大(当然传输一个字符所需要的时间还要算上停止位、起始位、数据位,所以每次传输10个位),那么原来的延时10毫秒就会导致接收数据不完整,就只能一半一半的接收。又因为波特率是可以随时改变的,那么我们就应该要换一个函数
但是如果我们使用串口发送的中断函数,那么我们就不需要考虑后面的延时函数(DMA也是一样),这句函数就是执行完这句话的发送任务之后,就不需要等待10毫秒,它就会直接出来,完整的发送数据,这种叫非阻塞型发送方式,上面那一个就是阻塞型发送方式。阻塞型就是如果不等10毫秒,就不会执行下面的语句。就相当于刚发到O这个字母,正好10毫秒过去了,那么就开始过1秒之后再发送接下来的数据。(非阻塞型不太明白)
(3)代码基本注释
HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
这个需要知道接收数据的字符串长度及其时间
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
这两个虽然不需要知道接收到的时间,但是需要知道接收到的长度,所以使用起来还是不是那么的方便