当前位置:首页 > 技术学院 > 热搜器件
[导读]uart作为程序调试很有帮助,所以一个好的uart模块个人认为非常重要的。

uart作为程序调试很有帮助,所以一个好的uart模块个人认为非常重要的
这里的用stc12单片机,因为不用12分频,所以可以进行115200波特率快速传输(注意晶振必须11.0592MHz,12MHz的会乱码,本人亲测),而如果改用其他的51单片机,只需要把UartInit()函数改成自己的初始化设置就行,比如89c52,当然要记得改52头文件。
此uart本人比较欣赏的是可以直接调用UartPrintf()函数,跟c中prinf()用法几乎相同,支持%d%0.2f等省去了字符转换。而对于接收到的字符命令进行处理只需要在UartReceiveHandler函数中修改即可,例子中是对“End”字符命令进行处理,测试程序main.c是博文手写,未经测试,只是提示主框架用法
main.c-------------------------------------------------------------------------------------------------------
#include"uart.h"
void main(void)
{
    UartInit();
    while(1)
    {
          UartReceiveHandler();
    }
}
uart.h--------------------------------------------------------------------------------------------------------
#ifndef __UART_H__
#define __UART_H__

void UartInit(void);
void UartPrintf(const char *fmt,...);
void UartReceiveHandler(void);

#endif

uart.c--------------------------------------------------------------------------------------------------------

#include"STC12C5A60S2.h"
#include
#include        //stdio.h,stdarg.h用于vsprintf函数原型
#include

 

#define UART0_BUF_LEN 32

int UART1_Recv_count;     //接收计数

bit UART1_Overflow_Flag;//缓冲区满标志
bit MarkFlag = 1;

idata unsigned char UART1_Recv_BUF[UART0_BUF_LEN];
                        //串口接收缓冲区


void UartInit(void)        //115200bps@11.0592MHz
{
    PCON &= 0x7F;        //波特率不倍速
    SCON = 0x50;        //8位数据,可变波特率
    AUXR |= 0x04;        //独立波特率发生器时钟为Fosc,即1T
    BRT = 0xFD;            //设定独立波特率发生器重装值
    AUXR |= 0x01;        //串口1选择独立波特率发生器为波特率发生器
    AUXR |= 0x10;        //启动独立波特率发生器
    ES = 1;             //充许串口1中断
    EA=1;                 //开总中断
}
void sendbyte(unsigned char c)
{
    if(c=='\n')            //如果遇到\n就换行
    {
                        //发送CR(carriage return)
        SBUF=0x0D; 
        while(!TI);        //等待发送完成
        TI=0;
        
                        //发送 LF(NL line feed,new line)
        SBUF=0x0A; 
        while(!TI);        //等待发送完成
        TI=0;       
    }
    else
    {
        SBUF=c;
        while(!TI);        //等待发送完成
        TI=0;
    }
}
 
void sendstring(unsigned char *string)
                        //此处*string相当于数组
{
    while(*string!='\0')//判断是否到字符串末尾
    {
        sendbyte(*string);
        string++;
    }
}
 
void UartPrintf(const char *fmt,...)
{
    va_list ap;
    char xdata string[1024];        //访问内部拓展RAM,非访问外部RAM,不能超过内部拓展RAM大小(此处为1024)
    
    va_start(ap,fmt);
    vsprintf(string,fmt,ap);        //此处也可以使用sprintf函数,用法差不多,稍加修改即可,此处略去
    sendstring(string);
    va_end(ap);
}

 


void UART1_Int(void) interrupt 4
{
    if (RI == 1)
    {
        RI = 0;
        if(UART1_Overflow_Flag==0)
        {
            if(UART1_Recv_count
            {
                UART1_Recv_BUF[UART1_Recv_count++] = SBUF;
                if(SBUF=='\r' || SBUF=='\n')
                {
                    UART1_Overflow_Flag=1;
                }
            }
            else
            {
                UART1_Overflow_Flag=1; // 关闭串口中断,停止接收
            }
        }
    }
}

//void Delay_10ms()
//{
//    unsigned int i,j;
//    for(i=0; i<5; i++)
//        for(j=0; j<2000; j++);
//}
void UartReceiveHandler(void)
{
  
//    unsigned char i;
//    unsigned int Led;
unsigned long Count;

    if (UART1_Overflow_Flag==1) //串口中断数据接收完毕,开始处理
    {

 


        if(0 == strncmp("End",UART1_Recv_BUF,strlen("End")))
        {  
            UartPrintf("Start\n");
            Count = ReadCount();
            UartPrintf("End:%ld\n",Count);
        }

 

//        UartPrintf("\r\n");
        UART1_Recv_count = 0; //缓存清零
        UART1_Overflow_Flag=0;//允许串口继续接收数据
    }
}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