如何用循环队列来串口通信中的读写缓存呢?

解决方案 »

  1.   

    /*******************************************************************
    函数名称:       S32 WriteComm(S32 comport, U8 *buf, S32 len);
    函数功能:       将串口收到的数推入串口缓冲区
    入口参数:       comport 串口号 只开放串口0
                    buf 写串口的数
                    len 数据的长度
    返 回 值:       = 1 写成功(写成功字节个数)
                    = 0 写失败
    备    注:      
    ********************************************************************/
    u16 WriteComm (u8 comport, char *buf, u16 len)
    {
    u16 i;
        //if(comport == 2) return 1;
        
    if(!OpenComm(comport)) return 0;
    if (len == 0) return 0;
    if(comport == 0)
    {
    for(i=0;i<len;i++)
    {
        txd_buf[txd_end++] = *buf;    
        if(txd_end>=SIO_TXD_TOTALLEN)  //接收队列拐弯
            {
                txd_end = 0;
            }
            buf++;
    }
            sio_send_parse(); 
        }
        else
        {
           return 0;
        } 
        
      return 1;
    }void sio_send_parse(void)
    {               while(txd_head != txd_end)
              {
                    
       
                 U0THR = txd_buf[txd_head++];      
                 if(txd_head>=SIO_TXD_TOTALLEN) 
                 {
                    txd_head = 0;
                 }
                 while( (U0LSR&0x40)==0 );   
              }   
         }/*******************************************************************
    函数名称:       u16 ReadComm (u8 comport, char *buf, u16 len)
    函数功能:       读串口
    入口参数:       comport 串口号 只开放串口0
                    buf 需要推入串口缓冲区中的数据
                    len 需读取数据最大长度 -般取IOLEN
    返 回 值:       =0 读失败
                    >0 读到的有效报文长度
    备    注:       API函数, 
                   
    ********************************************************************/
    u16 ReadComm (u8 comport, char *buf, u16 len)
    {
    u16 n = 0, i;
    //U8 j;

    if(!OpenComm(comport)) return 0;
    if(len == 0) return 0;
    if(comport == 0)
    {
       i = 0;
           while(rec_head != rec_end)
           {
         *buf = rec_buf[rec_head++];
         if(rec_head>=SIO_REC_TOTALLEN) rec_head = 0;
           /*  //test
             *buf = rec_buf[rec_head];          
                 U0THR = rec_buf[rec_head];      
                 if(rec_head>=SIO_REC_TOTALLEN)  //接收队列拐弯
                 {
                    rec_head = 0;
                 }
                 while( (U0LSR&0x40)==0 );     // 等待数据发送完毕             
             rec_head++;
             if(rec_head>=SIO_REC_TOTALLEN) rec_head = 0;
           */  
        
         buf ++;
         i ++;
         if(i >= len)
         {
            break;
         }      
      }         
          n = i;
      if (n > 0)
      {
     return n;
      }
      return 0;
    }
    else
    {
        return 0;
    }  
      
    }