STC8H系列单片机入门教程之UART串口基础知识(八)

目录

一、并行通信与串行通信

二、串行通信方式

2.1 同步通信

2.2 异步通信

三、串行通信方向

四、UART

 五、波特率

六、示例代码 


一、并行通信与串行通信

MCU与外部设备进行通信的两种方式:并行通信和串行通信。

并行通信:数据的各个位用多条数据线同时进行传输(一位数据占据一条数据线)。

串行通信:将数据分成一位一位的形式在一条传输线上逐个传输。

二、串行通信方式

串行通信有两种通信方式:同步通信和异步通信。

2.1 同步通信

数据传输时带有时钟同步信号,发送端与接收端在同一时钟的约束下进行数据传输,比如发送端与接收端均在时钟信号的上升沿进行数据的发送/接收。

2.2 异步通信

数据传输时不带时钟同步信号,发送端有自己的时钟CLK1,接收端有自己的时钟CLK2。发送端和接收端通过波特率来进行同步 。比如波特率为9600时,发送端需要在1s内发送9600比特数据,接收端需要在1s内接收9600比特数据。至于发送/接收这9600比特的数据对于发送端/接收端来说需要多少个时钟周期,就不重要的。

三、串行通信方向

串行通信的方向包括:单工、半双工、全双工。

单工:数据只能按照指定方向沿着一个方向传输(类似单行道,不可以逆行);

半双工:数据传输可以沿着两个方向,但是需要分不同的时间进行(类似潮汐车道,道路是唯一的,但是可以根据不同的时间规定不同的传输方向);

全双工:数据可以同时进行双向传输(一条马路上既有从A向B的车道,又有从B向A的车道,可以同时通行,两条车道互不干扰)。

四、UART

UART是一种采用异步串行通信方式的通用异步收发传输器。

UART数据格式是指UART传输的数据包的组成和结构,包括起始位、数据位、校验位和停止位。UART数据格式如下:

起始位:标志数据传输的开始,一般为0。

数据位:传输的实际数据,长度可以是5到9位。

校验位:用于检测数据是否有误,可以是奇校验或偶校验,也可以无校验。数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。

停止位:标志数据传输的结束,一般为1,长度可以是1到2位。

UART数据格式的示意图如下:

数据线在未发送数据之前,处于空闲状态。当 准备要发送数据时,先拉低一位,作为起始位。之后,接收端就能知道在起始位之后的n位数据就是数据位了(事先约定好了数据位是几位,8bit常用)。之后紧接着跟着一位校验位、一位停止位。对于校验位,分为奇校验和偶校验。

 五、波特率

传输速率(波特率):表示每秒传输二进制数据的位数,单位是bps(位/秒)。

常用的为:9600,19200,38400,57600,115200等。

假设波特率为115200,波特率为115200就是指在1S内传输115200bit数据,1s等于10的9次方ns。所以传输1bit的数据需要10的9次方/115200=8680ns;

六、示例代码 

以下代码为stc8H系列单片机串口2初始化子函数及串口2发送一个字节子函数。

/****************************************************************************************
* @名称 		void uart2_init(long baud)
* @功能 		串口二初始化
* @输入参数 	baud - 串口波特率
* @返回 		none
****************************************************************************************/ 
void uart2_init(long baud)
{
	timer2_init(65536UL - (MAIN_FOSC/4)/baud);

	S2CON &= ~(1<<7);   // 8位数据, 1位起始位, 1位停止位, 无校验
	IE2   |= 1;         //允许中断
	S2CON |= (1<<4);    //允许接收
	P_SW2 &= ~0x01; 
	P_SW2 |= 0;         //UART2 switch to: 0: P1.0 P1.1,  1: P4.6 P4.7
}

/****************************************************************************************
* @名称 		void uart2_send_char(unsigned char dat)
* @功能 		串口二发送一个字节
* @输入参数 	dat - 待发送的数据
* @返回 		none
****************************************************************************************/ 
void uart2_send_char(unsigned char dat)
{
	S2BUF = dat;	
	while(!(S2CON & 2));
	S2CON &= ~2;;
}

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
STC单片机串口UART1,2,3,4的配置。几乎适用于所有STC单片机,4个串口可同时配置使用,函数由结构体封装打包好,非常方便。 --------------------------STC_UART函数目录-------------------------- //注意:若主循环正在打印突然跳到中断中恰好又掉用printf1,2,3,4,恢复后会使主循环中的打印错误 //printf与printf1,2,3,4, 相互独立,可同时用且互不影响 //自定义printf1,2,3,4打印函数,打印字符最长限制 #define CMD_BUFFER_LEN 50 //#define UART_Printfx //注释则不使用重定向打印函数 //-------------------------------------------------------------------------------- //UART1,2,3,4初始化 void UART1_Init(u32 BaudRate); void UART2_Init(u32 BaudRate); void UART3_Init(u32 BaudRate); void UART4_Init(u32 BaudRate); //UART1,2,3,4串口打印函数 void printf1 (char *fmt, ...); //变参函数 void printf2 (char *fmt, ...); void printf3 (char *fmt, ...); void printf4 (char *fmt, ...); //UART1,2,3,4发送单个字符 void UART1_SendByte(char dat); void UART2_SendByte(char dat); void UART3_SendByte(char dat); void UART4_SendByte(char dat); //UART1,2,3,4发送字符串 void UART1_SendStr(char *TI_Dat); void UART2_SendStr(char *TI_Dat); void UART3_SendStr(char *TI_Dat); void UART4_SendStr(char *TI_Dat); //UART1,2,3,4接收Leng个字符 void UART1_ReceiveStr(u8 Leng,u8 *dat); void UART2_ReceiveStr(u8 Leng,u8 *dat); void UART3_ReceiveStr(u8 Leng,u8 *dat); void UART4_ReceiveStr(u8 Leng,u8 *dat); //获取期待值 NULL 表示无效的 bit UART_extract(u8 *Puf_0,u8 *Puf_1,u32 time); //从串口中获取所期待的数据 NULL 表示无效的 //计算指针所指数组元素个数 //警告; count(0);返回的是2原因不明 unsigned char count(u8 *p); void UART_Send_Str(char *s); // 发送字符串 void UART_Send_Num(unsigned long dat); // 发送数值 void UART_Send_StrNum(char *inf,unsigned long dat); // 发送字符串+数值 void UART_Send_Hex(unsigned int hex); // 发送16进制(整数范围) void UART_Send_binary(unsigned char dat); // 发送2进制 void UART_Send_Enter(); void UART_Send_Byte(unsigned char dat); //UART初始化 void UART_Init(u8 UARTx, UART_InitTypeDef *UART_InitStructure);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芯航路IOT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值