51内核UART串行总线环形缓冲区驱动实现

发布者:数字狂想最新更新时间:2019-04-09 来源: eefocus关键字:51内核  UART  串行总线  环形缓冲区 手机看文章 扫描二维码
随时随地手机看文章

1:驱动简述;


驱动实现串口中断接收和发送数据,缓冲区使用环形缓冲区。发送:手动置RI中断标志位为1,发生中断,在中断发送函数中将需要发送的数据一一发送出去,具体见示例;接收:在中断接收函数中保存接收到满足协议的数据,后置接收成功标志位,最终在main函数while循环中轮询接收成功标志位是否置1,如果置1,处理接收到的数据。


2:代码示例;


以下代码模仿modbus协议,贴串口发送函数和中断处理函数,适用于51系列单片机,具体的串口协议可参考modbus协议或者自己根据需求定义。


uart.h文件



#define COM_TX1_Lenth 20

#define COM_RX1_Lenth 20

 

typedef struct

unsigned char TX_read;   //发送读指针

unsigned char TX_write;   //发送写指针

unsigned char B_TX_busy; //忙标志

 

unsigned char RX_Cnt; //接收字节计数

unsigned char RX_read;      //接收读指针

unsigned char RX_write;    //接收写指针 

}COMx_Define;

uart.c文件



//串口发送函数  发送一个字节

void Usart_Tx_Func(unsigned char Data)

{

Usart1_Tx_Buffer[COM1.TX_write] = Data; //装发送缓冲

if(++COM1.TX_write >= COM_TX1_Lenth)

COM1.TX_write = 0;

 

if(COM1.B_TX_busy == 0) //空闲

{  

COM1.B_TX_busy = 1; //标志忙

TI = 1;         //手动触发发送中断

}

}

 

//串口发送函数

void Usart_Send(unsigned char *ptr,unsigned char num)

{

if(num == 0)

{

for(;*ptr!='';ptr++)

{

IO_485 = 1;

Usart_Tx_Func(*ptr);

}

}

else

{

for(;num>0;num--)

{

IO_485 = 1;

Usart_Tx_Func(*ptr++);

}

}

}

 

/********************* UART1中断函数************************/

void UART1_int (void) interrupt 4

{

if(RI)

{

RI = 0;

TH0 = Modbus_Time_Out>>8;

TL0 = Modbus_Time_Out;

TR0 = 1;         //定时器开始计时 

Usart1_Rx_Buffer[COM1.RX_write] = SBUF;

if(++COM1.RX_write >= COM_TX1_Lenth) 

COM1.RX_write = 0;

}

 

if(TI)

{

TI = 0;

if(COM1.TX_read != COM1.TX_write)

{

SBUF = Usart1_Tx_Buffer[COM1.TX_read];

if(++COM1.TX_read >= COM_TX1_Lenth)

COM1.TX_read = 0;

}

else

{

IO_485 = 0;

COM1.B_TX_busy = 0;

}

}

}


关键字:51内核  UART  串行总线  环形缓冲区 引用地址:51内核UART串行总线环形缓冲区驱动实现

上一篇:51单片机之IIC&EEPROM的驱动程序
下一篇:关于单片机通过串口发送浮点数信息

推荐阅读最新更新时间:2024-03-16 16:27

