51单片机串口通讯,接收多字节

2020-01-18 18:50发布

本帖最后由 lanfengxun 于 2012-9-17 11:33 编辑

/*************************串口初始化*******************************************/

void Inituart()
{      
        IE=0x90;                            //打开中断总开关及串口中断开关
        SCON = 0x50;                        //设定串行口工作方式1 允许接受
        TMOD = 0x20;                  //定时器1,自动重载, 产生波特率
//    PCON=0x80;                  // 加上他后波特率是19200  SMOD为1
        TL1 = 0xfa;   
        TH1 = 0xfa;                 //波特率为9600 ,221184MHz
        TR1 = 1;         
}

/**************************接收上位机传送数据***************************************/

void uart_js() interrupt 4    //RI==1时执行串口中断
{        
    uchar  static i ;
        if(RI==1)
        {
                RI=0;
                RX_BUF=  SBUF; //保存数据
                i++;
               
        }
        if(i==10)
        {
            i=0;
            RXend = 1;
                LED0=0;  //LED长亮
        }
    }
void main()
{
    uchar  j;
    Inituart();

    while(1)
   {
       while(RXend==0);  //waiting receive end
       RXend=0;
      for(j=0;j<10;j++)
     {
         TxBuf[j] =  RX_BUF[j];  //将需发送数据存入无线发送缓冲区
   }
  }
}

利用串口助手,从上位机向单片机一次发送十个字节,单片机无法接收到,因为灯没亮。请问哪位知道什么原因,实在调试不出来了,跪求!!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
anta09
1楼-- · 2020-01-19 16:03
lyg407 发表于 2012-9-17 11:24
void uart_rx_isr(void) //接收中断函数
{
        uchar c;       

你好 我正在找这种判断方式 我想问你下 如果我接收到的数据是多位的  尾数的数据还是用来设置用的 请问下 我可以怎么处理呢
lu976046395
2楼-- · 2020-01-19 19:19
mark            
WM_CH
3楼-- · 2020-01-19 21:31
      make
huangmeilifan
4楼-- · 2020-01-20 01:56
 精彩回答 2  元偷偷看……
changshs
5楼-- · 2020-01-20 03:28
本帖最后由 changshs 于 2015-1-7 16:50 编辑

多字节数组可以考虑以帧的格式来发送/接收。
比如定义帧格式如下:
引导码+帧长度+帧长度+重复引导码+数据0+数据1.+。。。。数据n+校验高字节+校验低字节+结束码
设引导码=0xaa
帧长度=len
结束码=0xbb
串口中断接收函数如下:
void UART_interrupt() interrupt 4 using 2
{ unsigned char dat;
  
   if(RI)
   {  dat=SBUF;
      RI=0;
      }
  if(dat==0xaa)//接收到第一个0xaa 帧头
  { Recv_start_flag=1;//开始接收位
     }
  if(dat==0xbb)//接收到帧尾
{  Recv_start_flag=0;//
     dat_buff[Recvcount]=dat;//保存帧尾
     Recvcount=0;
     Recv_end_flag=1;//帧接收结束位 在主程序中用此位判断是否进行数据解析
     }
  if(Recv_start_flag)//开始接收
{  dat_buff[Recvcount]=dat;//保存接收的数据
   Recvcount++;
   if( Recvcount>n)//n数组的长度 防止接收的数据超长
   {  Recvcount=0;
        Recv_start_flag=0;
         }
   if(Recvcount==5)//已经接收了6个数据,判断帧格式是否正常
   {  if((dat_buff[0]!=dat_buff[3])&&(dat_buff[1]!=dat_buff[2]))//帧格式不对
        {   Recvcount=0;//清接收计数器
        Recv_start_flag=0;
            }
        }
      }
  
  }
polang200716
6楼-- · 2020-01-20 05:46
                                                mark!

一周热门 更多>