文章目录
一、主要任务
了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别;了解"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。 使用HAL库(或标准库)方式,设置USART1 波特率为115200,1位停止位,无校验位,分别采用中断方式、DMA方式完成下列任务:
STM32系统给上位机(win10)连续发送“hello windows!”;当上位机给stm32发送字符“stop”后,stm32暂停发送“hello windows!”;发送一个字符“start”后,stm32继续发送;
二、关于串口
2.1串口协议
通用异步收发器UART是一种串行、异步、全双工的通信协议,将所需传输的数据一位接一位的传输,在USRT通讯
协议中信号线上的状态为高电平代表‘1’,低电平代表‘0’。其特点是通信线路简单,只要一对传输线就可以实现双向通信,大大降低成本,但传输速度较慢。
串口协议用于与其他模块之间的信息交互,包含接收模块和发送模块,信号传输线上根据波特率完成码元的接收和发送,因而接收模块主要完成串并转换,串并转换是接收和发送模块必备的基本功能,发送模块完成串并转换,接收模块完成串并转换
2.2RS-232标准
串口通信的物理层有很多标准及变种,我们主要讲解RS-232标准,RS-232标准主要规定了信号的用途、通讯接口以及信号的电平标准。
使用RS-232标准的串口设备间常见的通讯结构如下:
上面的通讯方式中,两个通讯设备的“DB9接口”之间通过串口信号线建立起连接,串口信号线中使用“RS-232标准”传输数据信号。由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个“电平转换芯片”转换成控制器能识别的“TTL标准”的电平信号,才能实现通讯。
2.3TTL标准与RS-232标准的区别
下图为TTL电平标准与RS232电平标准
常见的电子电路中使用TTL的电平标准,理想状态下,使用5V表示二进制逻辑1,使用0V表示逻辑0;而为了增加串口通讯的远距离传输及抗干扰能力,它使用-15V表示逻辑1,+15V表示逻辑0。在表示同一个信号的RS232与TTL电平的对比图:
由于控制器一般使用TTL电平标准,所以常常会使用MA3232芯片对TTL及RS-22电平的信号进行相互转换。
2.4USB转TTL原理
- 串口发送
串口应用发送数据->USB串口驱动获取数据->驱动将数据经过USB通道发送给USB串口设备->USB串口设备接收到数据通过串口发送
- 串口接收
USB串口设备接收串口数据->将串口数据经过USB打包后上传给USB主机->USB串口驱动获取到通过USB上传的串口数据->驱动将数据保存在串口缓冲区提供给串口应用读取
- USB转串口CH340接线
下图是USB转串口模块的一些功能模块的标示,USB转串口电路板背后还预留了一些全信号输出的接口,可以将电线直接焊接在这些引脚上来使用预留的功能
下图是对USB转串口模块的引脚标示
三、使用中断实现串口发送和接受
3.1安装CH340驱动
链接:https://pan.baidu.com/s/1tSoIaN99xB_tZRAGNaxIjg?pwd=1i1y
提取码:1i1y
进入链接,点击.exe应用程序,再点击安装。跳出“驱动预安装成功”即可。打开电脑的控制管理器,在端口中看到有COM端口出现,说明安装成功。
3.2使用HAL库生成项目
选择STM32F103C8T6芯片
配置RCC
配置SRS
配置串口,并选择异步,可以看到串口的相关参数,波特率为115200,1位停止位,无检验位
在NVIC中勾选出串口1即USART1
为项目命名,并选择MDK-ARM,最后将项目导出到Keil
3.3编写程序
重定义printf()函数,之后可以直接printf输出
命令 HAL_UART_Transmit (&huart1,(uint8_t *)&ch,1,100)
表示从发送信号,参数:
第一个参数输出的相应串口
第二个参数表示发送的信号的存储地址
第三个参数表示发送的字符个数
第四个参数是发送超时时间,单位为ms
具体实现代码:
#include "stdio.h"
#if 1
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit (&huart1,(uint8_t *)&ch,1,100);
return ch;
}
#endif
使用中断实现串口
其中命令:HAL_UART_Receive_IT(&huart1,(uint8_t *)&aRxBuffer,1)
表示在串口接收信号,参数:
第一个参数输入相应串口
第二个参数表示接收的参数的存储地址
第三个参数表示接收的字符个数
第四个参数是接收超时时间,单位为ms
中断实现串口的具体流程,这里表示如果接收到的信号为“*”则开始发送“hello world!”,如果接收的信号为“#”,则停止发送
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Receive_IT(&huart1,(uint8_t *)&aRxBuffer,1);
if(huart->Instance == USART1)
{
switch(aRxBuffer)
{
case '#':flag=0;break;
case '*':flag=1;break;
}
}
}
main.c函数内容:
while (1)
{
printf("hello windows\r\n");
}
3.4硬件实现
先在Flymcu上进行烧录,烧录成功
之后进入串口调试助手,波特率设置为115200,停止位1为,数据为8为,无校验位,输入“*”开始发送