单片机/MCUwilliam hill官网
直播中

dpjff

6年用户 4经验值
私信 关注
[问答]

关于51单片机如何接收多位数据的问题

51单片机如何接收从电脑发来的多位数据,就是实现我收到的第一位是a,然后接下来5位我要存在一个数组,加上这个判断过程怎么写,求大神指导,困扰了好几天了。串口也是rs232

回帖(6)

lee_st

2018-4-16 09:42:56

最佳答案

连续发送即可
举报

dpjff

2018-4-16 10:00:45
求大神给个思路啊
举报

武林

2018-4-16 10:55:22
给你一个C51串口接气体浓度传感器的演示程序,有详细注释,看明白就会写了。
//按默认主动上传方式的程序
//起始位  气体名称  单位  小数位数  浓度高8位  浓度低8位  满量程高位  满量程低位  校验值
// 0xFF    0x17     0x04   0x00      0x00        0x25       0x13        0x88       0x25
//校验值=(取反(字节1+字节2......+字节7))+1
#include
#define uint unsigned int
#define uchar unsigned char
***it dula=P2^6;                        //段选
***it wela=P2^7;                        //位选
uchar code table[]={                //共阴数码管0~F数组
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71};
uchar code table_1[]={0x7e,0x7d,0x7b,0x77,0xef,0xdf};
uchar table0[] ="OK ";        //用于串口助手返回验证
uchar table1[]="ERROR ";//用于串口助手返回验证
uchar rec_buf[9];                        //缓存
uchar dis_buf[6];                        //缓存
uint V_data;                                //收到的16位有效数据变量
bit flag=0;                                        //接收完成标
/*************初始化串口**************/
void InitUART()                //9600bps@11.0592MHz
{
        PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位数据,可变波特率
        TMOD|= 0x20;                //设定定时器1为8位自动重装方式
        TL1 = 0xFD;                        //设定定时初值
        TH1 = 0xFD;                        //设定定时器重装值
        TR1 = 1;                        //启动定时器1
        ET1 = 0;                        //禁止定时器1中断
        EA = 1;                                //开总中断
        ES = 1;                                //开串口中断
}

/**********串口发送函数*************/
void SendOneByte(uchar c)
{
    SBUF = c;                //发送数据
    while(!TI);        //等待发送完成
    TI = 0;                        //发送中断请求标志位清0
}
/*********校验和计算***********/
uchar FucCheckSum(uchar *i,uchar ln)
{
        uchar j,tempq=0;
        i+=1;
        for(j=0;j<(ln-2);j++)
        {
                tempq+=*i;
                i++;
        }
        tempq=(~tempq)+1;
        return(tempq);
}
/************数据解析程序*************/
void analysis()
{
        uchar i,j;                //临时变量
        if(flag==1)                //如果9位数据串接收完成
        {
                ES=0;                        //关串口中断
                flag=0;                //接收完成标志清0
                j=FucCheckSum(rec_buf,9);//校验和计算
                if(rec_buf[8]==j)//验证数据校验和
                {
                        V_data=(rec_buf[4]<<8)|rec_buf[5];//恢复16位有效数据(浓度值)
                        for(i=0;i<3;i++)
                        SendOneByte(table0[i]);//返回OK
                }
                else for(i=0;i<6;i++)
                        SendOneByte(table1[i]);//返回ERROR
                ES=1;                //开串口中断
        }
}
/*************数据分解***************/
void Transformation()
{
        dis_buf[0] = V_data/100000;                        // 十万位
        dis_buf[1] = V_data%100000/10000;        // 万位
        dis_buf[2] = V_data%10000/1000;                // 千位
        dis_buf[3] = V_data%1000/100;                // 百位
        dis_buf[4] = V_data%100/10;                        // 十位
        dis_buf[5] = V_data%10;                                // 个位
}
/**********6位数码管动态显示程序**********/
void display()
{
        static uchar i=0;                                //静态变量
        P0=0x00;                                                        //消隐
        dula=1;
        dula=0;
        P0=table_1[i];                                                //显示位码
        wela=1;
        wela=0;
//        if(i==3)                                                //如果显示第4位
//                P0=table[dis_buf[i]]|0x80;  //显示段码+点
//        else P0=table[dis_buf[i]];                //显示段码不+点
        P0=table[dis_buf[i]];
        dula=1;
        dula=0;
        i++;
        if(i>=6)
                i=0;
}
/**************主程序**************/
void main()
{
        InitUART();                //初始化串口
        while(1)
        {
                analysis();        //数据解析
                Transformation();//数据分解
                display();        //数码管显示
        }
}
/*********串口中断服务程序**********/
void UARTInterrupt() interrupt 4
{
        static uchar num=0;        //静态计数变量
        RI=0;                                                //接收中断请求标志位清0
        rec_buf[num]=SBUF;        //接收到的数据串保存在缓存数组
        if(rec_buf[0]==0xFF)        //验证数据头(起始位)
        {
                num++;
                if(num>=9)
                {
                        flag=1;                        //接收完成标志置1
                        num=0;                        //计数变量清0
                }
        }
}
举报

勇哥-lzu

2018-4-16 16:06:52
首先初始化串口,然后写个串口中断接收函数;在中断函数中判断接收的字符是不是a,如果是后面接收的依次往数组里存
举报

勇哥-lzu

2018-4-16 16:07:05
首先初始化串口,然后写个串口中断接收函数;在中断函数中判断接收的字符是不是a,如果是后面接收的依次往数组里存
举报

SXXYC

2018-4-22 17:15:12
收藏了收藏了收藏了收藏了
举报

更多回帖

发帖
×
20
完善资料,
赚取积分