1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
没事做,帮你写一个。
#include #include uchar data rbyte[23]; uchar data bitcount=0; uchar data bs=23; bit bdata SR_Flag=0; bit bdata ReceiveCompleteFlag=0; uchar data Result=0; void UART_SER(void) interrupt 4 { EA=0; if(RI){ if((SBUF==0x02)||(SR_Flag==0)) { SR_Flag=1; rbyte[bitcount]=SBUF; bitcount++; RI=0; EA=1; return; } if(SR_Flag) { rbyte[bitcount]=SBUF; bitcount++; } if(bitcount>=bs) { ReceiveCompleteFlag=1; SR_Flag=0; } RI=0; } if(TI)TI=0; EA=1; } void Init_Config(void){ SCON=0x50; T2CON=0x30; //ÅäÖÃT2Ϊ²¨ÌØÂÊ·¢ÉúÆ÷ TH2=0xFF; //9600 11.0592Mhz TL2=0xDC; RCAP2H=0xFF; RCAP2L=0xDC; EA=1; ES=1; TR2=1; } void main(void) { Init_Config(); while(1) { if(ReceiveCompleteFlag) { ReceiveCompleteFlag=0; if(rbyte[bs-1]==3) { Result=rbyte[5]; //½ÓÊյĽá¹ûÊý¾Ý //´¦Àí´úÂë memset(rbyte,0,bs); }else{ memset(rbyte,0,bs); } } |
|
|
|
#include
#include uchar data rbyte[23]; //数了一下是23个字节, uchar data bitcount=0; uchar data bs=23; bit bdata SR_Flag=0; bit bdata ReceiveCompleteFlag=0; uchar data Result=0; void UART_SER(void) interrupt 4 { EA=0; if(RI){ if((SBUF==0x02)||(SR_Flag==0)) { SR_Flag=1; rbyte[bitcount]=SBUF; bitcount++; RI=0; EA=1; return; } if(SR_Flag) { rbyte[bitcount]=SBUF; bitcount++; } if(bitcount>=bs) { ReceiveCompleteFlag=1; SR_Flag=0; } RI=0; } if(TI)TI=0; EA=1; } void Init_Config(void){ SCON=0x50; T2CON=0x30; //ÅäÖÃT2Ϊ²¨ÌØÂÊ·¢ÉúÆ÷ TH2=0xFF; //9600 11.0592Mhz TL2=0xDC; RCAP2H=0xFF; RCAP2L=0xDC; EA=1; ES=1; TR2=1; } void main(void) { Init_Config(); while(1) { if(ReceiveCompleteFlag) { ReceiveCompleteFlag=0; if(rbyte[bs-1]==3) { Result=rbyte[5]; //½ÓÊյĽá¹ûÊý¾Ý //´¦Àí´úÂë memset(rbyte,0,bs); }else{ memset(rbyte,0,bs); } } |
|
1 条评论
|
|
这是一个完整的数据包,所以应该是先接收下整个完整的包,放到一个缓存区里,然后根据要取得数据在数据包里得位置读取就可以了,这样,可以读取数据包里的任何一个字节
|
|
|
|
我编写的主程序中LED无法点亮,硬件电路核查过没问题,void Data_anlysize()函数也没问题,Data_ok能收到,不清楚问题在哪?
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器 #define uint unsigned int //对数据类型进行声明定义 #define uchar unsigned char uchar Data_buf[22]; //串口接收数据缓存数组 uint Data_recieve[22]; //串口接收到完整帧 uint flag; //串口接收结束标志 uint Data_ok; //有效数据提取标志 ***it ticket=P1^0; //将单片机的P1.0端口定义为乘客购票检测 ***it voice=P1^4; //将单片机的P1.4端口定义为语音提示开关 ***it led=P0^0; //将单片机的P0.0端口定义bug检测 void UsartInit(); //串口初始化 void Data_anlysize(); //数据分析 /******************************************************************************* * 函 数 名 : main * 函数功能 : 主函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void main() { UsartInit(); //串口初始化 while(1) { voice=0; Data_anlysize(); //数据分析 if(Data_ok==1&&ticket==0) //判断乘客有购票行为 { voice=1; //开语音提示 led=0; } } } /******************************************************************************* * 函数名 : Usart() interrupt 4 * 函数功能 : 串口通信中断函数 * 输入 : 无 * 输出 : 无 *******************************************************************************/ void Usart() interrupt 4 { static uchar count=0; //静态计数变量 RI=0; //接收中断请求标志位清0 Data_buf[count]=SBUF; //接收到的数据串保存在缓存数组 if(Data_buf[0]==0x02) //验证数据头(起始位) { count++; if(count>=23) { flag=1; //接收完成标志置1 count=0; //计数变量清0 } } } /******************************************************************************* * 函数名 :UsartInit() * 函数功能 :串口初始化 * 输入 : 无 * 输出 : 无 *******************************************************************************/ void UsartInit() { SCON=0X50; //设置为串口工作方式1(SM0=0,SM0=1),允许接收 (REN=1) T2CON=0X34; //设置T2为波特率发生器工作方式(TCLK=1,RCLK=1,TR2=1),T2为定时器(C_T2=0 ) //T2MOD=0X00; //设置T2为加法计数DCEN=0,时钟输出不使能T2OE=0 TH2=0XFF; TL2=0XFD; RCAP2H=0XFF; RCAP2L=0XFD; //计数器T2初始值设置,波特率115200 EA=1; //打开总中断 ES=1; //设置中断允许控制寄存器IE,允许串行中断 } /******************************************************************************* * 函数名 :Data_anlysis() * 函数功能 :串口协议分析 * 输入 : 无 * 输出 : 无 * 备注 : 帧结构 02 //帧头 14 //数据长度: 长度=命令+参数+效验 30 57 00 //命令 64 00 //找零箱内硬币数 00 00 00 00 00 00 00 00 00 00 00 00 00 00 17 //XOR :XOR=长度xor命令xor参数 03 //帧尾 *******************************************************************************/ void Data_anlysize() { uchar i,j; //临时变量 if(flag==1) //23位数据串接收完成 { ES=0; //关串口中断 flag=0; //接收完成标志清0 j=Data_buf[2]^Data_buf[3]^Data_buf[4]^Data_buf[5]^Data_buf[6]^Data_buf[7]^Data_buf[8]^Data_buf[9]^Data_buf[10]^Data_buf[11]^Data_buf[12]^Data_buf[13]^Data_buf[14]^Data_buf[15]^Data_buf[16]^Data_buf[17]^Data_buf[18]^Data_buf[19]^Data_buf[20];//XOR校验 if(Data_buf[21]==j) //校验通过 { for(i=0;i<=22;i++) Data_recieve[i]=Data_buf[i];//接收完整帧 if(Data_recieve[5]==0x64) Data_ok=1; } ES=1; //开串口中断 } } |
|
|
|
先找02,收到后等03,然后截取出来整帧数据
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 22:56 , Processed in 0.679112 second(s), Total 85, Slave 69 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号