串口接收不定长字符串

机电学子   2009-7-8 08:27 楼主
void InitSio(void)
{
        u16 RELOAD_COUNT = 0;
       
        //使用独立波特率发生器作为波特率发生器
    S2CON    =   0x50;   //0101,0000 8位可变波特率,无奇偶校验位,允许接收

        RELOAD_COUNT = (int)(XTAL/BaudRateVal/32/12 + 0.5);

    RELOAD_COUNT = 256 - RELOAD_COUNT;
        //BRT        =        0xFA;//22.118400MHz,12T,SMOD=0,9600bps
      BRT = RELOAD_COUNT;
          AUXR        =        0x11; // T0x12,T1x12,UART_M0x6,BRTR,S2SMOD,BRTx12,EXTRAM,S1BRS       
//    ES      =   1;    //允许串口1中断
//        ES2        =        1
        IE2        =        0x01;        //允许串口2中断,ES2=1
    EA      =   1;    //开总中断
         
}
//----------------------------------------------------------------------------------------------
void WrRiBuf(unsigned char c)
{
   
    disjoin_send(c);
     //ribuf[rirear] = c;  
    //rirear++;                                                                           
    if(rirear >= RIBUFMAX)
        {
            rirear = 0;       
            Rs485dislow++;
        }
    if(ribufcount != RIBUFMAX) ribufcount ++;
       
}

//-----------------------------------------------------------------------------
unsigned char RdRiBuf()
{
    char p;
    unsigned char c;   
    p = rirear - ribufcount;
    if(p < 0) p = RIBUFMAX  + p;
       
    ribufcount--;
    c = ribuf[p];
    return c;
}

//----------------------------------------------------------------------------------------------
void IntComm() interrupt 8
{
        u16   k   =   0;

        k = S2CON ;
        k        = k & 0x01;               
    if(k==1) //RI
    {
          IE2        =        0x00;        //允许串口2中断,ES2=1
      S2CON = S2CON & 0xFE; //1111,1110
      WrRiBuf(S2BUF);          
          IE2        =        0x01;        //允许串口2中断,ES2=1
      S2CON = S2CON & 0xFE; //1111,1110
        }
   else
   {
      S2CON = S2CON&0xfd;   
   }

}  
void handlecomm()
{
        char c;
        //char i;
    if (ribufcount)
     c = RdRiBuf();

        if(ribuf[0] == 'F'&&ribuf[1] == 'F'){RIBUFMAX = 20;}
        if(ribuf[0] == 'A'&&ribuf[1] == '0'){RIBUFMAX = 23;}

        manage_key485DataTestdislowSub();  //显示接收到的数据         
}

//-----------------------------------------------------
void disjoin_send( u8 hex)//把十六进制数拆开ASCII显示在屏上
{
  //把十六进制数拆开ASCII
  u8 high;
  u8 low;
  high = hex>>4;//去掉低四位,直接得到高四位
  low = hex&0x0f;
  high = CharHex(high);//转换为高位的ASCII码
  low = CharHex(low);

  ribuf[rirear] = high;
  delayAny(2);
  rirear++;
  ribuf[rirear] = low;
  delayAny(2);
  rirear++;
  ribuf[rirear]= 0x20;
  rirear++;  
  //if(rirear>RIBUFMAX*3-1)rirear1 = 0;
  //if(rirear >=20) Rs485dislow = Rs485dislow+1;
}

//把一个十六进制转换为一个ASCII字符
unsigned char CharHex(char ch)
{
  if((ch>=0)&&(ch<=9))
     return ch+0x30;
                
  else if((ch>=10)&&(ch<=15))
  
  return ch+'A'-10;//即变为从0开始对应字符A

  else return (-1);

}
main()
{
handlecomm();
}
我的函数怎么得不到我想要的东西.我想接收一个字符串转一行.
1,我开始接收更短的可以.我变换长字符长度更长的串是.在变回短的.短的后面就增加了几个字符.如果我重新开机.又可以接收到短的长度.不会在后面多字符.
2.我接收时怎么有错码.要不disjoin_send().直接PC发时不会错码.

回复评论 (3)

请高手们帮帮我吧.我都弄了10多天了.好郁闷.

