2 botao258 botao258 于 2015.07.16 13:26 提问

C51串口中断接收多字节数据,并解析数据,问题是不能解析,哪错了?

#include

#include
#include
#define uchar unsigned char
#define uint unsigned int

uchar code SZDLJ[13]={0x41,0x54,0x2B,0x43,0x49,0x50,0x4D,0x55,0x58,0x3D,0x31,0x0D,0x0A};//AT+CIPMUX=1
uchar code KQFU[21]={0x41,0x54,0x2B,0x43,0x49,0x50,0x53,0x45,0x52,0x56,0x45,0x52,0x3D,0x31,0x2C,0x38,0x30,0x38,0x30,0x0D,0x0A};//AT+CIPSERVER=1,8080

uint URTAReceivedCount=0,n=1; //用于串口中断子函数中计数
uchar data Tempdatatable[5],CommandDatatable[5]; //定义临时数组和用于调用控制动作的数组

/*****************************************************
函数功能:延时若1ms
*******************************************************/
void Delay_1ms(uint i)
{
uint x,j;
for(j=0;j<i;j++)
for(x=0;x<=148;x++);
}

/*****************************************************
函数:往串口发送数据
功能:只用于设定wifi模块
***************************************************/
void SendData(uchar *sdata,int num)
{
int i;
for(i=0;i<num;i++)
{
SBUF=sdata[i];
Delay_1ms(2);
}
}

/********************************************************************

  • 函数 :Moto_Forward()
  • 功能 :前进 ***********************************************************************/ void Moto_Forward() {
    P1= 0x0a; Delay_1ms(100); } /********************************************************************
  • 函数 :Moto_Backward()
  • 功能 :后退 ***********************************************************************/ void Moto_Backward() { P1= 0x05; Delay_1ms(100); }

/********************************************************************

  • 函数 :Moto_TurnLeft()
  • 功能 :左转 ***********************************************************************/ void Moto_TurnLeft() { P1= 0x09; Delay_1ms(100); } /********************************************************************
  • 函数 :Moto_TurnRight()
  • 功能 :右转 ***********************************************************************/ void Moto_TurnRight() { P1= 0x06; Delay_1ms(100); } /********************************************************************
  • 函数 :Moto_Stop()
  • 功能 :停止 ***********************************************************************/ void Moto_Stop() { P1= 0x00; Delay_1ms(100); }

/****************************************************************************
函数:主函数
功能:初始化串口,并从串口发送指令到wifi模块用于设置模块,再使能中断,
再进入while循环,解析从串口收到的数据
*****************************************************************************/
void main(void)
{

Delay_1ms(3000);

TMOD=0x21;  //TMOD=0010 0001B,定时器T1工作于方式2 

SCON=0x50; //SCON=0101 0000B,串口工作方式1 1起始位8数据位1停止位
PCON=0x00; //PCON=0000 0000B,波特率9600 晶振11.0592
TH1=0xFd; //根据规定给定时器T1赋初值
TL1=0xFd; //根据规定给定时器T1赋初值
TR1=1; //启动定时器T1

SendData(SZDLJ,13);  //设置多连
Delay_1ms(3000);

SendData(KQFU,21);   //开启server端
Delay_1ms(8000);

ES = 1;     //串口中断使能

EA = 1; //开总中断

while(1)  //一直循环直到中断产生,跳进中断执行中断子函数,完后再回到循环并解析数据,等待下次中断到来
    {
        if(CommandDatatable[0]==0xFF&&CommandDatatable[4]==0XFF)
        {
            switch(CommandDatatable[1])
            {
                case 0x00:
                    switch(CommandDatatable[2])
                    {
                            case 0X00:Moto_Stop();break;
            case 0X01:Moto_Forward();break;
            case 0X02:Moto_Backward();break;
            case 0X03:Moto_TurnLeft();break;
            case 0X04:Moto_TurnRight();break; 
                          default :  break;
          }
                default: break;
    }
  }
}

}

