一.串口通信的基本原理
1.RS232电平与TTL电平
(1)RS232电平
RS-232电平是串行通信接口中的一种电气标准,它定义了数据通信设备之间的电气特性、连接器类型、数据格式等规范。
a.逻辑1(MARK):电压范围在-3V至-15V之间。
b.逻辑0(SPACE):电压范围在+3V至+15V之间。
逻辑电平与TTL电平的转换:RS-232与TTL(晶体管-晶体管逻辑)电平标准不同。TTL电平通常使用0V至5V的电压表示逻辑状态,其中高电平通常为2.4V至5V,低电平为0V至0.8V。因此,在将RS-232信号与TTL设备连接时,需要进行电平转换。
应用:RS-232广泛应用于计算机与外部设备之间的通信,如打印机、鼠标、键盘等。
(2)TTL电平
a.TTL:输出高电平>2.4V,低电平<0.4V;输入高电平>=2.0V,输入低电平<=0.8V,噪声容限是0.4V;全双工 (5V系统,逻辑1: 2.4V–5V 逻辑0: 0V–0.5V)。
b.TTL指双极型三极管逻辑电路,市面上很多“USB转TTL”模块,实际上是“USB转TTL电平的串口”模块。这种信号0对应0V,1对应3.3V或者5V,与单片机、SOC的IO电平兼容。我们进行串口通信的时候从单片机直接出来的基本上都是TTL电平。
2."USB/TTL转232"模块的工作原理
(1)CH340的工作原理
CH340是一款常见的USB转串口转换芯片,用于实现USB与串口(如RS-232、RS-485等)之间的通信转换。CH340可以将USB信号转换为TTL电平的串口信号,反之亦然,支持USB 2.0标准,提供高速(12Mbps)、全速(1.5Mbps)和低速(1.2Mbps)三种传输速率;可以驱动一个标准的RS-232电平串口,并且具有自动波特率检测功能。在嵌入式系统中,CH340常用于将USB接口转换为串口,以便与计算机或其他串口设备通信,在串口方式下,CH340 提供常用的MODEM联络信号,用于为计算机扩展异步串口,或者将普通的串口设备直接升级到USB 总线。在红外方式下,CH340 外加红外收发器即可构成USB 红外线适配器,实现SIR 红外线通讯。
(2)USB转RS-232
USB转RS-232是指将USB(通用串行总线)接口转换为RS-232接口的转换过程。这种转换允许原本通过USB接口连接的设备(如计算机、平板电脑、智能手机等)与使用RS-232协议的设备(如串口打印机、工业设备、老式电脑等)进行通信,USB转串口模块可以使用5V、3V3电压供电,需要将跳线帽进行安装,对USB转串口模块进行测试,将USB的电压引脚用跳帽接上,然后将RXD和TXD两个引脚用跳帽或者杜邦线接上。
二.串口通信实验1——文件互传
1.实验要求
将两台笔记本电脑,借助 USB/TTL转RS232 模块和杜邦线,建立起串口连接。然后用串口助手等工具软件(如sscom,带文件传输功能)将一台笔记本上的一个大文件(图片、视频和压缩包软件)传输到另外一台电脑。
(1)预估文件大小、波特率和传输时间三者之间的关系,并对比实际传输时间。
(2)如果只接TX--RX, RX--TX 这样两根线,不接电源线或者不接GND地线,文件传输是否还能正常工作?请解释原因。
2.实验过程
(1)首先需要两台电脑,并且两台电脑上都下载好串口调试助手(我们选用的是XCOM V2.6),方便二者发送和接收文件,使用两个USB转TTL模块连接这两台电脑,模块之间需要将TXD连接RXD,RXD连接TXD,3.3V连接3.3V,GND连接GND,具体接线图如下所示:
然后打开串口调试助手(SSCOM--V5.13.1版本),下载链接:https://pan.baidu.com/s/16xUcdI4pRaaCjPcHwjgPQA?pwd=mc4x
发送机选择要发送的文件,发送机发送的图片如下所示:
设置波特率为115200,点击发送文件,传输完成后的界面如下:传输界面如下:
如图看到预计的传输时间大约是25秒。
(2)接收机界面如下:
找到保存的“.DAT文件”,修改后缀为“.jpg”,如图所示:
然后选择打开文件,接收到的图片如下:
文件接收正确!
3.实验分析
(1)理论可知:传输时间=(文件大小*8)/波特率,选择接收机接收到的图片属性:
由于:346KB=346×1024×8=2834432位,时间约为2834432÷115200=24.60秒
(2)对比实际传输时间“ 25s”,可知理论传输时间要小于实际传输时间。分析原因是在传输过程其中插入了一些延时,或者是传输过程中出错导致。
(3)如果只连接TX和RX,而不连接电源和地线,文件传输将无法正常工作,大多数电子设备,包括用于文件传输的设备,都需要电源来供电。电源线(VCC)提供设备运行所需的电压,而地线(GND)则提供参考电压点,确保电子元件能够正确工作。没有电源,设备内部的电子元件无法正常工作,因此无法进行数据传输,虽然信号线(TX和RX)可以传输数据,但它们需要稳定的电源来维持信号强度和稳定性。如果电源不稳定或完全缺失,可能会导致信号衰减、噪声增加,从而影响数据传输的可靠性和速度。
三.串口通信实验2——STM32系统给上位机发送“hello windows!”
1.连续发送
(1)实验任务
STM32系统给上位机(win10)连续发送“hello windows!”,win10采用“串口助手”工具接收。如果STM32的连续发送之间不加延时语句,观察win10端是否出现接收数据丢失的现象。
(2)STM32CubeMx创建项目
.通过STM32CubeMx创建新工程,点击左上角的File文件选择“New Project”,在弹出的界面中,下拉列表输入芯片名称“STM32F103C8T6”,右下角选中后,点击“Start Project”,图详情见上一篇文章。
配置“RCC”,RCC中, HSE选中"Crystal/Ceramic Resonator"项,LSE选择Disable,界面如下:
配置“SYS”,下拉Debug模式 ,选中"Serial Wire"Timebase Source选择“SysTick”,界面如下:
这里我添加了一个LED指示灯,在进行串口通信时,可以通过这个指示灯判断是否在进行通信传输,引脚选择A4,GPIO配置如下:
接着配置USART1,选择USART1进行传输,将串口设置为异步工作模式,
点击Clock Configuration 选择HSE和PLLCLK,
设置Project Manager,这里特别注意,代码的生成路径不要有中文,点击“Code Generator”,勾选图示内容,再点击右上角"GENERATE CODE",生成文件。
最后点击弹出来的窗口里面的open project通过Keil打开新建的HAL库工程。
(3)实验过程
a.先用keil打开工程后,找到main.c文件,在while(1)中添加如下代码内容
有延时语句:
1
while (1)
2
{
3
/* USER CODE END WHILE */
4
char data[]="hello windows!\n";
6
HAL_UART_Transmit(&huart1, (uint8_t *)data, 15, 0xffff);
7
//高电平点亮A4
8
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
9
HAL_Delay(1000);
10
11
//低电平熄灭A4
12
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
13
HAL_Delay(1000);
14
15
16
/* USER CODE BEGIN 3 */
17
}
无延时语句:
1
while (1)
2
{
3
/* USER CODE END WHILE */
4
5
char data[]="hello windows!\n";
6
HAL_UART_Transmit(&huart1, (uint8_t *)data, 15, 0xffff);
7
//高电平点亮A4
8
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
9
10
//低电平熄灭A4
11
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
12
13
/* USER CODE BEGIN 3 */
14
}
b.然后进行编译,生成.hex文件(本节为了方便,采取串口烧录的方式烧录代码):
c.串口烧录:双击点开“FlyMcu”,然后把MCU的boot0置1,boot1置0,接线时注意TXD->A10;
RXD->A9;3V3->3V3;GND->G开始烧录代码。
c.串口烧录:双击点开“野火多功能调试助手”,然后把boot0置1,boot1置0;端口为COM4,波特率为11200,校验位为NONE,数据位为8,停止位为1,然后开始烧录代码。
结果如图所示:
1
2
可以看到,如果STM32的连续发送之间不加延时语句,上位机出现接收数据丢失的现象。
(5)使用软件仿真逻辑分析仪功能观察串口输出波形
首先设置Debug,具体配置如图所示:
使用keil逻辑分析仪,配置要观察的引脚(具体操作见上篇文章)
(2)STM32CubeMx创建项目
通过STM32CubeMx创建新工程,点击左上角的File文件选择“New Project”,在弹出的界面中,下拉列表输入芯片名称“STM32F103C8T6”,右下角选中后,点击“Start Project”。
配置“RCC”,RCC中, HSE选中"Crystal/Ceramic Resonator"项,LSE选择Disable,界面如下:
配置“SYS”,下拉Debug模式 ,选中"Serial Wire"Timebase Source选择“SysTick”,界面如下:
接着配置USART1,选择USART1进行传输,将串口设置为异步工作模式,
点击Clock Configuration 选择HSE和PLLCLK,
后面和之前一样这里就不赘述了。
3)实验过程
先用keil打开工程后,找到main.c文件在主函数中添加如下代码内容:
uint8_t receivedChar;
if (HAL_UART_Receive(&huart1, &receivedChar, 1, 0xffff) == HAL_OK)
{
switch (receivedChar)
{
case '#': // Pause sending message
HAL_UART_Transmit(&huart1, (uint8_t *)"stop", 16 , 0xffff);
break;
case '*': // Resume sending message
HAL_UART_Transmit(&huart1, (uint8_t *)"hello windows!\r\n", 16 , 0xffff);
HAL_Delay(1000);
break;
default: // Continue sending message
HAL_UART_Transmit(&huart1, (uint8_t *)"hello windows!\r\n", 16 , 0xffff);
HAL_Delay(1000);
break;
}
}
然后在while(1)添加如下代码:
HAL_UART_Transmit(&huart1, (uint8_t *)"hello windows!\r\n", 16 , 0xffff);
HAL_Delay(1000);
然后进行编译,生成.hex文件,串口烧录,开始烧录代码;
后序操作和之前一样,也不再赘述了,结果如下:
四.串口通信实验三——串口中断
1.STM32CubeMX配置项目
配置和之前一样,这里便不再赘述,以下为不同之处:
以及将project manager里面的project的Appllication Structure改为basic即可
2.用keil编写相关代码
用Keil打开新建的HAL库工程:首先在main函数前定义全局变量,具体代码如下:
char c;//指令 0:停止 1:开始
char message[]="hello Windows\n";//输出信息
char tips[]="CommandError\n";//提示1
char tips1[]="Start.....\n";//提示2
char tips2[]="Stop......\n";//提示3
int flag=0;//标志 0:停止发送 1.开始发送
然后在while循环里面添加传输代码:
if(flag==1)
{
//发送信息
HAL_UART_Transmit(&huart1, (uint8_t *)&message, strlen(message),0xFFFF);
//延时
HAL_Delay(1000);
}
最后重写中断处理函数HAL_UART_RxCpltCallback()
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
//当输入的指令为0时,发送提示并改变flag
if(c=='0'){
flag=0;
HAL_UART_Transmit(&huart1, (uint8_t *)&tips2, strlen(tips2),0xFFFF);
}
//当输入的指令为1时,发送提示并改变flag
else if(c=='1'){
flag=1;
HAL_UART_Transmit(&huart1, (uint8_t *)&tips1, strlen(tips1),0xFFFF);
}
//当输入不存在指令时,发送提示并改变flag
else {
flag=0;
HAL_UART_Transmit(&huart1, (uint8_t *)&tips, strlen(tips),0xFFFF);
}
//重新设置中断
HAL_UART_Receive_IT(&huart1, (uint8_t *)&c, 1);
}
3.代码的编译和烧录
然后开始编译,生成.hex文件,串口烧录:双击点开“FlyMcu”,然后把MCU的boot0置1,boot1置0,接线时注意TXD->A10;RXD->A9;3V3->3V3;GND->G开始烧录代码;
结果如下:
五.串口通信实验四——DMA
1.DMA基本原理
DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作,DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。DMA所需要的核心参数:
a.数据的源地址 。
b.数据传输位置的目标地址。
c.传递数据多少的数据传输量。
d.进行多少次传输的传输模式 。
2.1STM32CubeMX配置项目
使用CubeMX创建项目File-New Project,选择芯片STM32F103C8T6,后序步骤一样,这里展示不一样的:
注:仍为basic哦
在while(1)循环完整函数如下:
uint8_t data[] = "Congratulation birdy,DMA test successful\r\n";
HAL_UART_Transmit_DMA(&huart1,(uint8_t *)data,30);
HAL_Delay(1000); //
然后开始编译,生成.hex文件,串口烧录:双击点开“FlyMcu”,然后把MCU的boot0置1,boot1置0,接线时注意TXD->A10;RXD->A9;3V3->3V3;GND->G开始烧录代码;
结果如下:
3
六.总结
本次实验主要有四个任务:文件互传、给上位机连续发送字符、串口中断、串口DMA,且每个任务中增添了一些细节,在实验过程中,学习了串口通信的编程技巧以及中断编程的应用。这些技巧对于提高程序的可读性和可维护性具有重要意义,通过使用中断,实现了实时数据接收,提高了系统的响应速度。总之,本次串口通信实验让我受益匪浅,不仅加深了对串口通信原理的理解,还提高了编程能力和团队协作能力。在今后的学习和工作中,我会继续努力,将所学知识应用于实际项目中。