基于HAL库的stm32f103c8t6 串口通信实验(查询方式)

目录

一、串口一些基本知识

         1. 串口通信(Serial Communications)

          2. RS-232通信协议

       3. RS232电平与TTL电平的区别 

       4. "USB/TTL转232"模块(以CH340芯片模块为例)的工作原理

二、配置STM32CubeMX环境

        1.  选择stm32f03c8t6芯片

         2.  配置RCC

          3. 配置sys

          4. 配置UART1

            5.  配置时钟

       6. 工程配置

三、串口查询方式发送与接收函数介绍 

           1.  发送函数 HAL_UART_Transmit 

      2. 接收函数 HAL_UART_Receive

四、程序思路和编写

    1. 程序思路

     2. 程序编写

    五、烧录程序效果与仿真查看波特率

      1. 实物效果

      2. 仿真查看波特率

六、总结与参考


一、串口一些基本知识

         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线连接时 是半双工状态。

c9d5df27905442ecb313be4ff98b4e69.png

          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接口:

9f4b38daf1814b7cb87fc8c38c45da88.png

  19bdf645bd01449aa98b66dbc446ff1e.png

 在进行通信时,需要接地,然后发送端的接收端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的电压 

2735bfca0ec3469ebfa0b1838ed5428e.png


       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电平。

           电路原理图:

4063926da0a647038c6e4b7cec0a47f6.png

二、配置STM32CubeMX环境

        1.  选择stm32f03c8t6芯片

0f78bb15158149009d0471dab7a785d9.png

         2.  配置RCC

51253c5c996f475da0d72c27108e2a88.png

          3. 配置sys

34d0c22ba06a413b87bdb2e848eba8b9.png

          4. 配置UART1

6113098f54424707b4ebb3050f0f4ebd.png

1892bde9772048ceafed645945df758e.png

            5.  配置时钟

86536071cf9649d0a3de44597c0bfa2b.png

       6. 工程配置

2297c5f129624f6ea7d897fc17976905.png

 7a6401756faf4bb1ae5368cccd3e9493.png 最后点击生成代码即可 

三、串口查询方式发送与接收函数介绍 

           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. 实物效果

b718440aae474110b81cb588b520631a.gif

      2. 仿真查看波特率

      修改主函数,直接500ms发送一次“Hello Windows!”:

while (1)
  {
		 HAL_UART_Transmit(&huart1,(uint8_t *)SendBuff,16,100);
		 HAL_Delay(500);
  }

      仿真查看波形需要修改一下源码,直接在while1中调用流水灯程序,查看电平持续时间,仿真需要的MDK配置:

ac0a2abb1c0f40fabd543f7b39a5c405.png

  f0d60eae12f94911b572131ce51aafed.png

 波形:38f32cad914e4795b3654612255e1041.png

建立窗口查看查看输出:

c989b071cbd940959bf2736311db8824.png

4059955cf1944c6999d455454d197e66.png

分析:

            9c5f9cde635040bf99e886f6807926d7.png 从仿真波形上可以看出,发送总共花费时间1.402347ms

在程序中,总共发送“Hello World!\n”共16个字符,一个字符8个bit,在次实验中,包含停止位1位,开始位1位,因此一个字符的帧结构总共10bit

所以上面的那一段波形总共发送了160bit,花费时间1.402347ms

那么波尔率为;

160000/1.402347

398c8ffea1f340bc91c49985192ea3c9.png

 通过计算出波特率为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博客

了解串口协议和RS-232标准,以及RS232电平与TTL电平的区别,了解“USB/TTL转232“模块(以CH340芯片模块为例)的工作原理。_ch340c转232原理图_毛哥的博客的博客-CSDN博客

源码下载:

交流群 :456948834

  • 6
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值