【STC8H】串口通信

        之前有写过IO口模拟串口通信发送接收电脑数据。http://t.csdnimg.cn/AQVi2

--------------------------------------------------------------------------------------

(一)串口简介

1.什么是串口?

串口通信,顾名思义也就是利用串行接口 进行通信。串行接口指串口按位(bit)发送和接收字节。尽管比按字节(byte)传输的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。

串口通信中比较重要的参数包括波特率、数据位、停止位及校验位,通讯双方需要约定一致的数据格式才能正常收发数据。

2.串行通信的传输方向

数据通信中,数据在线路上的传送方式(方向)可以分为:单工通信、半双工通信和全双工通信三种。

单工(Simplex Communication )

单工模式通信使用一根传输线,其数据传输是单向的,仅能沿一个方向,不能实现反向传输,即通信双方发送端和接收端的身份是固定的。通信双方中,一方固定为发送端,一方则固定为接收端。

例子:早期的电视,广播,打印机

半双工(Half Duplex Communication)

半双工模式通信一般使用一根(或一对)传输线,数据可以沿两个方向传输,既可以发送数据又可以接收数据,但不能同时进行发送和接收,同一时刻只允许单方向传送。因此又被称为双向交替通信。数据传输允许数据在两个方向上传输,但是,在任何时刻只能由其中的一方发送数据,另一方接收数据。

半双工模式收发两端都有发送器和接收器,通过收/发开关转接到通信线上。半双工通信中每端需有一个收发切换电子开关,若要改变传输方向,需由开关进行切换,通过切换来决定数据向哪个方向传输。由于要频繁切换信道方向,会产生时间延迟,故传输效率低些,但可以节约传输线路。半双工方式适用于终端与终端之间的会话式通信。

例子:对讲机,RS485

全双工(Full Duplex Transmission)

全双工模式通信指数据由两根不同的数据线(可能还需要控制线、状态线、地线)传送,可以同时进行双向传输。即数据的发送和接收分流,通信双方都能在同一时刻进行发送和接收操作。从功能角度方面讲,全双工通信相当于两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。因此,通信系统的每一端都设置了发送器和接收器,来控制数据同时在两个方向上传送。

与半双工模式相比,全双工可同时进行数据收发,且无需进行方向的切换,没有切换操作所产生的时间延迟。 显然,在其它参数都一样的情况下,全双工比半双工传输速度要快,信息传输效率要高。这对那些不能有时间延误的交互式应用(例如远程监测和控制系统)十分有利。

例子:手机通话,RS422,RS232

(二) 配置串口

  STC8H系列单片机具有4个全双工异步串行通信接口。每个串行口由2个数据缓冲器、一个移位寄存器、一个串行控制寄存器和一个波特率发生器等组成。每个串行口的数据缓冲器由2个互相独立的接收、发送缓冲器构成,可以同时发送和接收数据。

STC8系列单片机的串口1有4种工作方式,其中两种方式的波特率是可变的,另两种是固定的,以供不同应用场合选用。串口2/串口3/串口4都只有两种工作方式,这两种方式的波特率都是可变的。用户可用软件设置不同的波特率和选择不同的工作方式。主机可通过查询或中断方式对接收/发送进行程序处理,使用十分灵活。

其相关寄存器如下:

在这里插入图片描述

下文详细解释如何配置串口1模式0,其余串口及模式可参考串口1的配置但需认真查阅官方的STC8H的阅读手册。

1.串口功能脚切换

2.串口1控制寄存器(SCON)

其中:

REN: 允许/禁止串口接收控制位
0: 禁止串口接收数据
1: 允许串口接收数据
​
TI:串口1发送中断请求标志位。在模式0 中,当串口发送数据第 8 位结束时,由硬件自动将TI置 1,向主机请求中断,响应中断后 T 必须用软件清零。在其他模式中,则在停止位开始发送时由硬件自动将 TI置 1,向 CPU 发请求中断,响应中断后 TI 必须用软件清零。RI:串口1接收中断请求标志位。在模式0中,当串口接收第8位数据结束时,由硬件自动将 I置1,向主机请求中断,响应中断后 RI必须用软件清零。在其他模式中,串行接收到停止位的中间时刻由硬件自动将 RI置 1,向 CPU 发中断申请,响应中断后 RI 必须由软件清零。
​
RI:串口1接收中断请求标志位。在模式0中,当串口接收第8位数据结束时,由硬件自动将 I置1,向主机请求中断,响应中断后 RI必须用软件清零。在其他模式中,串行接收到停止位的中间时刻由硬件自动将 RI置 1,向 CPU 发中断申请,响应中断后 RI 必须由软件清零。

