Bluetooth AVR-UART-javaandroid蓝牙通信

Bluetooth AVR-UART-javaandroid蓝牙通信,bluetooth,avr,uart,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 初始UART: #define F_CLK 1600000

我有蓝牙模块通过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

初始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);
我很高兴知道它为什么不能正常工作


编辑:如果我更改顺序,则会出现以下结果:

'y'->'y'
'~'->'~'
'9'->'9'
EDIT2:设置UBRRL和UBRRH(在本例中ubrr_值=7)可能有问题,有人能确认它是否正确,以及微控制器是否能处理如此高的波特率吗

#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);

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

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 */
}
void uart0\u init(void){
#定义波特率115200
#包括
UBRRH=UBRRH_值;
UBRRL=UBRRL_值;
#如果使用_2X
UCSRA |=_BV(U2X);
#否则
UCSRA&=~\u BV(U2X);
#恩迪夫
#未定义波特率
/*您可能需要的其他uart内容*/
}

如果您查看微控制器数据表第20.12节,您会发现一个表格,其中包含为您预先计算的信息。干杯。

如果您更改顺序,相同的值或相同的位置会失败吗?如果我更改顺序,结果是:'y'->'y'~'->'~''9'->'9'是的,您是对的,在计算UBBRL/H时类型转换有问题,因为我没有JTAG(这将允许我调试),但USB ASP我设法手动计算UBRRH和UBRRL值(不是从公式:f_cpu/(baud*16))。但最后我使用baud=19200,因为我不能在同步模式下运行它(我把URSEL放在UCSRC中),在异步模式下,baud=115200在数据流中有6%的错误。你知道为什么它不工作吗?即使在baud=19200
UCSRC的情况下=(3U2X提供了双速模式,它给出的错误系数仍然太高,因此使用代码的结果是:某些字符仍然存在常量偏移,例如:
在蓝牙->输出AVR
'1'->'9'
但您的代码在波特率=19200时运行良好
#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);
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 */
}