文章目录
一
了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别;了解"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。
1.何为串口通信协议
串口通信指两个或两个以上的设备使用串口按位(bit)发送和接收字节。可以在使用一根线发送数据的同时用另一根线接收数据。 串口通信协议就是串口通讯时共同遵循的协议。 协议的内容是每一个bit 所代表的意义。
2.RS-232
RS-232(ANSI/EIA-232标准) 只支持点对点, 最大距离 50英尺。最大速度为128000bit/s,距离越远速度越慢。 支持全双工(发送同时也可接收)。
以下是RS-232的主要特点:
电气特性:RS-232采用不平衡的电气特性,使用正负电平来表示逻辑0和逻辑1。
线缆:常见的RS-232连接线缆使用DB-9或DB-25接头,其中包括数据线、控制线和地线等。
通信距离:通常的最大通信距离约为50英尺(15米),但使用特殊的信号放大器可以扩展到更远的距离。
数据速率:RS-232支持可调节的数据速率,通常范围是110 bps到115.2 kbps。
应用领域:由于其可靠性和广泛的应用历史,RS-232在计算机终端、调制解调器、串口打印机等设备中得到广泛应用。
3.RS232电平与TTL电平的区别
(一)电平标准
TTL电平
输出 L: \u003C0.8V ; H:>2.4V。\n\n输入 L: \u003C1.2V ; H:>2.0V\n\nTTL器件输出低电平要小于0.8V,高电平要大于2.4V。输入,低于1.2V就认为是0,高于2.0就认为是1。于是TTL电平的输入低电平的噪声容限就只有(0.8-0)/2=0.4V,高电平的噪声容限为(5-2.4)/2=1.3V。
RS232电平
在TXD和RXD数据线上:
(1)逻辑1为-3~-15V的电压
(2)逻辑0为3~15V的电压
在RTS、CTS、DSR、DTR和DCD等控制线上:
(1)信号有效(ON状态)为3~15V的电压
(2)信号无效(OFF状态)为-3~-15V的电压
(二)
1.电平的上限和下限定义不一样,CMOS具有更大的抗噪区域。 同是5伏供电的话,ttl一般是1.7V和3.5V的样子,CMOS一般是2.2V,2.9V的样子,不准确,仅供参考。
2.电流驱动能力不一样,ttl一般提供25毫安的驱动能力,而CMOS一般在10毫安左右。
3.需要的电流输入大小也不一样,一般ttl需要2.5毫安左右,CMOS几乎不需要电流输入。
4.很多器件都是兼容TTL和CMOS的,datasheet会有说明。如果不考虑速度和性能,一般器件可以互换。但是需要注意有时候负载效应可能引起电路工作不正常,因为有些ttl电路需要下一级的输入阻抗作为负载才能正常工作。
4."USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。
1.基本工作原理
USB主机检测到USB转串口设备插入后,首先会对设备复位,然后开始USB枚举过程。USB枚举时过程会获取设备描述符、配置描述符、接口描述符等。描述符中会包含USB设备的厂商ID,设备ID和Class类别等信息。操作系统会根据该信息为设备匹配相应的USB设备驱动。
USB虚拟串口的实现在系统上依赖于USB转串口驱动,一般由厂家直接提供,也可以使用操作系统自带的CDC类串口驱动等。驱动主要分为2个功能,其一注册USB设备驱动,完成对USB设备的控制与数据通讯,其二注册串口驱动,为串口应用层提供相应的实现方法。
2.CH340模块介绍
实物图
内部结构图
二
安装 stm32CubeMX,配合Keil,使用HAL库(或标准库)方式,设置USART1 波特率为115200,1位停止位,无校验位,完成下列任务:
1)STM32系统给上位机(win10)连续发送“hello windows!”。win10采用“串口助手”工具接收。
一、通过CubeMX配置项目
1.设置RCC
2.设置SYS
3.设置USART
4.设置NVIC
5.Clock Configuration界面设置
6.Project Manager页面设置
7.点击右上角创建工程
二、main.c函数编写
1.在main函数前定义全局变量
char c;//指令 #:停止 *:开始
char message[]="hello Windows\n";//输出信息
int flag=0;//标志 #:停止发送 *.开始发送
2.在main函数中设置接收中断
MX_GPIO_Init();
MX_USART1_UART_Init();
3.main函数中的while循环里面添加传输代码
if(flag==1){
//发送信息
HAL_UART_Transmit(&huart1, (uint8_t *)"hello windows!\r\n", 16 , 0xffff);
//延时
HAL_Delay(1000);
}
4.在main函数下面重写中断处理函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
//当输入的指令为0时,发送提示并改变flag
if(c=='#'){
flag=0;
}
//当输入的指令为1时,发送提示并改变flag
else if(c=='*'){
flag=1;
}
5.main.c函数运行成功截图:
2)在完成以上任务基础,继续扩展功能:当上位机给stm32发送一个字符“#”后,stm32暂停发送“hello windows!”;发送一个字符“*”后,stm32继续发送;
烧录
实验结果视频
当发送*号后不断输出“hello windows”,当输入#后端口停止输出
1698241439266
三
在没有示波器条件下,可以使用Keil的软件仿真逻辑分析仪功能观察串口输出波形,并分析时序状态正确与否,计算波特率实际为多少。
1.点击Debug->Start/Stop Debug Session
2.点击 Logic Analyzer
3.点击左上角的Setup进行如下设置
最终波形图
四、总结
串口通信是MCU最基本的通信方式,对于STM32来说也是如此,学号串口通信的知识是日后深入学习STM32的基础,本次实验让我掌握了串口通信的基本原理以及实际运用。实验中遇到困难在所难免,因为初学STM32串口通信还是不太熟练,只能跟着网上的步骤一步一步做,去理解它。比如我就遇到板子没连接正确,烧录不成功等问题,通过不停查询最终解决了问题,掌握一些技巧之后,逐渐熟练,希望在日后我也能将串口通信灵活地进行运用。