3.串口1数据寄存器(SBUF)

SBUF:串口 1数据接收/发送缓冲区。SBUF 实际是 2 个缓冲器,读缓冲器和写缓冲器,两个操作分别对应两人不同的寄存器,1个是只写寄在器 (写缓冲器),1个是只读寄存器 (读缓冲器)。对 SBUF进行读操作,实际是读取串口接收缓冲区,对 SBUF 进行写操作则是触发串口开始发送数据。

4.辅助寄存器(AXUR)

UART_MOx6: 串1模式 0的通讯速度控制
    0:串门1模式0的波特率不加倍,固定为 Fosc/12
    1:串1模式0的波特率6倍速,即固定为 Fosc/12*6 = Fosc/2
S1ST2: 串1波特率发生器选择位
    0:选择定时器1作为波特率发生器
    1:选择定时器2作为波特率发生器

5.串口1模式1波特率计算公式

串口发送数据:

串口接收数据:

串口1使用的是定时器1为波特率发生器

建议使用定时器速度为1T模式,原因如下:

1T的误差一般比12T的误差小一些!!!

其余定时器和中断部分就按照第二章配置定时器去打开相对应的寄存器就好了...

参考代码:

初始化UART通信。它配置串行通信参数,设置用于波特率生成的定时器(定时器1),并启用相关的中断

6.实现串口通信数据帧打包

前言:

串口通信是一种异步通信方式,收发双方约定好通信速率,通过两根数据线即可简单的时序全双工数据收发。最常用的串口通信协议由1位起始位 8位数据位 1位停止位组成,总共10位,为了提高通信可靠性,也可在停止位前增加 1位奇偶校验位,但同时也增加可开销,每字节数据需要多传1位二进制数。

串口通信虽然简单方便,但实际使用时会发现需要传输的不止1个字节,往往需要传输n个字节组成的数据包,而因为串口通信中字节之间相互独立,在接收数据时面临 数据包对齐防止出错的两大问题。为了解决这两个问题,本文在stc串口助手通过将数据按指定格式输入,然后在keil中接收指定格式并做出相应操作。

(1)数据帧格式:
**帧头**: 本文使用的是 0xAA,0x55两个字节作为头,因为它们对应的二进制位0与1的个数相同分布均匀不易出错。
**帧长**:根据数据帧实际长度确定顿长字节,这里只使用1个字节,故顿长字节最大为255.为提高利用率,规定帧长字节描述的是数据字节的长度,故应重新命名为数据长度字节.
**命令字节**:利用命令字节指定数据字节的功能,例如命令字节为1表示传输温度,为2表示传输湿度等,1字节命令+n字节数据是工业中比较常用的一种格式。
**数据字节**:数据字节长度可变,帧长字节为0,表示没有数据,帧长字节为255,表示有255字节数据。
**校验字节**:比较简单的一种校验方式为和校验,即把校验字节前的所以字节求和,最后保留低8位作为校验字节。
​
**帧尾**: 与帧头相似,这里使用OxC3、0x3C作为帧尾。
(2)实现代码
(2.1)定义串口接收信号结构体

(2.2)串口接收信号初始化函数

跟踪接收数据的Uart_Initef结构中的变量。

(2.3)定义数据帧接收函数

检查特定的帧格式,包括帧头、数据长度、数据和帧尾。如果接收到完整的帧,它将状态设置为1,表示已接收到有效的帧。

(2.4)定义串口任务函数

根据接收到的数据帧执行特定任务的占位符。它当前包含一个switch语句,根据接收到的数据帧的第一个字节执行不同的操作。

例如:串口接收的第一个数据位为1,则实现的功能是翻转P22灯。

(2.5)中断处理函数

处理了接收和发送中断

(2.6)单片机通过串口发送数据给电脑

Send_byte用于通过UART发送单个字节,而Send_String用于发送字节串。

  • 21
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值