本周实现stm32串口定长收发。
首先利用CubeMX进行stm32初始化编辑:
这里PA2选用USART2,其实就是UART串口,利用TTL数据传输
由于之前选择引脚USART2模式,这里选USART2:
传输模式是TTL,也就是Asynchronous:
配置好之后是这样的:
物理接线:
上图显示的是:PA2 --> TX
PA3 --> RX
TX是输出,RX是输入。在与CH340转串口连接的时候应当:
stm32的输出<------>CH340的输入
stm32的输入<------>CH340的输出
为了保持两边低电平电压相同,应当再接互相接地,也就是(GND是地线):
GND<------>GND
黑线接A3;灰线接A2;棕线接G;
接着ST-LINK接线:
GND<----->GND
3.3V<----->3,3
SWCLK<----->DCLK
SWDIO<----->DIO
从CubeMX 点GENERATE CODE 导入KEIL5 MDK,
在while(1)下面输入下面两行代码:
其中:
第一个函数:HAL_UART_Receive()是stm32接受数据指令,括号里面4个参数,
(&要操作的串口指针,需要发送的信息的指针,内容长度,超时时间)
**要操作的串口指针:一般是huart2,前面要加上“&”
**需要发送信息的指针:一般由自己定义一个数组,我们这里定义“shuzhu”
由于HAL_UART_Receive在定义里面需要一个uint_8的指针,所以直接用uint_8定义不用char
**内容长度:由于在小车开始比赛扫二维码的时候出来的是一个7字节的字符串,所以数组长度设置为7,但是我发现实际运用中可能会出现一些问题:
在返回“213+321”的时候少了一个值,然后我把数组长度调成8,问题好像就没有了
**超时时间:这里设置无穷大,也就是HAL_MAX_DELAY(0xFFFFFFFF),意思就是只要不输入数据,单片机就不会进行下一个步骤。如果不是无穷,就会出现没输入数据单片机就开始发问好过来。
第二个函数:HAL_UART_Transmit()就是单片机发送数据,括号里面四个参数跟上面一个一样,只是第四个参数:超时时间有改动,设置成100毫秒,若100ms内还没发送就停止发送。
代码:
/* USER CODE BEGIN 2 */
uint8_t shuzhu[8];
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_UART_Receive(&huart2,shuzhu,8,HAL_MAX_DELAY);
HAL_UART_Transmit(&huart2,shuzhu,8,100);
/* USER CODE END WHILE */
效果展示: