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

USART————单字节串口的发送和发送接收

1、首先是串口发送的实验部分,先进行初始化

用到了USART和GPIO口的时钟并初始化,然后开启使能,其中GPIO口选择复用推挽模式,USART的参数分别为9600的波特率,选择为发送模式

然后是传输各类数据的函数

首先是发送一个字节的函数,这个属于最基础的函数,后续都会以这个为基础

之后是发送一个数组,通过for循环,逐次调用发送字节函数

之后是发送字符串的函数

之后是发送数字的函数,对于数字的发送,选用拆分数字的形式,即通过(数字/10^x次)%10分别得出数字的每一位,以下是10^x次函数

然后定义发送数字的函数,在显示部分加了一个偏移量,因为根据16进制的ASCLL码来说,数字是在ox30或者'0'之后才是数字,因此需要加一个偏移量。

主函数如下所示:分别发送一个16进制数字、数组、字符串、任意10进制数字(显示为10进制)

除了以上方式显示外,还有printf的移植函数;

一般采用第一种,第一种一次只能传输一个字节

定义一个函数在主程序中调用

第二种则是先定义一个字符串,然后打印,最后发送

第三种则是第二种的封装,其中用到了可变参数

以下为主程序中的函数,其中\r\n才表示换行

其中对于汉字的显示,如果Keil用UTF-8则需要在Misc Controls设置中增加一句,如下所示:

在串口助手中也需要配置为UTF-8的模式,如果用GB则两者都为GB,需要统一,这里使用UTF-8的模式

结果显示:

首先需要将串口号改为自己连接的模式在,此电脑-——设备管理器——端口有显示USB连接的串口号,之后打开串口,首先接收模式选择为HEX模式,这个是16进制的显示,因此不论传输什么都将显示为16进制的数字

之后改为文本模式,将以上程序正常显示,按复位键可以重新发送数据:

之后是串口的发送接收实验:

在以上代码的基础上增加了接收的部分程序:

首先是初始化部分:

增加GPIO口10的初始化

将USART的模式增加接收模式

接收主要分为两部分:查询和中断

首先是查询,去判断当RX的标志位置1,表明有数据需要接收,开始接收:

如果是中断,需要增加NVIC的配制以及中断函数:

主函数显示如下:

结果如下:

在发送区发送41,选择HEX模式,接收区有显示:

OLED屏也有显示:

以下是理论部分:

由于单片机的功能有限,因此需要外加别的东西实现功能,譬如蓝牙通信,出现通信协议

全双工:通信双方进行双向通信,双方可以同时发送和接收数据,打电话

半双工:只有一根线进行通信,双方可以交替发送和接收数据,对讲机

单工:只能规定方向的一根线传输,只有一方发送,一方接收不能互换,广播

异步通信没有单独的时钟线需要约定一个采样频率等,靠比特率;同步时钟线

单端信号的双方需要共地,差分信号不需要共地,USB有些模块也需要共地

点对点设备相当于老师叫你去办公室进行谈话

多设备相当于老师在教室和某个同学谈话(可挂载其他设备在总线),需要寻址的过程(找到对应学生)

串口通信可以实现芯片和电脑的通信

一般最简单的电路有以下4个即可

只有电平标准一致的电路才可实现通信

差分信号抗干扰性能强

串口参数:

波特率用于异步通信,如:1000bps,表示1秒发送1000个数据,一个数据是1ms

在空闲状态时,一直为高电平(上拉输入),当起始位来时,出现一个低电平,之后开始传输数据,停止位为高电平

数据位是低位先行,即传输16进制0F时转换为二进制为00001111,那么在发送时就为11110000,像入栈,低位先行之后接收方就能直接接收并显示数据。波形如下所示:

检验位分为:无校验、奇校验、偶校验

左边为无校验,右边为奇校验或者偶校验(只能在一定程度上检查数据是否出错)

对于右边来说:当传输数据为00001111,奇校验,则校验位需要置1,构成5个1,用于查询数据是否出错

CRC校验的性能更好。

接下来是一些串口波形:

发送OX55,波特率为9600,二进制为01010101,而数据为低位先行,就是10101010,起始位为0,停止位为1,无检验位,如下所示:

发送OX55,波特率为4800,波形周期为原来的两倍,偶检验,OX55二进制为01010101,发送时为10101010,偶检验位为0,波形如下:

停止位的长度也可配制:1位、1.5位、2位等

以下是连续发送两个OX55,一个是1位停止位,一个是2位停止位

总的来说是TX定时输出高低电平,RX定时读取高低电平。

USART的外设:

与UART相比多了一个同步通信,用于兼容其他协议,只接受时钟输出,并不能两个USART进行同步通信,它主要是异步通信

数据位长度包含校验位,有校验位数据位为9,没有就是8位

一般在配制时波特率为9600或者115200,无校验位,数据位为8,1位停止位

硬件流控制可以防止当A向B传输数据时因为B的处理速度过慢而导致新数据替代旧数据,有了一根线之后只有当B准备好时A才会传数据。

接下来是一个流程图

当数据传输到发送移位寄存器时,TXE就置1,不论寄存器里的数据是否被转移;当数据传输到RDR时,RXNE置1表示有数据进来需要接收。右移数字。

不同停止位:

之后是采样是当一直检测到高电平,突然出现一个0时,可能表示出现下降沿,将开始16次采样,防止是噪声导致的下降沿出现,前边不满足以下条件都视为噪声引起的错误下降沿,之后开始重新接收,如果在每3位中出现2个0可认为检测通过,但是噪声标志位NE置1,表明有数据接收,但是存在噪声。然后如果经过两次检测后发现接收的数据不是噪声造成,就将8、9、10位作为每一位的正中间进行采样,从而对其了接下来每一个数据位。

之后数据位进行接收,8、9、10次的采样数据为准(正中间,不存在数据正在翻转情况),如果全为1或0就为1或0,如果2个1,1个0,该数据位就为1,反之亦然,这种情况下噪声标志位依然是1。

之后是波特率发生器的定义(库函数可直接得,了解即可)

当输出波特率为9600时,时钟内部频率为72MHz,DIV就等于72MHz/9600/16=468.75转化为二进制就是111010100.11高位补零,剩余补零。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • STM32——I2C和SPI波形分析
  • uniapp中节点信息的使用
  • 使用Dynamic Provision的PV需要Kubernetes集群管理员和用户分别做什么?
  • 3个常用zip压缩包文件打来密码删除方法
  • linux中cd的命令
  • Docker 是什么?
  • 【Linux 驱动】IMX6ULL gpio驱动
  • sqlserver 消息 9420,级别 16,状态 1,第 7 行
  • 计算机二级Python经典易错题和题解
  • vue+elmentui 定义狂拽黑金配色的按钮+消息框
  • 如何在 Kubernetes 上快速部署 Python 和 Laravel 应用:一站式 DevOps 集成指南
  • 18.1 使用python进行网络请求与数据解析
  • Linux查看占用内存或者CPU前10的命令
  • Java参数校验(最佳实践)
  • 2024.8.19(静态文件共享、playbook)
  • [译] 怎样写一个基础的编译器
  • 【刷算法】求1+2+3+...+n
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Docker容器管理
  • Hexo+码云+git快速搭建免费的静态Blog
  • HTTP中的ETag在移动客户端的应用
  • JS变量作用域
  • js写一个简单的选项卡
  • PAT A1017 优先队列
  • python学习笔记-类对象的信息
  • quasar-framework cnodejs社区
  • rc-form之最单纯情况
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • vuex 学习笔记 01
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 搞机器学习要哪些技能
  • 浏览器缓存机制分析
  • 入门级的git使用指北
  • 微信小程序:实现悬浮返回和分享按钮
  • Linux权限管理(week1_day5)--技术流ken
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​ArcGIS Pro 如何批量删除字段
  • ​iOS实时查看App运行日志
  • ​第20课 在Android Native开发中加入新的C++类
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • #nginx配置案例
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • $.ajax,axios,fetch三种ajax请求的区别
  • (function(){})()的分步解析
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (二)正点原子I.MX6ULL u-boot移植
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (函数)颠倒字符串顺序(C语言)
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (四)库存超卖案例实战——优化redis分布式锁
  • (四)事件系统