MS-51 串口通讯


大家帮我看看这个程序有什么问题吗?
什么没有接收到四个字节啊?
#include <reg52.h>
#define Write  0x57
#define Read 0x52
#define len 4 //BUFF1缓冲区长度
#define len2 5 //BUFF2缓冲区长度
// --------------------------------------------------------------------------------------------------------------------
bit ture = 1;
bit felse = 0;
bit inbufsign; //BUFF1缓冲区非空标志 有=1,空=0
bit inbuffer; //BUFF1缓冲区满标志 满=1,非满=0
bit read_flag=0; //取数标志位
// --------------------------------------------------------------------------------------------------------------------
static int k=0;
unsigned int strlen;
unsigned char idata inbuf[len];
unsigned char idata *inlast=inbuf;
unsigned char idata *getlast=inbuf;
unsigned char *str;
unsigned char idata inbuf2[len2];
unsigned char idata c,c1;
// --------------------------------------------------------------------------------------------------------------------
void UART_init()
{                    
    SCON =0x50;          //选择串口工作方式,打开接收允许
    TMOD =0x21;          //定时器1工作在方式2,定时器0工作在方式1
    TH1 =0xfd;           //实现波特率9600(系统时钟11.0592MHZ)
    TR1 =1;              //启动定时器T1
    ET1 =0;
    ES=1;                //允许串行口中断
    PS=1;                //设计串行口中断优先级
    EA =1;               //单片机中断允许
}
// --------------------------------------------------------------------------------------------------------------------

void one_char(unsigned char ch)
{
   SBUF = ch;
//  while (TI == 0);
   TI = 0;       
}
// --------------------------------------------------------------------------------------------------------------------

void char_string(unsigned char *ch, unsigned char size)
{   
   unsigned char i;
            
   for(i = 0; i < size; i++)
   {  
   //if(ch == '\0') break;
   one_char(*(ch+i));

   }
     
}
// --------------------------------------------------------------------------------------------------------------------

void com_interrupt() interrupt 4 using 3
{
   if(RI)
   {
      RI=0;
      inbuf[k] = SBUF;    //放入数据
      k++;         
      if(k == 4)
          {
        char_string(inbuf,k);
        k = 0;
      }
          SBUF = inbuf[k];           //放入位置加1
   }


}
// --------------------------------------------------------------------------------------------------------------------

void main(void)
{  
   UART_init();
   char_string(inbuf,9);

}

我也来说两句 查看全部回复

最新回复

  • budhy (2008-9-29 21:55:46)

    QUOTE:

    原帖由 wumingfulin 于 2008-9-29 21:28 发表
    大家帮我看看这个程序有什么问题吗?
    什么没有接收到四个字节啊?
    ..
    试一试:

    CODE:

    #include
    #define len 4  //BUFF1缓冲区长度

    unsigned char idata inbuf[len];

    // --------------------------------------------------------------
    void UART_init()
    {
        SCON =0x50;          //选择串口工作方式,打开接收允许
        TMOD =0x21;          //定时器1工作在方式2,定时器0工作在方式1
        TH1 =0xfd;           //实现波特率9600(系统时钟11.0592MHZ)
        TR1 =1;              //启动定时器T1
        ET1 =0;
        ES=1;                //允许串行口中断
        PS=1;                //设计串行口中断优先级
        EA =1;               //单片机中断允许
    }

    // --------------------------------------------------------------

    void one_char(unsigned char ch)
    {
       SBUF = ch;
       while (!TI);
       TI = 0;
    }

    // --------------------------------------------------------------
    void char_string(unsigned char *ch, unsigned char size)
    {
    unsigned char i;
       for(i = 0; i < size; i++) one_char(*(ch+i));
    }

    // --------------------------------------------------------------

    void com_interrupt() interrupt 4 using 3
    {
    static int k=0;
       if (RI)
       {
          RI=0;
          inbuf[k++] = SBUF;    //放入数据

          if(k == 4)
          {
            char_string(inbuf,k);
            k = 0;
          }
       }
    }

    // --------------------------------------------------------------

    void main(void)
    {
       UART_init();
       while (1);
    }
  • sddp001 (2008-9-30 12:29:37)

    来顶顶没事吧!!