一、 串口协议
串口通信协议是基于串口使得通信双方能够相互沟通信息的一种约定,其定义了双方遵循的协议数据帧格式和其传输方式
1.1 RS232标准
RS-232(又称EIA RS-232)是常用的串行通信接口标准之一,由美国电子工业协会(EIA)联合贝尔系统公司、调制解调器厂家及计算机终端生产厂家于1970年共同制定。它具有信号线少、灵活的波特率选择、采用负逻辑传送和传送距离较远等特点。 RS-232C 标准(协议)的全称是 EIA-RS-232C 标准,其中EIA (Electronic Industry Association)代表美国电子工业协会,RS(recommended standard)代表推荐标准,232是标识号,C代表RS232的最新一次修改(1969),在这之前,有RS232B、RS232A。它规定连接电缆和机械、电气特性、信号功能及传送过程。常用物理标准还有EIARS-422A、EIA RS-423A、EIARS-485。这里只介绍EIA RS-232C(简称232,RS232)。例如,目前在IBM PC机上的COM1、COM2接口,就是RS-232C接口。
1.2RS485标准
RS-485接口具有良好的抗噪声干扰性,长的传输距离和多站能力等上述优点就使其成为首选的串行接口。因为RS485接口组成的半双工网络,一般只需二根连线,所以RS485接口均采用屏蔽双绞线传输。 RS485接口连接器采用DB-9的9芯插头座,与智能终端RS485接口采用DB-9(孔),与键盘连接的键盘接口RS485采用DB-9(针)。 在RS485标准下,数字信号采用差分传输方式,能够有效减少噪声信号的干扰。但是RS-485总线标准对于通信网络中相关的应用层通信协议并没有做出明确的规定,则对于用户或者相关的开发者来说都可以建立对于自己的通信网络设备相关的所适用的高层通信协议标准-。同时由于在工业控制领域的应用RS-485总线通信网络的现场中,经常是以分散性的工业网络控制单元的数量居多并且各个工业设备之间的分布较远为主,将会导致在现场总线通信网络中存在各种各样的干扰使得整个通信网络的通信效率可靠性不高,而在整个网络中数据传输的可靠性将会直接影响着整个现场总线通信系统的可靠性,因此研究RS-485总线通信系统的通信可靠性具有现实意义
二、三种电平
2.1取值范围
RS232电平,RS485电平和TTL电平的的逻辑值取值范围不同
电位 | 取值 |
---|
RS232 | 逻辑0的取值在-15v到-3v,逻辑1的取值在3v到15v | RS485 | 逻辑0的取值在-6v到-2v,逻辑1的取值在2v到6v | TTL | 逻辑0的取值为0v,逻辑1的取值为+5v |
2.2 USB/TTL转232(CH340)
在串口通信的时候,单片机(下位机)上的电压是TTL电位,电脑(上位机)上的电压是USB电位的,因此有必要了解一下以上电位相互转换原理 这里介绍一种可以直接完成转换的芯片CH340。 CH340 是一个USB 总线的转接芯片,实现USB 转串口、USB 转IrDA 红外或者USB 转打印口。 在串口方式下,CH340 提供常用的MODEM联络信号,用于为计算机扩展异步串口,或者将普通的串口设备直接升级到USB 总线。 在红外方式下,CH340 外加红外收发器即可构成USB 红外线适配器,实现SIR 红外线通讯。 引脚图如下: 接口电路图如下
三、实现串口通信
下面用以上介绍的CH340芯片和STM32的最小开发板完成一次串口通信的实例。
3.1实验器材
CH340 最小开发板 杜邦线
3.2连接方式
3.3软件实现
1.初始化 首先要初始化的是时钟,这里用到了USART1,在APB2总线下,同时还有TX,RX串口,分别对应A9,A10,所以还需要使能GPIOA时钟。 然后就是分别配置USART模块和GPIO模块 GPIO模块,根据要求需要输出模式配置为复用推挽输出,输出引脚为PA9,输出速率一般选择50MHZ USART1模块,设置波特率为115200,起始位和停止位都是一位,无校验位,帧总长度位8位,选择模式位发送模式 具体代码如下 `void Serial_Init(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
}`
2.发送函数 在头文件stm32f10x.h中有发射一个比特的函数Serial_SendByte() ,如果我们想发射字符串,就需要在这上面继续写一个函数
void Serial_SendString(char *String) { uint8_t i; for (i = 0; String[i] != ‘\0’; i ++) { Serial_SendByte(String[i]); } }
通过这个函数,我们就可以发送任意字符串了 在主函数上调用该函数发送 “hello Windows”
3.4烧录
stm32芯片烧录一般有两种方式,一种是该公式生产的STlink的虚拟调制器,还有一种是用USB转TTL接口,即CH340。我们采用后者。 烧录前,需要先了解stm32的三种启动模式 BOOT1=x BOOT0=0 从用户闪存启动,这是正常的工作模式。 BOOT1=0 BOOT0=1 从系统存储器启动,这种模式启动的程序功能由厂家设置。 BOOT1=1 BOOT0=1 从内置SRAM启动,这种模式可以用于调试。 所以烧录的时候,BOOT0需要置一,烧录完后如果想打开串口助手查看程序运行需要把BOOT0置零,回归正常工作状态 编译代码前需要先勾选output选择中生成.hex文件的选项 在烧录软件中选择hex文件的目录 完成后开始编程即可,编程后需按压芯片复位键才可以完成烧录。
3.5结果显示
打开串口助手,调整波特率为115200,找到对应串口号(若无,则需要安装串口驱动),每按压一次复位键,串口会弹出“hello,windows” 实验完成
四、观察串口输出的波形
先配置调整选项 打开调整界面 选择串口USART1
打开波形分析仪
加入串口USART1_SR,类型选bit 开始调试 结果如下
五、总结
本次学习理论与实践结合,细节较多,参考来源较广,需仔细甄选,认真识别。
六、参考
1.https://blog.csdn.net/lxm920714/article/details/123255457 2.https://blog.csdn.net/m0_52869979/article/details/120978967 3.https://blog.csdn.net/ydgd118/article/details/120114652 4.https://www.bilibili.com/video/BV1th411z7sn?p=26&vd_source=2ed968bffd4cf5758431b45852b18164
|