文章目录
- 一、串口通讯协议
- 1、RS-232标准
- 2、串口通讯电平标准
- 3、“USB/TTL转232”模块(以CH340芯片模块为例)
- (1) CH340模块介绍
- (2)驱动下载
- 二、STM32向上位机连续发送"hello windows"
- 1、利用STM32CubeMX新建工程
- 2、代码编写
- 3、程序烧录与硬件实现
- 三、扩展功能:当上位机给stm32发送一个字符“#”后,stm32暂停发送“hello windows!”;发送一个字符“*”后,stm32继续发送
- 1、在上述工程中完善代码
- 2、硬件实现
一、串口通讯协议
串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式。在计算机科学里,大部分复杂的问题都可以通过分层来简化,对于通讯协议,也可以用分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。
1、RS-232标准
- RS-232标准为串口通讯的物理层协议,主要规定了信号的用途、通讯接口以及信号的电平标准。
- 在下图的通讯方式中,两个通讯设备的“DB9 接口”之间通过串口信号线建立起连接,串口信号线中使用“RS-232标准”传输数据信号。由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个 “电平转换芯片” 转换成控制器能识别“TTL标准”的电平信号,才能实现通讯。*
2、串口通讯电平标准
根据通讯使用的电平标准不同,串口通讯可分为TTL标准及RS-232标准。
通讯标准 | 逻辑1 | 逻辑0 |
---|---|---|
TTL | 2.4V~5V | 0~0.5V |
RS-232 | -15V ~ -3V | +3V ~ +15V |
- 常见的电子电路中常使用 TTL的电平标准,理想状态下,使用 5V表示二进制逻辑1,使用0V表示逻辑0;而为了增加串口通讯的远距离传输及抗干扰能力,它使用15V表示逻辑1,+15V表示逻辑0。
- 下图为使用RS232与TTL电平校准表示同一个信号时的对比。
3、“USB/TTL转232”模块(以CH340芯片模块为例)
USB转TTL串口模块是一个非常实用的工具,可以测试模块的UART串口通信和通过单片机的UART接口给单片机等下载程序。能够在电脑上的串口助手软件非常直观的显示出串口设备返回的数据以及发送相应的控制数据给串口设备。
(1) CH340模块介绍
TXD:发送端,一般表示为自己的发送端,正常通信必须接另一个设备的RXD。
RXD:接收端,一般表示为自己的接收端,正常通信必须接另一个设备的TXD。
正常通信时模块本身的TXD永远接设备的RXD。
(2)驱动下载
-
CH340驱动是USB转串口的驱动的一种,由于现在的电脑上已经不存在串口,所以我们需要使用USB转串口芯片将把电脑的USB口映射为串口用。
-
驱动安装方法
1、标准INF文件安装方法1. WINDOWS提示找到新硬件,指定驱动程序所在目录DRIVER,自动安装驱动, 2. 如果WINDOWS没有提示找到新硬件,那么在设备管理器的硬件列表中, 3. 选择带问号的USB设备,更新驱动程序并指定目录。
2、使用驱动程序安装工具
4. 直接使用CH341SER.EXE安装包,可以安装/升级/卸载驱动程序,
下载链接:CH341SER.EXE下载链接
下载成功后点击CH341SER_2.EXE进行安装CH341驱动,会弹出一个弹窗,点击安装,安装成功后会显示预安装成功。
3、驱动使用失败
在预安装驱动程序成功后仍然无法使用串口,打开设备管理器找到找到端口(COM和LPT),如下图提示 “非旺玖原装的PL2303,请联系您的供货商”
主要原因是驱动版本过高导致无法兼容,需要降低使用版本,因为老版本的驱动不会提示。需要将驱动版本降低才能使用。具体操作流程:串口提示非旺久原装的解决办法–驱动替换法
二、STM32向上位机连续发送"hello windows"
1、利用STM32CubeMX新建工程
搭建HAL库环境过程参见:TM32CubeMX使用HAL库点亮LED流水灯
- 打开STM32CubeMX选择新建工程
- 在搜索框中查找对应的芯片:STM32F103C8T6,选择Start Project
- 配置USART1,进入Connectivity,选择USART1进行传输,将串口设置为异步工作模式,并开启USART1的全局中断
- 进入Project Managet设置工程名称和路径等,最后点击GENERATE CODE生成文件
2、代码编写
- HAL_UART_Transmit_IT
使用这个函数开启发送中断,发送寄存器为空时触发中断,将要发送的数据送入发送寄存器并发送。发送完成后关闭中断。在此实验中,我们把它当做普通的发送函数即可。HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_int *data, uint16_t Size) /*huart:使用哪个串口进行通信 data: 一个地址,里面是要发送的数据通常是数组 Size: 发送的数据个数*/
- HAL_Delay
HAL_Delay(uint ms)//延时函数
- 完整代码
在main.c中将while(1)中添加如下代码:uint8_t hello[20]="hello world\n"; HAL_UART_Transmit_IT(&huart1,hello,20);
3、程序烧录与硬件实现
烧录软件:FLYMCU
串口通信软件:XCOM
-
烧录程序时需要改变STM32最小系统板子的跳线帽连接方式:将BOOTO的跳线帽连接方式由0–>1,在FLYMCU中选择需要烧录的程序,之后点击开始编程,再按下最小系统板上的复位键即可完成烧录。烧录完成后需要将跳线帽的连接方式更改回置0。
-
运行结果演示
三、扩展功能:当上位机给stm32发送一个字符“#”后,stm32暂停发送“hello windows!”;发送一个字符“*”后,stm32继续发送
1、在上述工程中完善代码
- HAL_UART_Receive_IT
在调用此函数后,程序会将对应串口的接收中断开启,当我们向系统板发送数据时会触发中断。触发中断后,程序会接收数据到你传入的地址中,会读取Size个数据。读取完成后,关闭接收中断使能。由于程序在接收完数据后会关闭接收中断。因此这个函数我们要写在main的死循环中,保证接收中断可以一直开启。HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_int *data, uint16_t Size) /*huart:使用哪个串口进行通信 data: 一个地址,用于保存接受到的数据 Size: 接收的数据个数*/
- 完整代码
在main.c中添加如下代码:uint8_t rcData = '#'; while (1) { //接收中断使能 HAL_UART_Receive_IT(&huart1,&rcData,1); if(rcData == '*')//接收* { uint8_t hello[20]="hello world\n"; HAL_UART_Transmit_IT(&huart1,hello,20); HAL_Delay(500); } else if(rcData == '#')//接收# { } //uint8_t hello[20]="hello world\n"; //HAL_UART_Transmit_IT(&huart1,hello,20); }