AVR UART - Java Android蓝牙通信

时间:2014-08-03 12:44:29

标签: bluetooth avr uart

我通过UART将蓝牙模块连接到AVR(Atmega32A)。从蓝牙模块传输到AVR的一些字节无法正确接收。

例如正确传输/接收的字节数(UTF-8):

蓝牙模块发送字节X->接收字节X'

'w'->'w'
's'->'s'
'z'->'z'
'm'->'m'

字节未正确收到:

'q'->'y'
'p'->'~'
'1'->'9'

蓝牙连接设置: Bps / Par / Bits:115200 8N1

init UART:

#define F_CLK   16000000
#define BAUD    115200

uint16_t ubrr_value = (uint16_t) (((F_CLK)/(16 * BAUD)) - 1);
UBRRL = ubrr_value;
UBRRH = (ubrr_value>>8);

// 8 bit frame, async mode
UCSRC=(1<<URSEL) | (3<<UCSZ0);
//recive and transmit mode
UCSRB = (1<<TXEN) | (1 << RXEN);

通过uart发送/接收字节:

char USART_ReceiveByte()
{
    while(!(UCSRA & (1<<RXC)));
    return UDR;
}

void uart_sendRS(char VALUE)
{
    while(!(UCSRA & (1<<UDRE)));
    UDR = VALUE;
}

主循环:

while(1)
{
    recivedByte = USART_ReceiveByte();
    uart_sendRS(recivedByte);
}

我很高兴知道为什么它不能正常工作

编辑:如果我更改订单,则会产生结果:

'y'->'y'
'~'->'~'
'9'->'9'

EDIT2:设置UBRRL和UBRRH可能有问题(在这种情况下ubrr_value = 7),是否有人可以确认它是否正确以及微控制器是否可以处理如此高的BAUD?

#define F_CLK   16000000
#define BAUD    115200
uint16_t ubrr_value = (uint16_t) (((F_CLK)/(16 * BAUD)) - 1);
UBRRL = ubrr_value;
UBRRH = (ubrr_value>>8);

1 个答案:

答案 0 :(得分:0)

这里的问题是您没有正确初始化UART。如果您希望使用您希望配置的波特率,则需要在UCSRA中设置U2X位。如果您使用的是avr-libc,则可以使用以下代码正确计算BAUD率。

void uart0_init(void) {
#   define BAUD 115200
#   include <util/setbaud.h>
    UBRRH = UBRRH_VALUE;
    UBRRL = UBRRL_VALUE;
#   if USE_2X
    UCSRA |= _BV(U2X);
#   else
    UCSRA &= ~_BV(U2X);
#   endif
#   undef BAUD
    /* other uart stuff you may need */
}

如果您查看微控制器的数据表,请参见第20.12节,您将找到一张表格,其中包含为您预先计算的此信息。欢呼声。