/*****************************************************************************
函数:串口中断子函数
功能:接收串口数据,组包成类 “0XFF 0X00 0X01 0X02 0XFF” 的数组,用于主函数解析,包头和包尾都是0XFF,的5元数组
******************************************************************************/
void Com_Int(void) interrupt 4
{
uchar temp;
ES=0;
RI=0;
temp=SBUF;
if(temp==0XFF && URTAReceivedCount<3)
{
Tempdatatable[0]==0XFF;
URTAReceivedCount++;
}
else
{
Tempdatatable[n]=temp;
n++;
if(URTAReceivedCount==0&&n==2)
n=1;
}

if(URTAReceivedCount==2)
{
Tempdatatable[0]=0XFF;
Tempdatatable[4]=0XFF;
n=1;
URTAReceivedCount=0;

temp="";
}
CommandDatatable[0]=Tempdatatable[0];
CommandDatatable[1]=Tempdatatable[1];
CommandDatatable[2]=Tempdatatable[2];
CommandDatatable[3]=Tempdatatable[3];
CommandDatatable[4]=Tempdatatable[4];

ES=1;
}

串口助手给MCU发16进制类似“FF 00 01 02 FF”数时,不能正确解析

1个回答

leizhang250
leizhang250   2015.07.17 08:27

void Com_Int(void) interrupt 4
{
uchar temp;
ES=0;
RI=0;
temp=SBUF;
if(temp==0XFF && URTAReceivedCount<3)
{
_Tempdatatable[0]==0XFF; 此行代码的“==肯定是不对的应该为"="

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C51:串口接收和发送,查询与中断方法
http://bbs.ednchina.com/BLOG_ARTICLE_1828402.HTM 假设要发送一组数据   Send[10] 一般采用查询发送(循环发送)方式: unsigned char Send[10];                  //发送量 unsigned char i;                               //循环量
单片机串口接收多字节数据
http://bbs.elecfans.com/jishu_409918_1_1.html 各位大侠看一下,我下面的程序为什么不能接收两个字节的数据呢? #include #define uchar unsigned char #define uint unsigned int void rs232_init(); uchar flag,i,g,d; uchar code table
keil c 单片机串口通信多字节收发
串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universal Serial Bus或者USB混淆)。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS- 232口。同时,串口通信协议也可以用于获取远程采集设备的数据。 串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。 典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通行的端口,这些参数必须匹配: a,波特率:这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为 14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是 GPIB设备的通信。 b,数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语 “包”指任何通信的情况。 c,停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。 d,奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位位1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。
一个相当经典的AVR中断程序
一个不错的avr的串口通讯代码,收藏于此,以备后用。在此谢谢原创者。 [code]/*************************************************************************************************** 文 件 名 : Comm.H* 说    明 : *            1> 这一版本中最大的接收和
单片机通信之接收一个完整数据包
本文以CC2541普通编程为例,介绍如何在CC2541中通讯接收到有效数据。
关于串口接收并解析数据
转载连接: http://www.debugease.com/csharp/4103853.htmlprivate List&amp;lt;byte&amp;gt; RevBuffer = new List&amp;lt;byte&amp;gt;();private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEve...
51单片机串口通信的帧数据接收
首先定义一个数据帧格式,Header :{ 0xAA 0x55} type:{ 0x01 | 0x02 | 0x03 } length:{  N } body :{____n个字节的数据___ } 数据的格式就是上面的定义  Header 为帧头 标记一个数据帧的开始,type 为类型 用来识别数据的类型 ,Length为长度标记 用来识别是否收完一帧的数据; 这次的目的是为了获取来自PC端串
C51 单片机 串口通讯总结——查询方式与中断方式
查询方式:发送数据——先发后查; 接收数据——先查后收。 中断方式:发送数据——发送、等待中断、中断中发送; 接收数据——等待中断、在中断中接收。 下面让我们通过两个列子进一步看一下两者的区别: /******************查询方式实现的串口通讯*************************/ #include #define uint unsigned int #d
C51 队列 方式 中断接收 查询发送
Keil C51没有 《stdbool.h》头文件,自己做一个 stdbool.h #ifndef __STDBOOL_H__ #define __STDBOOL_H__ typedef enum{ false = 0, true = 1, }bool; #endif 最简单的数组模拟循环队列 Queue.h #ifndef
串口多字节发送与接收
串口多字节发送与接收,实现串口与单片机数据交换