USB: Universal Serial Bus (通用串行总线)。
USART:Universal Synchronous/Asynchronous Receiver/Transmitter 通用同步/异步串行接收/发送器。
计算机传送数据又两种方式:一种是并行通信,一种是串行通信。
ATA接口,并行;STAT接口,串行。
并行通信 的单位:Bps,Byte per second
串行通信 的单位:波特,1波特=1位/秒(bps,Bit per second)
实验例子:
电路图:
PA9: STM32的串行数据发送引脚。 PA10:STM32的串行数据接收引脚。
PA9和PA10属于STM32内部的串行通信模块USART1(串行端口1,串口1)。
新建项目:
选择USART1 工作模式mode选择 异步。
注意:电路图中虚拟终端的波特率要与其一直!
main.c文件中main()代码为:
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init(); //对串口1进行初始化
/* USER CODE BEGIN 2 */
HAL_UART_Transmit(&huart1, (uint8_t *)"haha", 4, 0xFFFF);
//从串口1(huart1)发送字符串
//“haha”是要发送的字符串;4:要发送的字符个数;0xFFFF:出错时重试次数
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
编译运行,电路图显示结果:
要求:虚拟终端换行显示。
修改代码:
HAL_UART_Transmit(&huart1, (uint8_t *)"haha\rhehe", 9, 0xFFFF);
注意:“\n”在虚拟终端并不能显示换行!
要求:使虚拟终端显示十六进制的ASCii值。
首先必须在电路图运行的情况下,右击Virtual Terminal,首先勾选Echo Typed Characters,再次右击,勾选Hex Display Mode。最后终止运行,再次运行。
要求:
int a = 0x12345678; //整型数据,32位,占4个字节
HAL_UART_Transmit(&huart1, (uint8_t *)&a, 4, 0xFFFF);
STM32是按从后往前存储的,所以虚拟终端上先显示最后一个字节。
创建两个虚拟终端:实现在1号虚拟终端按键,2号虚拟终端显示出来。
main.c中main()函数的代码块如下:
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
/*HAL_UART_Transmit(&huart1, (uint8_t *)"haha\rhehe", 9, 0xFFFF);
从串口1(huart1)发送字符串
“haha”是要发送的字符串;4:要发送的字符个数;0xFFFF:出错时重试次数*/
HAL_UART_Transmit(&huart1, (uint8_t *)"1\r", 1, 0xFFFF);
HAL_UART_Transmit(&huart2, (uint8_t *)"2\r", 1, 0xFFFF);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
uint8_t ch=0;
HAL_UART_Receive(&huart1, &ch, 1, 0xFFFF); //非阻塞
//接收函数,从串口1(huart1)接收1个字节,存入ch。 1:每次只收1个
//如果收到,会把所收到的字节存入ch;如果未收到,就不会改变ch的内容。
if(ch!=0) //ch发生改变,说明收到了新的字符
{
HAL_UART_Transmit(&huart2, &ch, 1, 0xFFFF); //从串口2发送出去,到虚拟终端显示
ch = 0;
}
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
运行结果: