2017-12-10 20 views
0

안녕하세요, 특정 문자열을받는 코드를 작성하는 방법을 알고 싶습니다. 예를 들어,이 하나만 OK,이 경우에만 "OK"문자열 만 필요합니다.rs232의 장치에서 전체 문자열을 수신하는 코드를 작성하는 방법은 무엇입니까?

또 다른 문자열도 OK 같은 내가 더 안정적인 코드를 RS232 시리얼에서 수신 데이터에 대한 인터럽트를 사용

메신저를 필요로 꾸물 거리지 작동 AT89S52 마이크로 컨트롤러 카일의 C51에 쓰기 코드를 가지고있다.

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

분명히 인터럽트 루틴에서 do-while (모든 루프)을 구현하면 안됩니다. 인터럽트 루틴은 가능한 한 파삭 파삭해야합니다 – Sudhee

+0

rs232 대신에 uart를 사용 했습니까? –

+0

예, rs 232는 uart를 의미합니다 –

답변

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 
    } 

} 
+0

감사 @Sudhee, 참조 주셔서 감사하지만 나는 아래에서 어떤 형식 문자열을 얻을 중 하나는 문자열의 끝으로 , 다음이 것 고려하는 경우 1. < LF > "OK"< LF > 또는 2. "OK"< LF > –

+0

작업 – Sudhee