目录
1. 串口通信(Serial Communications)
4. "USB/TTL转232"模块(以CH340芯片模块为例)的工作原理
一、串口一些基本知识
1. 串口通信(Serial Communications)
串口通信指两个或两个以上的设备使用串口按位(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线连接时 是半双工状态。
2. RS-232通信协议
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接口。
RS232的工作方式是单端工作方式,这是一种不平衡的传输方式,收发端信号的逻辑电平都是相对于信号地而言的,RS232最初是DTE(数字终端设备)和DCE(数据通信设备)一对一通信,也就是点对点,一般是用于全双工传送,也可以用于半双工传送。采用负逻辑传送,规定逻辑“1”的电平为-5V~-15 V,逻辑“0”的电平为+5 V~+15 V。选用该电气标准的目的在于提高抗干扰能力,增大通信距离。RS -232的噪声容限为2V,接收器将能识别高至+3V的信号作为逻辑“0”,将低到-3 V的信号作为逻辑“1”。
如DB9接口:
在进行通信时,需要接地,然后发送端的接收端RX、TX反向连接
3. RS232电平与TTL电平的区别
TTL电平标准:
输出 L: <0.8V ; H:>2.4V。
输入 L: <1.2V ; H:>2.0V
TTL器件输出低电平要小于0.8V,高电平要大于2.4V。输入,低于1.2V就认为是0,高于2.0就认为是1。
RS232标准:
采用负逻辑电平:
逻辑1为-3~-15V的电压
逻辑0为3~15V的电压
4. "USB/TTL转232"模块(以CH340芯片模块为例)的工作原理
CH340 是一个USB 总线的转接芯片,实现USB 转串口、USB 转IrDA 红外或者USB 转打印口。为了增加串口通讯的远距离传输及抗干扰能力,RS-232标准使用-15V 表示逻辑 1, +15V 表示逻辑 0。常常会使用 MH340芯片对 USB/TTL与RS-232电平的信号进行转换。
CH340驱动就是USB转串口的驱动的一种,因为我们现在的电脑上,已经不存在串口,所以我们一般使用USB转串口芯片,目的只有一个,把电脑的USB口映射为串口用。常用的USB转串口芯片有CH340、CP2102、PL2303、FT232等。芯片是CH340的均可以使用。安装CH340驱动之后,我们使用的开发板子(单片机)连接串口就可以正常发挥其功能了。电脑usb电平转为TTL电平。
电路原理图:
二、配置STM32CubeMX环境
1. 选择stm32f03c8t6芯片
2. 配置RCC
3. 配置sys
4. 配置UART1
5. 配置时钟
6. 工程配置
最后点击生成代码即可
三、串口查询方式发送与接收函数介绍
1. 发送函数 HAL_UART_Transmit
HAL_UART_Transmit是HAl库中的UART接口的数据发送函数,用于将指定长度的数据发送到UART端口。该函数是调用底层的HAL_UART_Transmit_IT或者HAL_UART_Transmit_DMA函数实现,可以实现中断或者DMA方式发送。
函数定义:
HAL_StatusTypeDef HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout)
该函数有四个参数
第一个参数是串口结构体,指明是哪个串口,如UART1
第二个参数是8bit位的的数据
第三个参数是指明发送数据的长度大小
第四个参数规定发送的时间,如果超时还没有发送完成,则返回超时标志(HAL_TIMEOUT)
常用的形式为:
const uint8_t len=4;//发送的数据大小
uint8_t SendBuff[16]="Hello Windows!\n";//发送的数据
HAL_UART_Transmit(&huart1,SendBuff,&len,100);//通过UART1发送,且超时限制为100
2. 接收函数 HAL_UART_Receive
HAL 库操作 USART_DR 寄存器读取串口接收到的数据的函数是:
HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart,
uint8_t *pData, uint16_t Size, uint32_t Timeout);
该函数和发送函数参数是差不多的,即将接收到的数据存储到 *pData位置,大小为size,同样也是时间管理机制,不能超过Timeout
例如需要接收大小为5的数据给接收数组:
const uint8_t len=5;//发送的数据大小
uint8_t ReBuff[5];//接收数组
HAL_UART_Transmit(&huart1,ReBuff,&len,100);//通过UART1接收,且超时限制为100
四、程序思路和编写
1. 程序思路
该程序是使用轮询模式进行串口通信,轮询模式是指一直在循环中判断接收,或者选择发送。实现一个简单的功能,如果电脑通过串口调试助手给单片机发送”*“,单片机就每隔1s给电脑发送”Hello Windows!“,如果PC发送”#“,单片机就停止发送。
2. 程序编写
1. 变量定义
char SendBuff[16]="Hello Windows!\n"; //发送数组
char ReBuff[1];// 接收数组 1个字符
2. 主函数编写
int main(void)
{
char ch;
uint8_t flag;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
while (1)
{
HAL_UART_Receive(&huart1,(uint8_t *)ReBuff,1,100);
ch=ReBuff[0];
if(ch=='#')
flag=0;
if(ch=='*')
{
flag=1;
}
if(flag==1)
{
HAL_UART_Transmit(&huart1,(uint8_t *)SendBuff,sizeof(SendBuff),100);
HAL_Delay(500);
}
}
五、烧录程序效果与仿真查看波特率
1. 实物效果
2. 仿真查看波特率
修改主函数,直接500ms发送一次“Hello Windows!”:
while (1)
{
HAL_UART_Transmit(&huart1,(uint8_t *)SendBuff,16,100);
HAL_Delay(500);
}
仿真查看波形需要修改一下源码,直接在while1中调用流水灯程序,查看电平持续时间,仿真需要的MDK配置:
波形:
建立窗口查看查看输出:
分析:
从仿真波形上可以看出,发送总共花费时间1.402347ms
在程序中,总共发送“Hello World!\n”共16个字符,一个字符8个bit,在次实验中,包含停止位1位,开始位1位,因此一个字符的帧结构总共10bit
所以上面的那一段波形总共发送了160bit,花费时间1.402347ms
那么波尔率为;
160000/1.402347
通过计算出波特率为114094hz,这与我们配置的115200hz
误差将近1khz
六、总结与参考
1. 通过此次实验成功完成了串口通信的轮询模式,轮询模式是指在循环中一直判断接收到的信息,判断是否是我们想要的结果,然后取执行我们需要执行的内容。但是这样是十分占用CPU的资源的,就和之前的流水灯实验一样,一直判断某个端口是否为高电平,是就执行流水灯,这两种做法都是十分占用CPU资源的,后面可以通过中断或者DMA的方式进行改进,最好的方式是DMA(直接内存访问),该方式是不用通过CPU的,中断还需要通过CPU。
2. 通过仿真查看波形,我们计算出发送160个bit总共花费时间1.402347ms,计算出波特率为114094hz,分析误差的原因:在查看发送开始和完成的时间差时,是通过标线的方式查看的,因此这里会出现一些小的偏差,还有一方面的原因是仿真本身的原因,但是通过串口查看窗口可以看出,我们发送的信息的确是“Hello Windows!\n”,逻辑上面是没有出现错误的,但是也存在一些问题,无法通过波形
3. 通过此次实验,熟悉了一些串口通信的常识和通信协议。
参考:
【精选】RS-232/RS-485/RS-422通信协议介绍_rs422-CSDN博客
源码下载:
交流群 :456948834