我在stk500开发板上使用串行电缆连接到ubuntu上的atmega162芯片。 在atmega上,我初始化usart并写入一些字节。在Ubuntu端,东西出来的管道,但它绝对不是什么被发送...从AVR USART传输中读取损坏的数据
更准确地说:每发送一个字节,我得到一系列约6或7字节,每个它们具有0x00或0xC0值。我的代码
相关片段:
编译标志:
CFLAGS = -g
CFLAGS += -mmcu=atmega162
CFLAGS += -W -Wall -Wshadow
CFLAGS += -Os
CFLAGS += -mcall-prologues
CFLAGS += -finline-limit=10
CFLAGS += -mno-interrupts
CFLAGS += -ffunction-sections
CFLAGS += -DF_CPU=7372800ULL
USART功能:
void Serial0Init(int baud)
{
unsigned int ubrr;
ubrr = ((F_CPU+8*baud)/(16*baud))-1;
// Baud rate
UBRR0H = (unsigned char)(ubrr>>8);
UBRR0L = (unsigned char)ubrr;
UCSR0A &= ~(1 << U2X0); // U2X off
// Transmission settings
UCSR0C = (1<<URSEL0)|(3<<UCSZ00); // 8N1
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
}
unsigned char Serial0CheckTxReady()
{
return (UCSR0A&_BV(UDRE0)); // nonzero if transmit register is ready to receive new data.
}
void Serial0Write(unsigned char data)
{
while (Serial0CheckTxReady()==0) // while NOT ready to transmit
{}
UDR0 = data;
}
主要代码:
Serial0Init(9600);
Serial0Write('!');
我用简单的python接收数据SCR IPT:
import serial
import os
port = serial.Serial('/dev/ttyS0', 9600)
print 'Reading from serial...'
while True:
c = port.read()
print c, ord(c)
我双重检查字节大小的设置和波特率的计算,一切似乎好了... ...任何想法我做错了吗?
这个问题看起来像波特率问题。你确定你的MCU运行在7.372 MHz?我建议检查时钟源的保险丝设置。如果选择外部振荡器作为时钟源,则应该检查其设置(例如,STK500时钟发生器频率)。同时检查Atmega161兼容性保险丝。只要您正在编译Atmega162,应禁用兼容模式以防止可能的副作用。 –
也检查用于计算'ubrr'的表达式。用sizeof(int)== 2它的计算可能会导致溢出,从而导致错误的结果。为了测试目的,我建议硬编码'UBRR0'的值。 –
好的,你的提示非常有帮助。我发现了这个问题。这确实是波特率计算。固定公式如下所示:ubrr =((F_CPU + 8 *(long int)baud)/(16 *(long int)baud)) - 1; – Bob