2

我在 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)

我仔细检查了字节大小设置和波特率计算,一切似乎都很好......知道我做错了什么吗?

4

1 回答 1

1

据我所知(并且已经在评论中怀疑),波特率计算是错误的。
尝试

UBRR = ((fOSC / (16 * BAUD)) - 1

结果是什么

UBRR = 47

对于 9600 @ 7372800MHz。

于 2013-10-21T07:30:18.433 回答