Асинхронная передача UART в микроконтроллере 8051 - PullRequest
0 голосов
/ 16 февраля 2012

Привет, я пытаюсь связать свой 89c52 с модулем sim548c. Я посылаю AT-команды, а затем заставляю микроконтроллер сохранять все ответы в массиве и проходить через функцию поиска, чтобы проверить, был ли отправлен правильный ответ, чтобы он мог перейти к следующей AT-команде. Это требует двухсторонней последовательной передачи. Я должен сначала отправить последовательно команду AT, затем включить прием и сохранить все ответы от модуля в массиве. Я использую эту программу, но я не могу заставить микроконтроллер принимать входящие данные и сохранять их в массиве. он успешно передает, но не получает. Не могли бы вы определить, в чем проблема?

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;
    }
}

Ответы [ 2 ]

1 голос
/ 26 июля 2012

Я видел это пару раз, и ошибка состоит в том, что ваш последовательный прием работает с прерыванием, и это не является функцией voidable, просто удалите VOID, который присоединен к INTERRUPT 4, чтобы ваш код стал

 receive_data()            interrupt 4                      
{
    if(RI)
    {
        info[check++]=SBUF;
        RI=0;
    }
    if(TI)
        TI=0;
}
0 голосов
/ 01 марта 2012

Я бы предложил создать меньшую (настолько простую, насколько это возможно) программу, которая ничего не делает, кроме как получает (прерывая?) Данные и мигает светодиодом, или возвращает их назад, или каким-либо другим способом, указывающим на то, что вы можете получать надежно.Используйте это, чтобы поговорить с эмулятором терминала или другим известным рабочим интерфейсом.Вырежьте всех возможных посредников и неизвестных.

Проверьте также регистры ошибок UART и конфигурацию, чтобы убедиться, что ваши настройки часов / четности / данных совпадают с обоих концов.Сначала начните с медленной скорости.

Надежно работайте по одной штуке за раз, затем сложите их вместе.

...