完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
51单片机如何接收从电脑发来的多位数据,就是实现我收到的第一位是a,然后接下来5位我要存在一个数组,加上这个判断过程怎么写,求大神指导,困扰了好几天了。串口也是rs232
|
|
相关推荐
6个回答
|
|
连续发送即可
最佳答案
|
|
|
|
求大神给个思路啊
|
|
|
|
给你一个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 } } } |
|
|
|
首先初始化串口,然后写个串口中断接收函数;在中断函数中判断接收的字符是不是a,如果是后面接收的依次往数组里存
|
|
|
|
首先初始化串口,然后写个串口中断接收函数;在中断函数中判断接收的字符是不是a,如果是后面接收的依次往数组里存
|
|
|
|
收藏了收藏了收藏了收藏了
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
205 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1253 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
848 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
853 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1073 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12013 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 02:10 , Processed in 0.580816 second(s), Total 54, Slave 46 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号