我在stk500开发板上有一个atmega162芯片,通过串行电缆连接到ubuntu。 在atmega上,我初始化usart并写入一些字节。在Ubuntu方面,某些东西来自管道,但它肯定不是发送的......
更确切地说:对于发送的每个字节,我得到一系列大约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脚本接收数据:
import serial
import os
port = serial.Serial('/dev/ttyS0', 9600)
print 'Reading from serial...'
while True:
c = port.read()
print c, ord(c)
我仔细检查了字节大小设置和波特率计算,一切似乎都没问题......任何想法我做错了什么?
答案 0 :(得分:1)
据我所知(并且在评论中已经怀疑),波特率计算错误 尝试
UBRR = ((fOSC / (16 * BAUD)) - 1
结果
UBRR = 47
for 9600 @ 7372800MHz。