8051单片机的UART0串口初始化
1、C8051f的UART0是异步、全双工串口。其波特率发生器规定由定时器1定时器提供。可配置为8位UART或9位UART(多机通讯第九位用于片选作用)。SYSCLK=24.5MHZ(我的板子采用内部晶振频率作为系统时钟) BAUDRATE=115200(波特率) 2、初值TH1 Tl1配置 由上述公式可计算初值:TH1 = 256-(SYSCLK/BAUDRATE/2)而程序内是TH1 = -(SYSCLK/BAUDRATE/2),这两种是相同的。第一种是以正数的二进制形式保存在计算机内。第二种是负数,取反加1求得补码保存在计算机中。结果是相同的。每当TL1中的值溢出后 TH1存储的重装载值装载到TL1中开始计数。
[单片机]
80<font color='red'>51</font>单片机的<font color='red'>UART</font>0串口初始化
UART0串口编程(一):通信协议设计;RS232标准
嵌入式系统之间采用通信方式交换数据,串行通信是一种最基本的通信手段。现在由于各类CPU均集成了UART部件。本节对串口编程时如何设计串口通信协议,以及对RS232接口进行了说明。 1. 通信协议设计 在进行通信时,每次需要传送的信息一般超过1字节。为此,通信双方必须约定通信数据的排列格式,即通信协议。通常把一次通信过程的全部内容称为一个“通信帧”。通信协议设计就是帧结构设计。在一帧内容中,通常包括以下部分。 (1)起始码:由一个或若干个包含特定内容的字节,表示一个通信帧的开始。起始码的内容必须与通信数据内容有明显区别(不能在通信数据里出现与起始码相同的内容)。当通信帧的总长度比较短,信道质量比较高时,为了提高效率,可
[单片机]
<font color='red'>UART</font>0串口编程(一):通信协议设计;RS232标准
解析工程师所熟知的CAN、UART、IIC、USB等协议解码
随着硬件架构的不断更新,示波器早已不是只能“示波”的仪器了,协议解码就是典型代表!IIC、SPI、UART、CAN、LIN…我们为ZDS系列示波器最多免费配备了37种协议解码分析插件,这么多协议分别用在哪些地方,具体又如何使用呢? 示波器从模拟示波器发展到数字示波器,带来了许多大的改变,例如信号采集、带宽、采样率、屏显等。同样,这样的改变也体现在“协议解码”上,新的解码方式将人们从“0”,“1”的世界中解放出来,大大提高了工作效率。 最初的示波器只是一个简单的波形显示兼数据测量,而我们需要获取协议波形深层次的含义,从而去了解通信的数据正常传输。例如:观察IIC协议,我们需要按照时钟与数据信号一位一位对应,去进行0/1的组合
[测试测量]
解析工程师所熟知的CAN、<font color='red'>UART</font>、IIC、USB等协议解码
51单片机之UART
串口相关寄存器配置 与51单片机串口相关的寄存器有SBUF,SCON,PCON,以及与定时器1(T1)相关的寄存器。 SBUF:串口缓冲寄存器,物理上实际有两个寄存器,地址重叠而已,一个用来发送,一个用来接受。通过读或者写不同操作,才操作不同寄存器,设计在一起是为了简化操作。写入SBUF寄存器的数据会通过TXD引脚发送出去,从RXD引脚的数据可以通过读SBUF获取。 SCON:串口配置寄存器。 SM0和SM1决定了串口的工作方式 10位UART是我们常用的模式,包括起始位,8个数据位(SBUF),一个停止位。11位UART多了一个数据位(TB8,发送数据的第八位;RB8,接受数据的第八位)。波特率可变是由于此时的定
[单片机]
<font color='red'>51</font>单片机之<font color='red'>UART</font>
02-JZ2440裸机学习之系统时钟和UART串口实验
1、S3C2440的系统时钟 1.1、2440的几种频率 笔记本CPU可以 1G 2G ,内存133M等 2440CPU:400MHz -------FCLK-----CPU SDRAM:100M/133M---- HCLK----存储区控制器,中断控制器,LCD,DMA,USB主机模块 串口IIC: -------------------PCLK----IIS,IIC,PWM,MMC,SD,ADC,UART,GPIO,RTC,SPI 定时器:---------------------PCLK 1.2时钟选择与启动方式选择 S3C2440可以选择晶振,或外部时钟。: 1.3PLL 两种PLL
[单片机]
02-JZ2440裸机学习之系统时钟和<font color='red'>UART</font>串口实验
MSP430单片机各种寄存器总结(7)——USCI_A in UART mode
第七章 USCI 7.1 UCA1CTL1 【注意】配置USCI先将UCSWRST置位 7.2 UCA1BR0 & UCA1BR1 BRCLK预分频器 预分频系数=UCA1BR0 + UCA1BR1*256 7.3 UCA1MCTL 注意复习波特率的计算!! 7.4 UCA1RXBUF 接收数据的寄存器 7.5 UCA1TXBUF 发送数据的寄存器,写入后自动发送 7.6 UCA1IE & UCA1IFG 中断使能和中断标志位,其中TX是发送,RX是接受 UCTXIFG置位表明UCAxTXBUF为空,可向其写入待发送字符,若UCTXIE 和GIE也置位,将产生发送中断请求。写UCAxTXB
[单片机]
MSP430单片机各种寄存器总结(7)——USCI_A in <font color='red'>UART</font> mode
stm32F4 串口DMA+环形缓冲区的实现
下面是串口DMA+环形缓冲区的实现,将读写接口抽象出来,实现不定长度的数据收发。 关于环形缓冲区参考: http://blog.csdn.net/jieffantfyan/article/details/53572103 /****************************************************************************** * Copyright (C) 2016, roger * All rights reserved. * * 文件名称: tty.h * 摘 要:控制台驱动 * * 当前版本: 3.0 * 作 者: roger *
[单片机]
基于FPGA/CPLD设计与实现UART
摘 要:UART是广泛使用的串行数据通讯电路。本设计包含UART发送器、接收器和波特率发生器。设计应用EDA技术,基于FPGA/CPLD器件设计与实现UART。 关键词:FPGA/CPLD;UART;VHDL ---UART(即Universal Asynchronous Receiver Transmitter 通用异步收发器)是广泛使用的串行数据传输协议。UART允许在串行链路上进行全双工的通信。 ---串行外设用到RS232-C异步串行接口,一般采用专用的集成电路即UART实现。如8250、8251、NS16450等芯片都是常见的UART器件,这类芯片已经相当复杂,有的含有许多辅助的模块(如FIFO),有时我们不需要
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved