0

嗨,我正在尝试将我的 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;
    }
}
4

2 回答 2

1

我已经看过几次了,错误是你的串行接收与中断一起工作,它不是一个可撤销的函数,只需删除附加到中断 4 的 VOID,这样你的代码就变成了

 receive_data()            interrupt 4                      
{
    if(RI)
    {
        info[check++]=SBUF;
        RI=0;
    }
    if(TI)
        TI=0;
}
于 2012-07-25T23:25:50.467 回答
0

我建议制作一个更小(尽可能简单)的程序,它只会接收(通过中断?)数据并闪烁 LED 或将其回显或以其他方式表明您可以可靠地接收。使用它与终端仿真器或其他已知的工作接口对话。消除所有可能的中间人和未知因素。

还要检查 UART 错误寄存器和配置,以确保您的时钟/奇偶校验/数据设置在两端匹配。先从慢速开始。

使一件一件地工作可靠,然后将它们放在一起。

于 2012-03-01T10:38:47.410 回答