• 串口通信(3)-接收一组固定长度的数据


     本文为博主 日月同辉,与我共生,csdn原创首发。希望看完后能对你有所帮助,不足之处请指正!一起交流学习,共同进步!

    > 发布人:@日月同辉,与我共生_单片机-CSDN博客

    > 欢迎你为独创博主日月同辉,与我共生点赞❤❤❤+关注👍+收藏🌹+评论☺。

    系列专栏: CSDN-单片机串口通信学习系列🎁

    > 我的格言是:“尽最大努力,做最好的自己!💪

    要转载,请提前告知!!!

    版权声明:本文为CSDN博主「日月同辉,与我共生」的原创文章,CSDN独一份。

    一、系统设计要求

    单片机com1发送字符串Wait for Serial Communication Tset Start.和Please Send a string of data:给虚拟串口com3,接着虚拟串口发送多个数据(数据长度不定,但限制在20以下)给单片机com1,com1接收后重新将数据发送回com3。

    二、软件设计

    2.1串口初始化

    1. void UartInit(void) //9600bps@11.0592MHz
    2. {
    3. PCON &= 0x7F; //波特率不倍速
    4. SCON = 0x50; //8位数据,可变波特率
    5. TMOD &= 0x0F; //设置定时器模式
    6. TMOD |= 0x20; //设置定时器模式
    7. TL1 = 0xFD; //设置定时初始值
    8. TH1 = 0xFD; //设置定时重载值
    9. ET1 = 0; //禁止定时器中断
    10. ES=1; //串口中断打开
    11. TR1 = 1; //定时器1开始计时
    12. }

    2.2接收中断

    1. void ES_timers() interrupt 4 //接收中断
    2. {
    3. if(RI)
    4. {
    5. RI=0;
    6. start_timer=1;//1.开定时器标志位置1
    7. if(recv_cnt//在规定字符长度范围内接收数据
    8. {
    9. recv_buf[recv_cnt]=SBUF; //2.接收数据
    10. recv_cnt++;
    11. }
    12. else
    13. {
    14. recv_cnt=MAX_REX_NUM;
    15. }
    16. recv_timer_cnt=0; //3.每接收一帧数据就计数清0
    17. }
    18. }

    2.3定时器初始化

    1. void Timer0_Init(void) //1毫秒@11.0592MHz
    2. {
    3. TMOD &= 0xF0; //设置定时器模式
    4. TMOD |= 0x01; //设置定时器模式
    5. TL0 = 0x66; //设置定时初始值
    6. TH0 = 0xFC; //设置定时初始值
    7. TF0 = 0; //清除TF0标志
    8. ET0=1;
    9. TR0 = 1; //定时器0开始计时
    10. }

    2.4定时器中断

    1. void T0_timer() interrupt 1
    2. {
    3. TR0=0;
    4. if(start_timer == 1)
    5. {
    6. recv_timer_cnt++;
    7. if(recv_timer_cnt>MAX_timer_cnt) //计数值超过规定范围说明接收完成
    8. {
    9. recv_timer_cnt=0;
    10. recv_cnt=0;
    11. recv_flag=1;//接收完成标志位置1
    12. }
    13. }
    14. TL0 = 0x66; //设置定时初始值
    15. TH0 = 0xFC; //设置定时初始值
    16. TR0=1;
    17. }

    2.5主程序

    1. void main()
    2. {
    3. UartInit(); //调用串口初始化函数
    4. Timer0_Init();
    5. EA=1; //总中断允许
    6. printf("Wait for Serial Communication Tset Start.\r\n");
    7. printf("Please Send a string of data:\r\n");
    8. while(1)
    9. {
    10. if(recv_flag)
    11. {
    12. start_timer=0;
    13. recv_flag=0;//接收完成标志位清0
    14. sendString(recv_buf);//发送数据
    15. clr_recvbuffer(recv_buf);//清除缓冲函数
    16. }
    17. }
    18. }

    2.6发送数据

    1. void sendByte(unsigned char dat) //发送一帧数据功能函数
    2. {
    3. SBUF=dat;
    4. while(!TI);
    5. TI=0;
    6. }
    7. void sendString(unsigned char *dat)//发送字符串函数
    8. {
    9. while(*dat != '\0')
    10. {
    11. sendByte(*dat++);
    12. }
    13. }
    14. char putchar(char c)
    15. {
    16. sendByte(c);
    17. return c;
    18. }

    2.7清除缓存

    1. void clr_recvbuffer(unsigned char *buf)
    2. {
    3. unsigned char i;
    4. for(i=0;i
    5. {
    6. buf[i]=0;
    7. }
    8. }

    2.8urat.c

    1. #ifndef __UART_H__
    2. #define __UART_H__
    3. #include
    4. #include
    5. #define MAX_REX_NUM 20 //规定最大长度
    6. #define MAX_timer_cnt 5 //定时计数规定值,超过该值,说明接收完成
    7. extern unsigned char recv_buf[MAX_REX_NUM];//将数据存储到该数组中
    8. extern unsigned char recv_cnt;
    9. extern unsigned char start_timer;//软件定时器变量,=1说明定时器开始工作
    10. extern unsigned char recv_timer_cnt;//软件定时器计数变量
    11. extern unsigned char recv_flag;//接收完成标志位
    12. void UartInit(void);
    13. void sendByte(unsigned char dat);
    14. void sendString(unsigned char *dat);
    15. char putchar(char c);
    16. void clr_recvbuffer(unsigned char *buf);
    17. #endif

    亲爱的读者敬请期待,下一文更精彩!!!

    一日不读书,胸臆无佳想。我叫不白吃,喜欢我的,可以支持我,博主名叫@日月同辉,与我共生

    @日月同辉,与我共生_单片机基础,单片机串口通信-CSDN博客@日月同辉,与我共生擅长单片机基础,单片机串口通信,等方面的知识,@日月同辉,与我共生关注stm32,c语言,51单片机,proteus,单片机领域.https://blog.csdn.net/LIN___IT?spm=1000.2115.3001.5343

  • 相关阅读:
    ArduPilot开源飞控之AP_Camera
    初识Rasp——Openrasp代码分析
    [MRCTF2020]PixelShooter
    openEuler yum 安装 LNMP 环境
    算法训练---Day3
    dolphinscheduler
    航空航天与国防行业乘客体验—了解如何交付个性化并实现盈利 | 达索系统百世慧®
    Friedman检验和Nemenyi检验画图代码
    手把手教你使用Git管理你的软件代码
    274. H 指数
  • 原文地址:https://blog.csdn.net/LIN___IT/article/details/134256560