microcontroller - 从 SIM808 接收数据
问题描述
我正在尝试使用 SIM808 模块,但即使仅发送“AT”也没有响应。我正在使用 5V/2.5A AC/DC 适配器。该板(ecb-v3.2)连接良好,因为两个二极管一直亮着,一个每三秒闪烁一次。我通过从 uC 向 PC 发送和接收数据来尝试我的 UART 代码,它工作正常。我还尝试在代码的不同部分显示一些数据,以找到存在错误的行。我认为问题出在我等待从 SIM808 模块接收单个字符的 while 循环中。我在代码中标记了这一行(在函数UART_RxChar()中)。我在我的代码中使用了两个 UART,一个用于在 uC 和 PC 之间发送数据(代码中的通道 0),第二个用于在 uC 和 SIM808(通道 1)之间发送数据,但我在计算机上检查了这两个版本。这是我的代码:
#define F_OSC 7372800UL
#define BAUD 115200
#define ubrr ((F_OSC/16/BAUD)-1)
#include <avr/io.h>
#include <util/delay.h>
#include "lcd.h"
void UART_TxString(char *string_ptr, uint8_t channel);
void UART_Init( uint8_t channel )
{
if ( channel == 0)
{
/*Set baud rate */
UBRR0H = (unsigned char)(ubrr>>8);
UBRR0L = (unsigned char)ubrr;
/*Enable receiver and transmitter */
UCSR0B = (1<<TXEN0) | (1<<RXEN0);
/* Set frame format: 8data, 1stop bit */
UCSR0C = (1<<UCSZ00) | (1<<UCSZ01);
}
else
{
/*Set baud rate */
UBRR1H = (unsigned char)(ubrr>>8);
UBRR1L = (unsigned char)ubrr;
/*Enable receiver and transmitter */
UCSR1B = (1<<TXEN1) | (1<<RXEN1);
/* Set frame format: 8data, 1stop bit */
UCSR1C = (1<<UCSZ10)|(1<<UCSZ11);
}
}
char UART_RxChar( uint8_t channel )
{
if ( channel == 0 )
{
while((UCSR0A & (1<<RXC0))==0); // Wait till the data is received
return(UDR0); // return the received char
}
else
{
//Here is the problem. The condition in the loop is always true.
while((UCSR1A & (1<<RXC1))==0); // Wait till the data is received
return(UDR1); // return the received char
}
}
void UART_TxChar(char ch, uint8_t channel)
{
if ( channel == 0)
{
while((UCSR0A & (1<<UDRE0))==0); // Wait till Transmitter(UDR) register becomes Empty
UDR0 =ch; // Load the data to be transmitted
}
else
{
while((UCSR1A & (1<<UDRE1))==0); // Wait till Transmitter(UDR) register becomes Empty
UDR1 =ch; // Load the data to be transmitted
UART_TxChar(ch,0);
}
}
void UART_TxString(char *string_ptr, uint8_t channel)
{
while(*string_ptr)
UART_TxChar(*string_ptr++, channel);
}
void UART_RxString(char *string_ptr, uint8_t channel)
{
char ch;
while(1)
{
ch=UART_RxChar(channel); //Reaceive a char
UART_TxChar(ch, channel); //Echo back the received char
if((ch=='\r') || (ch=='\n')) //read till enter key is pressed
{ //once enter key is pressed
*string_ptr=0; //null terminate the string
break; //and break the loop
}
*string_ptr=ch; //copy the char into string.
string_ptr++; //and increment the pointer
}
}
int main(void)
{
UART_Init(0);
UART_Init(1);
initLCD();
UART_TxString("\r\nstart", 0);
while(1)
{
char ans[15] = "";
DDRE = 0xff;
UART_TxString("AT\r\n",1);
DDRE = 0x00;
UART_RxString(ans,1);
_delay_ms(2000);
}
}
我还检查了所有发送的可能性:AT\r", "AT\n", "AT\r\n", "AT\n\r
。
预先感谢您的任何帮助。
解决方案
问题是您正在将接收到的字符回显到在线 SIM808 模块
UART_TxChar(通道,通道);//回显接收到的字符
这可能会混淆 SIM808 并将其置于不一致的状态。
尝试将 SIM808 模块连接到 PC 并使用CoolTerm分析触发 AT 命令后的响应。
推荐阅读
- ansible - 获取逻辑卷的当前空间的函数?
- sql - 从 T-SQL 中的几个子字符串中计算出现的次数
- git - 如何让 github 分支接受从其他分支推送的更改,但它一直说没有什么可以提交?
- javascript - If - else if - else 反应原生 jsx 中的条件
- tableau-api - 在 Tableau 中使用计算字段进行 Vlookup
- python - 时间数据“2021-03-31 23:30:00”与格式“%Y-%m-%d %H:%M:S”不匹配
- linux - Docker主机联网模式:如何只向其他容器公开端口
- asynchronous - Scalamock最终期望
- android - 文本大小、不同密度设备和材料设计
- laravel - Laravel - Laravel Socialite 中的会话替代方案登录 Rest API