当前位置: 首页 > news >正文

蓝桥杯----串口

(五)、串口

      1、串口通信简介

       制定通信的规则,通信双方按照协议规则进行数据收发,将一个设备的数据传送到另一个设备,扩展硬件系统,串口USART有两根通信线Tx、Rx,可同时双向通信,称之为全双工,像I2C只有一根数据线只能收或者发,之为半双工。

       同步即有一根时钟线,如SCL、SCLK时钟线,据时钟线指引采样数据;异步无时钟线,需要双方约定采集频率,按照约定收发数据。在蓝桥杯中就需要约定运行频率、波特率等。

       单端就是引脚的电平为对地的电压差,必须共地,差分就是根据两个线的电压差来传输数据。

                             图 九 串口简介

 

       2、串口通信结构图

        蓝桥杯中可以理解设备一为电脑、设备二为单片机,Tx、Rx必须交错连接,主机设备给串口进行供电。我们一般选用串口一以定时器二为发生器,波特率就是传输速度一般选用9600,在STC_ISP中串口波特率计算器中按如图所示配置(图 十一)生成代码,生成后要打开总中断与串口使能(EA = 1; ES = 1)。这样我们就约定好了采集频率,可以进行下一步收发。

 

                        图 十 串口通信结构图

                        图 十一 串口配置

       3、发送代码展示

        第一个USART1_Init就是 软件生成的,自行添加EA = 1;ES =1,下面一个函数简单来讲就是把串口一发送映射到printf上,通过printf来发送,而printf是可以发送字符串的,借助putchar自动一个个发送,所以此时我们完善putchar函数,将发送数据ch放在SBUF中,通过检测TI发送标志位,发送完成会变成1,所以此时通过while循环等待发送完成,在软件中手动置0。该函数可以外部调用,但需声明stdio.h头文件。

        通过调用printf即可完成发送,如printf(“hsj”);即可向电脑发送hsj字符串数据。在stc-isp中借助USB-CDC/串口助手可验证。配置9600波特率、无校验,一位停止位,选择正确串口com再打开串口即可。

                    图 十二 串口发送代码展示

 

      4、接收代码展示

     接收电脑传输数据时,可能在任何时刻,接收不及时则会导致数据流失,则我们要借助中断暂时跳出主程序,先接收完数据再回到主程序,来完成发送功能。

     中断标志位为4,RI为接收标志位,一旦有数据需要接收,立马变成1。拉高Uart_Recieve_Flag标志位开始计时,在定时器一的中断中if(Uart_Recieve_Flag==1) Uart_Recieve_Trick++;将数据储存到数组中,并手动拉低标志位(RI = 0),如果数据过多我们就通过string.h中库函数memset清空数组。

    在Uart_Proc中检测Uart_Recieve_Index,为0证明无数据直接跳出函数,有数据时判断Uart_Recieve_Trick计时变量,超过10ms表示接收完成停止计时(Uart_Recieve_Flag = 0),开始解析代码,判断接收的数据,完成后通过memset再清空数组。

                      图 十三 接收代码展示1

                     图 十四 接收代码展示2

 

        5、总结

      第一步借助软件配置波特率发生器

       接下来完善putchar函数,借助printf发送

       完成中断处理函数

       完成主程序超时解析部分

 

提供参考代码,希望对读者有帮助

1、串口底层代码

#include <STC15F2K60S2.H>
#include <stdio.h>void Uart1_Init(void)	//9600bps@12.000MHz
{SCON = 0x50;		//8位数据,可变波特率AUXR |= 0x01;		//串口1选择定时器2为波特率发生器AUXR |= 0x04;		//定时器时钟1T模式T2L = 0xC7;			//设置定时初始值T2H = 0xFE;			//设置定时初始值AUXR |= 0x10;		//定时器2开始计时EA = 1;             //打开总中断ES = 1;             //打开串口使能
}extern char putchar (char ch)  //将串口1映射到printf上自动发送字符串
{SBUF = ch;while(TI == 0);   //等待发送TI = 0;           //发送完成并清空标志位return ch;
}

2、处理数据函数

idata unsigned char Uart_Send[15];   //发送数据数组
idata unsigned char Uart_Recieve[10];  //接收数据数组
idata unsigned char Uart_Recieve_Index;  //接收数组指针
idata unsigned char Uart_Recieve_Flag;   //接收标志位,1表示已接收
idata unsigned char Uart_Recieve_Trick;  //计时变量,用于超时解析void Uart_Proc()
{if(Uart_Recieve_Index == 0) return;  //无数据则返回if(Uart_Recieve_Trick >=10)  //超时解析{Uart_Recieve_Flag = 0;  //停止计时Uart_Recieve_Trick = 0;//解析接收内容//解析接收内容memset(Uart_Recieve,0,10);  //清空数组Uart_Recieve_Index = 0;}
}//补充在定时器中需写
//if(Uart_Recieve_Flag == 1) Uart_Recieve_Trick++;

3、中断函数

void Uart_Routine() interrupt 4
{if(RI == 1)  //有数据{Uart_Recieve_Flag = 1;  //开始计时Uart_Recieve_Trick = 0;Uart_Recieve[Uart_Recieve_Index] = SBUF;  //储存数据Uart_Recieve_Index++;RI = 0;   //复位标志位if(Uart_Recieve_Index>10)  //超载则清空数组{memset(Uart_Recieve,0,10);Uart_Recieve_Index = 0;}}}

 

 

 

http://www.dtcms.com/a/310942.html

相关文章:

  • 内存、硬盘与缓存的技术原理及特性解析
  • 《软件测试与质量控制》实验报告二 单元测试
  • Ubuntu系统VScode实现opencv(c++)视频及摄像头使用
  • 空间平面旋转与xoy平行
  • 【BTC】挖矿
  • MyBatisPlus之CRUD接口(IService与BaseMapper)
  • 【软考中级网络工程师】知识点之堆叠
  • 公网服务器上Nginx或者Openresty如何屏蔽IP直接扫描
  • CS课程项目设计7:基于Canvas交互友好的五子棋游戏
  • 小智服务器Java安装编译(xinnan-tech)版
  • 【05】OpenCV C#——OpenCvSharp 图像基本操作---转灰度图、边缘提取、兴趣区域ROI,图像叠加
  • 28Rsync免密传输与定时备份
  • 【Spring Boot 快速入门】五、文件上传
  • 图漾相机-ROS1_SDK_ubuntu 4.X.X版本编译
  • Shell【脚本 02】离线安装配置Zookeeper及Kafka并添加service服务和开机启动(脚本分析)
  • [硬件电路-122]:模拟电路 - 信号处理电路 - 模拟电路与数字电路、各自的面临的难题对比?
  • [硬件电路-124]:模拟电路 - 信号处理电路 - 测量系统的前端电路详解
  • 编程与数学 03-002 计算机网络 20_计算机网络课程实验与实践
  • filezilla出现connected refused的时候排查问题
  • Flink2.0学习笔记:Stream API 窗口
  • 鸿蒙智选携手IAM进驻长隆熊猫村,为国宝打造智慧健康呼吸新空间
  • 智能合约漏洞导致的损失,法律责任应如何分配
  • Hyperliquid:揭秘高性能区块链共识引擎HyperBFT
  • 入门MicroPython+ESP32:《点亮LED灯》
  • 1.7vue声明周期
  • Token系列 - 再谈稳定币
  • 保证金率(Margin Ratio)
  • 【最新区块链论文录用资讯】CCF A--WWW 2025 23篇
  • WebForms 简介
  • Redis 核心概念、命令详解与应用实践:从基础到分布式集成