python上位机串口发送数据给51单片机_请问单片机串口如何接收上位机不断发送的数据帧并将该帧的有效数据提取出来?...

news/2024/7/4 13:42:21

2018-8-29 11:16

我编写的主程序中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;                             //有效数据提取标志  sbit ticket=P1^0;                            //将单片机的P1.0端口定义为乘客购票检测 sbit voice=P1^4;                            //将单片机的P1.4端口定义为语音提示开关 sbit 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=Data_buf;//接收完整帧                            if(Data_recieve[5]==0x64)                                Data_ok=1;             }             ES=1;                //开串口中断           } }


http://www.niftyadmin.cn/n/1999049.html

相关文章

java 生成序列化id_IDEA自动生成序列化ID

idea是十分智能的Java集成开发环境而我们在用实体类继承 java.io.Serializable后&#xff0c;需要设置序列化ID。java的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的。在进行反序列化时&#xff0c;JVM会把传来的字节流中的serialVersionUID与本地实体…

在 Visual C++ 中使用内联汇编

在 Visual C 中使用内联汇编 一、 优点 使用内联汇编可以在 C/C 代码中嵌入汇编语言指令&#xff0c;而且不需要额外的汇编和连接步骤。在 Visual C 中&#xff0c;内联汇编是内置的编译器&#xff0c;因此不需要配置诸如 MASM 一类的独立汇编工具。这里&#xff0c;我们就以…

关于ST-Link的internal command error问题的解决方法

调试stm32的停止模式的时候老遇到这个问题&#xff0c;据说是芯片进入休眠自锁状态 解决办法&#xff1a; 按住开发板的复位按钮不放开&#xff0c;然后再进行烧写程序&#xff0c;即按Downing或Debug&#xff0c;过大约0.5到1秒后松开复位按钮即可成功烧写。 效果&#xff1a;…

载波聚合或双连接的方式进行_工厂企业适合用电力载波抄表方案吗

电力载波远程抄表方案广泛用于工厂企业&#xff0c;他是通过电力线直接传输数据的&#xff0c;所以现场施工无需布线&#xff0c;所以比较节省施工成本&#xff0c;适用于变压器台区不多&#xff0c;电表分散安装的场合&#xff0c;比如工厂、别墅、园区等。有些工厂车间安装电…

java类序列化_Java序列化与反序列化学习序列化类实现Serializable接口

一.序列化类实现Serializable接口Serializable接口没有方法&#xff0c;更像是个标记。有了这个标记的Class就能被序列化机制处理。ObjectOutputStream只能对Serializable接口的类的对象进行序列化。默认情况下&#xff0c;ObjectOutputStream按照默认方式序列化&#xff0c;这…

Python工程师面试必备25条Python知识点

1.到底什么是Python&#xff1f;你可以在回答中与其他技术进行对比 下面是一些关键点&#xff1a;Python是一种解释型语言。这就是说&#xff0c;与C语言和C的衍生语言不同&#xff0c;Python代码在运行之前不需要编译。其他解释型语言还包括PHP和Ruby。Python是动态类型语言&a…

为MFC应用程序添加全屏幕显示功能

为MFC应用程序添加全屏幕显示功能 在CMainFrame类中添加下列成员变量和成员函数(使用ClassWizard)&#xff0c;下面是这些变量和函数的功能说明&#xff1a; 成员变量&#xff1a;BOOL m_bFullScreen; //全屏幕显示标志CRect m_FullScreenWindowRect; //全屏幕显示窗口RectWIN…

游戏封包模拟器_再来!月神带你挖游戏的内存漏洞

_投稿&#xff1a;月神配图&#xff1a;M_____先不讲wpe的思路&#xff0c;因为游戏种类繁杂&#xff0c;每个游戏的功能不同&#xff0c;测试方式也不一样。后面再讲&#xff0c;今天要讲的是CE&#xff0c;一款内存修改器。相信很多人都使用过&#xff0c;类似于金山游侠。通…