文章目录
一. 了解串口协议和RS-232标准
1.1 串口协议
串口通信指两个或两个以上的设备使用串口按位(bit)发送和接收字节。可以在使用一根线发送数据的同时用另一根线接收数据。 串口通信协议就是串口通讯时共同遵循的协议。 协议的内容是每一个bit 所代表的意义。 常用的串口通信协议 有以下几种:
1.RS-232(ANSI/EIA-232标准) 只支持 点对点, 最大距离 50英尺。最大速度为128000bit/s, 距离越远 速度越慢。 支持全双工(发送同时也可接收。
2.RS-422(EIA RS-422-AStandard),支持点对多一条平衡总线上连接最多10个接收器 将传输速率提高到10Mbps,传输距离延长到4000英尺(约1219米),所以在100kbps速率以内,传输距离最大。支持全双工(发送同时也可接收。
3.RS-485(EIA-485标准)是RS-422的改进, 支持多对多(2线连接),从10个增加到32个,可以用超过4000英尺的线进行串行通行。速率最大10Mbps。支持全双工(发送同时也可接收)。2线连接时 是半双工状态。
1.2 RS-232标准
RS-232标准接口(又称EIA RS-232)是常用的串行通信接口标准之一,它是由美国电子工业协会(Electronic Industry Association,EIA)联合贝尔系统公司、调制解调器厂家及计算机终端生产厂家于1970年共同制定,其全名是“数据终端设备( DTE)和数据通信设备(DCE)之间串行二进制数据交换接口技术标准”。
二. RS232电平与TTL电平的区别
2.1 TTL电平
TTL(Transistor-Transistor Logic)电平是一种数字电平标准,代表了逻辑值0和逻辑值1。TTL电平中,0通常被定义为0V至0.8V之间的电压,而1被定义为2V至5V之间的电压。
特点
TTL电平具有高噪声抗干扰能力、低功耗和简单的电路设计特点。
2.2 RS-232电平
RS-232电平是一种标准用于串行通信的电平表示方法,它表示逻辑值0和逻辑值1的方式与TTL电平有所不同。
特点:
RS-232电平通常采用负逻辑,即逻辑值1使用负电平表示,逻辑值0使用正电平表示。
2.3 RS232电平与TTL电平的区别
电平表示方式
首先,最重要的区别在于它们表示逻辑值0和逻辑值1的方式。TTL电平使用电压高低来表示逻辑值,而RS-232电平使用正负电平表示。
三. 了解"USB/TTL转232"模块的工作原理
USB转TTL模块是一种将USB信号转换为串行TTL信号的设备,其工作原理主要涉及USB转换芯片、串口芯片和电平转换电路。USB转换芯片负责USB数据的转换和解析,将USB信号转换为串行数据,并将其发送给串口芯片。串口芯片则负责将串行数据转换为串口信号,并经过电平转换电路转换为TTL电平信号,从而与嵌入式系统进行通信。
3.1 USB转换芯片
USB转换芯片是USB转TTL模块的核心部件,它能够实现USB信号与串行数据的转换,同时负责数据的解析和处理。常见的USB转换芯片有CH340、FT232等,它们可以将计算机发送的USB信号转换为串行数据,经过串口芯片处理后输出为TTL电平信号。
3.2 串口芯片
串口芯片负责接收USB转换芯片发送的串行数据,并将其转换为串口信号。常见的串口芯片有MAX232、CP2102等,它们可以将串行数据转换为TTL电平信号,并通过串口连接到嵌入式系统的串口接口。
3.3 电平转换电路
电平转换电路将串口芯片发送的串口信号转换为适合嵌入式系统的TTL电平信号,从而实现计算机与嵌入式系统之间的稳定串口通信。电平转换电路通常包括电阻、电容等元件,能够将信号电平从RS232转换为TTL。
四. 固件库获取
五. 代码实现
GPIO引脚初始化及控制_LED亮灭
//1.打开APB2时钟(不懂为什么第一步是这个的可以参考我上一篇博客)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
//2.GPIO引脚设置
GPIO_InitTypeDef GPIO_InitStructure;
//GPIO结构体定义
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
//设置GPIO功能模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
//设置作用GPIO引脚
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//配置GPIO速度
GPIO_Init(GPIOB, &GPIO_InitStructure);
//如果你设置的引脚是PB9,()内分别为GPIOB,&你定义的结构体
//3.GPIO输出电平设置
GPIO_ResetBits(GPIOB, GPIO_Pin_9);
//低电平,点亮LED灯(因为我们的LED灯正极接电源侧,负极接引脚PB9,要使LED亮需要使PB9输出低电平导通)
GPIO_SetBits(GPIOB, GPIO_Pin_9);
//高电平,LED灯不亮
USART1串口初始化
void UART_Init(void)
{
//1.开启GPIOA和USART1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
//2.结构体定义
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
//3.USART设置RX/TX
//USART1_TX,默认情况下复用PA9引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
//USART1_RX,默认情况下复用PA10引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);
//4.USART1参数配置
USART_InitStructure.USART_BaudRate = 9600;
//设置波特率为9600
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位占8位
USART_InitStructure.USART_StopBits = USART_StopBits_1; //1位停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //无校验
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
//5.初始化串口1
USART_Cmd(USART1, ENABLE); //使能串口1
}
串口发送字符串
//串口发送字符串函数
void USART_SendString(USART_TypeDef* USARTx, uint8_t *str)
{
while (*str)
{
USART_SendData(USARTx, *str++);
// 等待发送完成
while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
}
}
结果:
六.总结
我们了解了串口通信的基本原理,其中包括波特率、数据位、停止位和校验位等重要概念。然后,我们学习了如何在STM32的固件库中使用相应的函数来初始化和配置串口通信模块,包括开启GPIO时钟、配置GPIO引脚、设置USART参数等步骤。
这次实验让我对串口通信有了更深入的了解和认识,同时也提升了我的实践能力和问题解决能力。