微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于串口的疑问

关于串口的疑问

时间:10-02 整理:3721RD 点击:

    小弟在用串口时遇到问题,请各位指教。通过助手发一串数据,比如{6,1,2,3,4,5,7},其中第一个字节是所需数据的个数,后面部分是所需数据本身。像例子就是我要发6个数据,最终在串口助手上显示{1,2,3,4,5,7}这样的效果。
   可我在助手发送4帧{6,1,2,3,4,5,7}后,显示如图
  现附上代码,烦请各位指正下,多谢了
   #include <reg52.h>
#define uchar unsigned char
#define uint  unsigned int
#define cnt_send_ceiling    50      //确保接收缓冲区没有继续接受数据,是变量send_cnt的溢出阀值
uchar RxUART_buf[40];               //串口接收缓冲区,可以根据实际项目设置大小
uchar UART_buf_temp[40];            //临时处理串口数据的缓冲区,可以不用那么大
uchar send_update;                  //数据发送更新标志
uchar cnt_RxNum = 0;                //串口接收字节个数计数
uchar send_cnt;
//串口初始化
void UART_Init()
{
    SM1  = 1;               //工作方式1
    SM0  = 0;
   
    PCON = 0x00;            //MSB:SMOD =0单倍速率 =1加倍数率
    TMOD = 0x20;            //定时器1工作方式2.
    TH1  = 0xFD;            //9600bps
    TL1  = 0xFD;
    TR1  = 1;               //定时器T1开始工作,TR1=0,T1停止工作
    REN  = 1;            //允许接收
    ES   = 1;               //开串口中断
    EA   = 1;               //开总中断
}
//延时
void delay_ms(uint ms_num)
{
    uint i;
    uchar j;
    for(i = 0;i < ms_num;i ++)
        for(j = 0;j < 110;j ++)
         ;
}
//发送
void UART_Dispatch( uchar *pdat )   
{   
    SBUF = *pdat;         //装载待传送数据
              
    while( !TI );         //等待串口传送结束(TI =0)
    TI = 0;               //将串口中断标志位置0
    //delay_ms(3);
   
}
void UART_Dis(uchar dat)
{
    SBUF = dat;
    while(!TI);
    TI = 0;
}
void main()
{   uchar i = 0,j,k;
    uchar data_size;
    uchar send_lock;       //
    delay_ms(500);
    UART_Init();
    while(1)
    {
        if(send_update)
     {
      
                send_cnt ++;                 //send_cnt累加,因为有数据更新,它在串口中断里就被置0,永远饿着;直到发送完,才跳到这里喂饱,此时说明更新完毕
     
            if((send_cnt >= 50)&&(RI == 0) )    //判断是否已经发送完毕了,同时又可延时一段时间,确认缓冲区没有继续接受数据
         {
   
                send_cnt = 0;
                send_update = 0;
                send_lock = 1;         //开自锁标志,用于发送完毕后,数据处理
      }
      
     
     }
        //串口传输已完毕,接下来进行数据的处理
        ///*
        else
     {
      
            if(send_lock && (cnt_RxNum>0))
      {
                send_lock = 0;
                cnt_RxNum = 0;
                data_size = RxUART_buf[0];//第一个数据为所发送所需数据的个数
     
                for(j = 1;j <= data_size;j ++)
          {
                    UART_buf_temp[j - 1] = RxUART_buf[j];
                    UART_Dispatch( &UART_buf_temp[j - 1] ); //显示   
          }
   
                send_update = 1;
      
      }
     
        }   
    }
}
//中断处理
void RxByte() interrupt 4 //using 3
{   
    if( RI == 1 )
    {
        ES = 0;                         //关串口中断 ,方便进行处理
        RI = 0;
        send_update = 1;                //数据在发送更新标志
        send_cnt = 0;
        RxUART_buf[cnt_RxNum] = SBUF;   //将数据存到接收缓冲区
        cnt_RxNum ++;                   //对接收数据字节个数进行统计
   
        ES = 1;                         //开串口中断,启动下一个字节数据发送
    }
   
}


有点问题

关于串口的疑问

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top