1

我用 C 语言编写了一个库,用于在我的 uC 上使用 SIM900 GSM,但它有很多错误。有时它有效有时无效。我认为我的硬件工作正常。

我重写了它并确保基本功能没有错误。

  • SIM900_transmit(char*);
  • SIM900_reveive(char**);
  • SIM900_on();
  • SIM900_off();

现在我想编写将使用SIM900_transmit ( char* ) 和SIM900_reveive ( char** )的SIM900_command函数;

所以我的详细问题是:

如何知道在 AT 命令和收到 SIM900 的应答之间等待多长时间。我不想只放 _delay_ms(1000)。

提前致谢...

4

2 回答 2

1

我发现了我的主要问题。现在我将修复旧的 SIM900 库。

旧代码:

/*
 * Sent the AT command.
 */
softuart_puts_P( "Transmit" );
SIM900_transmit( "AT\r" );
softuart_puts_P( " completed\r\n" );

/*
 * Wait until SIM900 answers back.
 */
while ( uart_available() == 0 )//BUG: Loop in a loop(receive has one) caused chaos.
{   
    /*
     * Sent the AT command.
     */
    softuart_puts_P( "Received: [" );
    cString answer = newEmptyString();
    SIM900_receive( &answer );
    softuart_puts( answer );
    softuart_puts_P( "]\r\n" );
    deleteString( &answer );
}

新代码

/*
 * Sent the AT command.
 */
softuart_puts_P( "Transmit" );
SIM900_transmit( "AT\r" );
softuart_puts_P( " completed\r\n" );

/*
 * Wait until SIM900 answers back.
 */
while ( uart_available() == 0 );// TODO: Put timeout in case SIM900 is switched off.

/*
 * Sent the AT command.
 */
softuart_puts_P( "Received: [" );
cString answer = newEmptyString();
SIM900_receive( &answer );
softuart_puts( answer );
softuart_puts_P( "]\r\n" );
deleteString( &answer );    

这完成了工作:while ( uart_available() == 0 );

谢谢你的帮助。

于 2015-08-23T16:14:20.023 回答
1

通常,您会等到一个字符可用,然后再接收它。看看这里。您可以使用具有单个 UART 的 AVR 设备:

unsigned char uart_recieve (void)
{
    while(!(UCSRA) & (1<<RXC));
    return UDR;
}

因此,while(!(UCSRA) & (1<<RXC));您基本上会阻止执行,直到 uart 上有可用的字符。

于 2015-08-23T14:22:23.130 回答