首页 > 其他分享 >51单片机串口接收发送字符串

51单片机串口接收发送字符串

时间:2024-03-21 17:33:38浏览次数:26  
标签:字节 receive 51 checkinput 单片机 数组 串口 数据

在使用51单片机开发时,规定相关协议要单片机要通过串口接收一系列数据(以C8051F410单片机为例)。

        串口的SBUF寄存器触发中断一次只能接收一个字节的数据,所以使用数组进行存储的时候不能一次将所有数据进行存储。

        假设通信协议协议:数据包第一字节为A5,第二位为上报数据状态组成的字节,第三字节为5A,第四字节为前三字节之和的低字节。

数据的接收

        以数据为A5 01 5A 00为例。定义一个receive[3]数组,当我们以循环为数组赋值时

        for(i=0;i<4;i++)

{       

        receive[i]=SBUF0; 

}

这时数组所存储的全部是最后输入00字节。这是因为每一次SBUF只能存储一个字节的数据,所以每次更新只是将字节进行了覆盖,然后进行了循环存储。

        下面我会用数组移位的方式进行对数据包的存储

if(RI0==1)//标志位为1进入中断
    {
        RI0=0;//先清零标志位
        for(i=0;i<3;i++)
        {
            receive[i]=receive[i+1];//每接收一次数据对数组进行一轮次前移
        }
        receive[3]=SBUF0;//用数组最后一位对数据进行存储

        当进入中断四次后,数组将会存储接收的四个字节数据。

数据的发送

        在接收到数据后,我们需要对数据进行判断,是否符合数据的协议 。

void check (unsigned char  *checkinput)
{
    if((checkinput[0] == 0xA5) && (checkinput[2] == 0x5A))
        {
            sum=checkinput[0]+checkinput[1]+checkinput[2];
            if(sum==checkinput[3])
                {
                     flag=1;        //符合判断,flag标志为1,进行输出                
                }
            else
                {
                    flag=0;
                }
        
        }
}

        判断部分程序较为简单,有不懂的可以私聊博主。需要注意的是,这一部分最好写成函数单独进行调用,不要全部写在中断函数中。

        当flag为1时,证明我们收到的数据是符合协议的,现在我们需要对数据进行发送。

if(flag==1)
    {        
                flag=0;
                count=0;
                SBUF0=receive[0];
    }

        我们现在先在主函数中进行第一次发送,输出接收数组的第一位,以达到触发单片机中断函数的目的。然后进入中断函数进行后面数据的发送。

  if(TI0==1)//第一次发送触发中断,标志位为1
    {
                TI0=0;
                count++;//初值为0,进入直接加1,发送数组第二位
                if(count<=4)
                {
                    SBUF0=receive[count];
                }
                
    }

        中断函数运行结束,数组发送成功。

        以上就是以C8051F410为例的串口接收发送协议字符串的程序,对于单片机的init和串口的init本文就不在赘述,如果有不懂的可以私聊博主,在博主力所能及的范围内将会进行解答。

        博主的输出方式也有很多不足。博主的程序中,在中断函数里,会进行频繁地循环语句,这是会大大浪费时间的,大家应该了解到,在MCU编程中循环程序是用来进行延时delay的,所以每次的循环将会占用大量的时间,而且所占用的时间随着需要接受数据的长度进行递增,更是会增加时间的浪费。

        希望博主的文章能够帮助到大家,如果各位大神还有更好的方法希望大家能多多评论分享。

        感谢各位大神的阅读、点赞、收藏、评论。

标签:字节,receive,51,checkinput,单片机,数组,串口,数据
From: https://blog.csdn.net/weixin_48671285/article/details/136912188

相关文章

  • DSP,STM32,ARM,51单片机,FPGA相关解释
    搞嵌入式,物联网相关的朋友们可能将这些硬件的一些技术栈混淆,本文将大致对此进行梳理:对比ARM与其他架构ARM架构的优势在于它的高能效比,这使得它非常适合于移动设备和嵌入式系统。与之相比,例如x86架构更常见于个人电脑和服务器中,它们通常追求更高的性能,能耗问题不是首要考虑。......
  • vue2扫码枪串口模式的使用
    1.下载依赖包  serialportnpmiserialport2.创建文件code-gun.jsvar{SerialPort}=require("serialport");//串口列表SerialPort.list().then((ports)=>{ports.forEach((port)=>{console.log(port);});}).catch((err)=&......
  • 单片机干货-IIC上拉电阻有什么用?
    简短不看版:1.I2C要加上拉电阻,阻值一般为3-10K(通常选4.7k)2. 不仅要加上拉电阻,并且同时SCL,SDA要配置成开漏输出模式。3.目的一方面是为了防止出现如图所示的短路问题,另外一方面是为了总线仲裁(看谁能往总线写数据)另一方面是因为I2C是一种多主机协议,而SDA只有一根线,因此传......
  • STM32发送串口数据丢失字节的解决办法
    发送数据函数voidUsart3_Send_Array(u8*buf,u8len){u8t;GPIO_WriteBit(GPIOB,RS485AB_EN_PIN,1);for(t=0;t<len;t++) //循环发送数据{while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);USART_SendData(USART3,......
  • 【力扣刷题日记】512.游戏玩法分析II
    前言练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。今日题目:512.游戏玩法分析II表:Activity列名类型player_idintdevice_idintevent_datedategames_playedint(player_id,event_date)是这个表的两个主键(具有唯一值的列......
  • 技术支持Tektronix泰克DPO5104B数字示波器1GHz
    泰克DPO5104B数字示波器Bandwidth:1GHz4频道纪录长度:125米SampleRate:10/5GS/s(2/4ch)最多250兆跳记录长度,多视图变焦器。最大波形捕获率带310000帧的快速帧分段内存采集模式每秒捕获率标准的无源电压探针,其电容性小于4pp装载和500兆赫或1千兆赫模拟带宽......
  • 洛谷题单指南-集合-P1551 亲戚
    原题链接:https://www.luogu.com.cn/problem/P1551题意解读:要判断两人是否是亲戚,只需要看两人是否属于一个集合,基于所有已知的亲戚关系,可以建立多个有亲戚关系的集合,这个过程可以借助并查集。解题思路:并查集:1、定义并查集是一种树形数据结构,本质上是多棵树,每棵树表示一个集合,......
  • 51nod2599 最近公共祖先LCA
    给定一颗n个节点的树,根节点编号为1,有Q组询问,每次给定一对节点编号(x,y),求(x,y)的最近公共祖先。求LCA有多种方法,这里给的是倍增法,预处理时间O(nlogn),单次查询时间O(logn),支持在线。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#definerep(i,a,b)for......
  • 51nod1174 区间中最大的数RMQ
    给出一个有n个数的序列,下标0~n-1,有Q次查询,每次询问区间[l,r]的最大值。如果有修改,可以考虑线段树,这里只有静态查询,可以用ST表,预处理时间O(nlogn),单次查询时间O(1)。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#definerep(i,a,b)for(inti=a;i<=b;i......
  • 蓝桥杯单片机小蜜蜂学习笔记——矩阵键盘
    笔记仅供学习参考学习视频链接【基础技能07】矩阵键盘的扫描原理与基本应用基本原理(图片来自欧老师的视频)讲一下基本原理吧图片的左半部分是矩阵键盘的布局R1R2R3R4C1C2C3C4都是IO端口(就是电平高低可以人为控制)图片右半部分上面是独立按键下面是矩阵键盘两者的区......