文章目录
一、实验原理准备
了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别;了解"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。
1.1、RS-232标准
串口通信接口标准主要有RS-232、RS-422、RS-485。RS是推荐标准的缩写,232为标识号。RS232可实现全双工通信,最大传送距离为15米,最高速率为20kbps。RS-232是对电气特性以及物理特性的规定,只作用于数据的传输通路上,它并不内含对数据的处理方式。
1.2、RS232电平与TTL电平的区别
串口的4种电气标准比较表
比较项 | TTL | RS232 | RS422 | RS485 |
---|---|---|---|---|
信号类型 | 电平信号 | 电平信号,负逻辑 | 差分信号 | 差分信号 |
电压范围 | 0~3.3v/5.0v | +/-15v | -0.25v~+6v | -7v~+12v |
抗干扰性 | 弱 | 较强 | 强 | 强 |
传输距离 | 1m | 10m | 1.2Km | 1.2Km |
传输带宽 | 100Kb/s | 100Kb/s | 10Mb/s | 10Mb/s |
负载个数 | 1 | 1 | 10 | 32 |
传输模式 | 全双工,点对点 | 全双工,点对点 | 全双工,点对点 | 半双工,多对多 |
导线根数 | 3 | 3 | 4 | 2 |
1.3、USB/TTL转232模块
USB主机检测到USB转串口设备插入后,首先会对设备复位,然后开始USB枚举过程。USB枚举时过程会获取设备描述符、配置描述符、接口描述符等。描述符中会包含USB设备的厂商ID,设备ID和Class类别等信息。操作系统会根据该信息为设备匹配相应的USB设备驱动。
USB虚拟串口的实现在系统上依赖于USB转串口驱动,一般由厂家直接提供,也可以使用操作系统自带的CDC类串口驱动等。驱动主要分为2个功能,其一注册USB设备驱动,完成对USB设备的控制与数据通讯,其二注册串口驱动,为串口应用层提供相应的实现方法。
二、连续发送“hello windows!”
2.1、创建工程及配置
先选择你的芯片类型然后进行配置(此处省略选择过程,只展示配置过程)
2.1.1 RCC配置
2.1.2 时钟配置
配置最大时钟为72MHz,APB2为72MHz,APB1为36MHz
2.1.3 串口配置
2.1.4 串口引脚参数设置
最后配置工程名称,保存位置,编译器等,生成工程即可
2.2、添加程序
while (1)
{
/* USER CODE END WHILE */
HAL_UART_Transmit(&huart1, "hello windows!\r\n",16,100);//发送hello windows!
HAL_Delay(2000);//延时2秒
/* USER CODE BEGIN 3 */
}
这里我直接使用的hello windows字符串,你还可以先定义变量指向字符串
//在private variable处定义,或者也可以在main中定义,与c差不多
uint8_t message[]="hello windows!\r\n";
//在while中代码
while (1)
{
/* USER CODE END WHILE */
HAL_UART_Transmit(&huart1, message,16,100);
HAL_Delay(2000);
/* USER CODE BEGIN 3 */
}
2.3、烧录运行结果
三、扩展(使用字符控制)
在完成以上任务基础,继续扩展功能:当上位机给stm32发送一个字符“#”后,stm32暂停发送“hello windows!”;发送一个字符“*”后,stm32继续发送;
3.1、创建工程及配置
创建工程步骤大致一样,只是还需要打开串口中断,接着上面的步骤即可
3.1.1 开启串口USART1的中断
3.1.2 选择NVIC中断优先级分组
最后配置工程名称,保存位置,编译器等,生成工程即可
3.2 添加程序
程序运行大致流程:
在while循环中使用串口接收中断函数接收数据,如果接收完成(数据位满足)则进入接收完成回调函数中,判断串口类型以及接收字符是否为#
或者*
,如果为#
则将接收标志置为1,即接受到#
,需要将hello windows暂停。如果接收到的是*
,则将接受标志置位0,表示没有接收到#
,不会暂停hello windows的输出。其实回调函数中只改变flag的值,在while循环中,根据flag的值进行判断是否继续输出
代码如下:
// 添加定义
#define LENGTH 1 //接收字符数目
uint8_t RxBuffer[LENGTH];//接收数据
uint8_t RxFlag = 0; //0表示没有收到`#`收到`*`,1表示收到了`#`
//main.c中while循环
HAL_UART_Receive_IT(&huart1, (uint8_t*)RxBuffer, LENGTH); //使能接收中断
while (1)
{
/* USER CODE END WHILE */
if(RxFlag==0){
HAL_UART_Transmit(&huart1, (uint8_t *)"hello windows!\r\n", 16, 0xffff);
HAL_Delay(1000);
}
/* USER CODE BEGIN 3 */
}
//接收回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
if(huart->Instance == USART1 && *RxBuffer == '#'){
RxFlag = 1;
}else if (huart->Instance == USART1 && *RxBuffer == '*'){
RxFlag = 0;
}
HAL_UART_Receive_IT(&huart1, (uint8_t*)RxBuffer, LENGTH); //因为它有效性只有一次,所以在接收完成后需要重新使能
}
3.3、烧录运行
四、仿真逻辑分析仪功能观察串口输出波形
hello windows!\r\n一共有16个字符,所以波形图
一个char型为8bit,起始位1bit,结束未1bit,故一个数据帧有10bit。
由上图可以看出,传递10bit需要86.93056微秒,那么1bit就需要8.693056微秒,波特率大约为115034HZ。
参考资料:
https://blog.csdn.net/qq_45945548/article/details/121720676
https://blog.csdn.net/m0_70536801/article/details/134042199
https://blog.csdn.net/ScilogyHunter/article/details/107135703