我通过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);
答案 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节,您将找到一张表格,其中包含为您预先计算的此信息。欢呼声。