У меня есть чип atmega162 на плате разработчика stk500, подключенный к Ubuntu с помощью последовательного кабеля. На атмеге я инициализирую 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)
Я дважды проверил настройки размера байта и расчеты скорости передачи данных, и все кажется в порядке ... Есть идеи, что я делаю неправильно?
ubrr
. С sizeof(int)==2 его вычисление может привести к переполнению и, следовательно, к неверному результату. Я предлагаю жестко закодировать значениеUBRR0
для целей тестирования. - person Pavel Zhuravlev   schedule 21.10.2013