如何解决为什么我不能在ATMEGA64A-AU序列号中输入命令?
我买了ATMEGA64A-AU,并将USART0连接到FT232RL(USB到串行),而USART1连接到GSM模块。
我使用USART0仅监视目的,并使用USART1与GSM模块进行通信。
我写这些来启用USART:
void USART0_Init( unsigned int ubrr )
{
UBRR0H = (unsigned char) (ubrr >> 8);
UBRR0L = (unsigned char) ubrr;
UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0);
UCSR0C = (1 << USBS0) | (3 << UCSZ00);
}
void USART1_Init( unsigned int ubrr )
{
UBRR1H = (unsigned char) (ubrr >> 8);
UBRR1L = (unsigned char) ubrr;
UCSR1B = (1 << RXEN1) | (1 << TXEN1) | (1 << RXCIE1);
UCSR1C = (1 << USBS1) | (3 << UCSZ01);
}
然后将这些字符放在每个USART中的字符或字符串:
void usart0_putc (char send)
{
while ((UCSR0A & (1 << UDRE0)) == 0) {};
UDR0 = send;
}
void usart0_puts (const char *send)
{
while (*send) {
usart0_putc(*send++);
}
}
void usart1_putc (char send)
{
while ((UCSR1A & (1 << UDRE1)) == 0) {};
UDR1 = send;
}
void usart1_puts (const char *send)
{
while (*send) {
usart1_putc(*send++);
}
}
我使用RX1中断向量来获取模块的响应:
ISR (USART1_RX_vect)
{
data_in[data_count] = UDR1;
if (data_in[data_count] == '\n') {
command_ready = TRUE;
data_count = 0;
} else {
data_count++;
}
}
主要功能:
void main( void )
{
sei();
USART0_Init(MYUBRR);
USART1_Init(MYUBRR);
while(1){
if (command_ready == TRUE) {
memcpy(command_in,data_in,MAXCHAR );
memset(data_in,sizeof(data_in));
usart0_puts(command_in);
command_ready = FALSE;
}
}
}
它显示响应或诸如振铃和消息之类的内容,但问题是,当我通过微控制器向其添加一些命令时,例如将此行放在main while循环之前:
usart1_puts("ATD+545555555555;\r\n");
要呼叫某个号码,整个过程都会停止,不仅不会呼叫该号码,而且还会停止显示模块的响应,所以我认为代码有问题。
任何帮助将不胜感激。
解决方法
您必须更改行:
UCSR1C = (1 << USBS1) | (3 << UCSZ01);
对此:UCSR1C = (1 << USBS1) | (3 << UCSZ10);
UCSZ01 位属于 USART0 而不是 USART1 !
,您已在UCSR0B
UCSR0B = (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0);
)。
ISR (USART0_RX_vect)
但是您没有用于该中断向量的中断服务例程处理程序。
所有带有未声明的中断处理程序的向量都默认为无限循环,从而使程序挂起。
您必须声明RXCIE0
或从UCSR0B
中删除library(ggplot2)
library(data.table)
setDT(dt)
#reshape
plotDat <- melt(df1,id.vars = "time",variable.name = "year")
#pretty xlimits
xlimits <- range(plotDat$time)
# plot tiles
ggplot(plotDat[ value == 1,],aes(time,year)) +
geom_tile(fill = "lightblue") +
scale_x_continuous(limits = xlimits,breaks = seq(xlimits[1],xlimits[2]))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。