如何编写代码以从rs232上的设备接收整个字符串?

时间:2017-12-10 13:42:47

标签: embedded microcontroller 8051

您好我想知道如何编写接收特定字符串的代码。例如,这个OK,在此我只需要" OK"字符串。

另一个字符串也好 我已经在keil c51中为at89s52微控制器编写代码,但是我需要更可靠的代码

我对来自rs232 serial的rx数据使用中断。

void _esp8266_getch() interrupt 4      //UART Rx.{
    if(TI){
        TI=0;
        xmit_bit=0;
        return ;
    }
    else
    {
        count=0;
        do
        {
            while(RI==0);
            rx_buff=SBUF;
        if(rx_buff==rx_data1)           //rx_data1 = 0X0D /CR
            {
                RI=0;
                while(RI==0);
                rx_buff=SBUF;
                if(rx_buff==rx_data2)           // rx_data2 = 0x0A /LF
                {
                    RI=0;
                    data_in_buffer=1;
                    if(loop_conti==1)
                    {
                        if(rec_bit_flag==1)
                        {
                            data_in_buffer=0;
                            loop_conti=0;
                        }
                    }
                }
            }
            else
            {
                if(data_in_buffer==1)
                {

                    received[count]=rx_buff;  //my buffer in which storing string
                    rec_bit_flag=1;
                    count++;
                    loop_conti=1;
                    RI=0;
                }
                else
                {
                    loop_conti=0;
                    rec_bit_flag=0;
                    RI=0;
                }
            }
        }
        while(loop_conti==1);
    }
    rx_buff=0;
  }

1 个答案:

答案 0 :(得分:0)

这是一个仅供参考,您需要根据自己的需要进一步开发逻辑。而且,设计取决于接收的值,是否有任何特定的模式和更多的参数。这不是经过测试的代码,我试图在设计上给出我的想法,这里的免责声明就是样本..

//Assuming you get - "OK<CR><LF>" in which <CR><LF> indicates the end of string steam

int nCount =0; 
int received[2][BUF_SIZE];              //used only 2 buffers, you can use more than 2, depending on how speed 
                                        //you receive and how fast you process it
int pingpong =0;
bool bRecFlag = FALSE;
int nNofbytes = 0;
void _esp8266_getch() interrupt 4      //UART Rx.
{
    if(TI){
        TI=0;
        xmit_bit=0;
        return ;
    }
    if(RI)                          // Rx interrupt
    {
        received[pingpong][nCount]=SBUF;    
        RI =0;                      
        if(nCount > 0)
        {
            //  check if you receive end of stream value
            if(received[pingpong][nCount-1] == 0x0D) && (received[pingpong][nCount] == 0x0A))
            {
                bRecFlag = TRUE;
                pingpong = (pingpong == 0);
                nNofbytes = nCount;
                nCount = 0;
                return;
            }
        }
        nCount++;
    }
    return;
}

int main()
{

    //  other stuff

    while(1)
    {
        // other stuff

        if(bRecFlag)        //String is completely received
        {
            buftouse = pingpong ? 0 : 1;    // when pingpong is 1, buff 0 will have last complete string  
                                            // when pingpong is 0, buff 1 will have last complete string  
            // copy to other buffer or do action on received[buftouse][] 
            bRecFlag = false;
        }

        // other stuff
    }

}