点赞  2009-7-8 09:08
  1. #include "stc12C5A32.h"
  2. #include"serial.h"
  3. #include"common.h"
  4. #include "max7456osd.h"
  5. #include"processmainmenu.h"
  6. #include"key.h"
  7. #include
  8. #include
  9. //idata char txBuffer[TBUF_SIZE];

  10. int RIBUFMAX = 2;
  11. idata unsigned char tibufcount=0,ribufcount=0;
  12. idata unsigned char tirear,rirear;
  13. idata unsigned char tibuf[TIBUFMAX];
  14. idata unsigned char ribuf[10];
  15. idata unsigned char Ribuflength =3;
  16. idata unsigned char ribufdis[30];
  17. idata unsigned char ribufdiscount = 0;
  18. bit ti_wait = 1;

  19. void InitSio(void)
  20. {
  21.         u16 RELOAD_COUNT = 0;
  22.        
  23.         //使用独立波特率发生器作为波特率发生器
  24.       S2CON    =   0x50;   //0101,0000 8位可变波特率,无奇偶校验位,允许接收

  25.         RELOAD_COUNT = (int)(XTAL/BaudRateVal/32/12 + 0.5);

  26.         RELOAD_COUNT = 256 - RELOAD_COUNT;
  27.         //BRT        =        0xFA;//22.118400MHz,12T,SMOD=0,9600bps
  28.       BRT = RELOAD_COUNT;
  29.           AUXR        =        0x11; // T0x12,T1x12,UART_M0x6,BRTR,S2SMOD,BRTx12,EXTRAM,S1BRS       
  30. //    ES      =   1;    //允许串口1中断
  31. //    ES2        =        1
  32.          IE2        =        0x01;        //允许串口2中断,ES2=1
  33.      EA      =   1;    //开总中断
  34.          
  35. }
  36. //----------------------------------------------------------------------------------------------
  37. void WrRiBuf(unsigned char c)
  38. {   
  39.    // disjoin_send(c);
  40.      ribuf[rirear] = c;  
  41.      rirear++;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
  42.     if(rirear >= RIBUFMAX)
  43.         {
  44.             rirear = 0;       
  45.             Rs485dislow++;
  46.         }
  47.     if(ribufcount != RIBUFMAX) ribufcount ++;
  48.        
  49. }

  50. //-----------------------------------------------------------------------------
  51. unsigned char RdRiBuf()
  52. {
  53.     char p;
  54.     unsigned char c;   
  55.     p = rirear - ribufcount;
  56.     if(p < 0) p = RIBUFMAX  + p;
  57.        
  58.     ribufcount--;
  59.     c = ribuf[p];
  60.     return c;
  61. }

  62. //----------------------------------------------------------------------------------------------
  63. void IntComm() interrupt 8
  64. {
  65.         u16   k   =   0;

  66.         k = S2CON ;
  67.         k        = k & 0x01;               
  68.     if(k==1) //RI
  69.     {
  70.           IE2        =        0x00;        //允许串口2中断,ES2=1
  71.       S2CON = S2CON & 0xFE; //1111,1110
  72.       WrRiBuf(S2BUF);          
  73.           IE2        =        0x01;        //允许串口2中断,ES2=1
  74.       S2CON = S2CON & 0xFE; //1111,1110
  75.           
  76.         }
  77.    else
  78.    {
  79.       S2CON = S2CON&0xfd;
  80.      
  81.    }
  82. }   
  83. void Sio_PutChar(u8 ch)
  84. {
  85.   //unsigned char temp = 0;
  86.    // WrTiBuf(ch);
  87.    unsigned char temp = 0;

  88.   //    ES     =   0;  //关串口1中断
  89.         IE2        =        0x00;        //关串口2中断,es2=0
  90.    //    TI     =   0;  //清零串口1发送完成中断请求标志
  91.    //S2 Control  S2SM0  S2SM1  S2SM2  S2REN  S2TB8  S2RB8  S2TI  S2RI
  92.     S2CON        =        S2CON & 0xFD; //B'11111101,清零串口2发送完成中断请求标志
  93.    //    SBUF   =   i;
  94.     S2BUF   =   ch;
  95.    //    while(TI ==0); //等待发送完成
  96.     do
  97.         {
  98.                 temp = S2CON;
  99.                 temp = temp & 0x02;
  100.         }while(temp==0);
  101.        
  102. //        TI     =   0;  //清零串口发送完成中断请求标志
  103.     S2CON        =        S2CON & 0xFD; //B'11111101,清零串口2发送完成中断请求标志
  104. //    ES     =   1;  //允许串口1中断
  105. //        ES2        =        1
  106.         IE2        =        0x01;
  107. }

  108. void Sio_PrintStr(const u8 *msg, u8 len)
  109. {
  110.         u8 index = 0;

  111.         while(len != index)
  112.         {
  113.                 Sio_PutChar(msg[index]);
  114.                 index++;
  115.         }
  116. }
  117. //-----------------------------------------------------------------------------
  118. //int i = 0;

  119. void handlecomm()
  120. {

  121.     unsigned char c;
  122.     static unsigned char count = 0;

  123.     while(ribufcount)
  124.     {
  125.         c = RdRiBuf();
  126.         if ((c == 0xff) || (c == 0xa0))
  127.         {
  128.              Rs485dislow++;//转行标记
  129.              count = 0;   
  130. }
  131.         else      
  132.              count ++;         
  133.         disjoin_send(c,count);
  134.         manage_key485DataTestdislowSub();  //显示接收到的数据
  135.                         
  136.     }  
  137.          
  138. }

  139. idata u8 rirear1 = 0;

  140. void disjoin_send( u8 hex)//把十六进制数拆开ASCII显示在屏上
  141. {
  142.   //把十六进制数拆开ASCII
  143.   u8 high;
  144.   u8 low;
  145.   high = hex>>4;//去掉低四位,直接得到高四位
  146.   low = hex&0x0f;
  147.   high = CharHex(high);//转换为高位的ASCII码
  148.   low = CharHex(low);
  149. [color=#FF0000]  if(rirear1>RIBUFMAX*3-1)rirear1 = 0;[/color]
  150.   ribufdis[rirear1] = high;
  151.   delayAny(2);
  152.   rirear1++;
  153.   ribufdis[rirear1] = low;
  154.   delayAny(2);
  155.   rirear1++;
  156.   ribufdis[rirear1]= 0x20;
  157.   rirear1++;  
  158.   

  159.   //if(rirear >=20) Rs485dislow = Rs485dislow+1;
  160. }

  161. //把一个十六进制转换为一个ASCII字符
  162. unsigned char CharHex(char ch)
  163. {
  164.   if((ch>=0)&&(ch<=9))
  165.      return ch+0x30;
  166.          
  167.        
  168.   else if((ch>=10)&&(ch<=15))
  169.   
  170.   return ch+'A'-10;//即变为从0开始对应字符A

  171. //else if((ch>='a')&&(ch<='f'))
  172. //return ch+'a'-10;
  173.   else return (-1);

  174. }
点赞  2009-7-8 17:33
谢谢.
点赞  2009-7-8 18:38
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复