2012-02-16 12 views
0

안녕하세요 저는 89c52와 sim548c 모듈을 통신하려고합니다. 나는 AT 명령을 보내고 마이크로 컨트롤러에 모든 응답을 배열로 저장하고 검색 기능을 통해 올바른 응답이 전송되었는지 확인하여 다음 AT 명령으로 넘어갈 수 있는지 확인합니다. 이를 위해서는 양방향 직렬 전송이 필요합니다. 우선 직렬 AT 명령을 보낸 다음 수신을 활성화하고 모듈의 모든 응답을 배열에 저장해야합니다. 이 프로그램을 사용하고 있지만 마이크로 컨트롤러가 들어오는 데이터를 받아 어레이에 저장할 수는 없습니다. 그것은 성공적으로 전송하지만받지 못합니다. 문제가 무엇인지 친절하게 파악할 수 있습니까?마이크로 컨트롤러에서 비동기식 UART 전송 8051

int check=0; 
int out=0; 
unsigned char info[20]={"00000000000000000000"}; 
unsigned char *s; 
unsigned char a[3],b[3]; 

void transmit_data(unsigned char str)   
{ 
    SBUF=str;         
    while(TI==0); 
    TI=0;       
} 

void send_serial(unsigned char *s) 
{ 
    delay(50); 
    while(*s!=0x0) 
    { 
     SBUF=*s; 
     while(TI==0) 
     { 
     } 
    TI=0; 
    s++; 
    } 
} 

void receive_data()   interrupt 4      
{ 
    if(RI) 
    { 
     info[check++]=SBUF; 
     RI=0; 
    } 
    if(TI) 
     TI=0; 
} 

void search(unsigned char b[]) 
{ 
    int l=0; 
    for(l;l<18;l++) 
    { 
     if(info[l]==b[0] && info[l+1]==b[1] && info[l+2]==b[2]) 
     { 
      out=1; 
      break; 
     } 
    } 
} 

void compare(unsigned char *s, unsigned char a[]) //for CIPSEND 
{ 
    while(1) 
    { 
     out=0; 
     check=0; 
     delay(50); 
     send_serial("AT+CIPSEND\r"); 
     delay(100); 
     send_serial(s); 
     transmit_data(0x0D); 
     transmit_data(0x0A); 
     transmit_data(0x1A); 
     IE=0x90; 
     delay(200); 
     IE=0x88; 
     search(a); 
     if (out==1) 
     break; 
    } 
} 
+1

RI 및 SBUF는 어떻게 정의됩니까? 필요한 경우 휘발성으로 표시됩니까? 또한 루프백을 수행하거나 알려진 데이터를 생성하고 수신이 전혀 작동하는지 확인할 수 있습니까? –

+0

나는 당신이 사용하는 컴파일러/libs에 대해 언급해야한다고 생각한다. – XTL

답변

0

I 데이터 (? 인터럽트에 의해)과 LED를 점멸하거나 다시 에코 또는 다른 방법으로받는 것보다 더 아무것도하지 않는 (당신이 할 수있는 간단 같은) 작은 프로그램을 만드는 제안은 당신이 할 수있는 것을 나타냅니다 안정적으로받을 수 있습니다. 이를 사용하여 터미널 에뮬레이터 또는 알려진 다른 작동중인 인터페이스와 통신하십시오. 가능한 모든 중개자와 알려지지 않은 사람을 잘라내십시오.

또한 UART 오류 레지스터 및 구성을 확인하여 시계/패리티/데이터 설정이 양쪽에서 일치하는지 확인하십시오. 먼저 느린 속도로 시작하십시오.

한 번에 한 장씩 안정적으로 작동하도록 한 다음 조립하십시오. 나는이 시간과 일의 실수 몇 보았다

1

는 시리얼 인터럽트와 함께 작품을 수신하고 smply 그래서 그쪽으로 통해 UR 코드가됩니다 4을 중단 부착 된 VOID를 제거하려면 무효로 기능이되지 않는 것입니다

receive_data()   interrupt 4      
{ 
    if(RI) 
    { 
     info[check++]=SBUF; 
     RI=0; 
    } 
    if(TI) 
     TI=0; 
}