【发布时间】:2014-09-28 13:11:25
【问题描述】:
我正在使用波特率为 38400 的 PIC18F87J11 和 RN42 Bluetooth module。我制作了一个连接到蓝牙模块的安卓应用程序,并将一些数据从我的手机发送到微控制器。一切都很好,但我注意到有时我会丢失一些数据。 PIC18 预计大约 100 个字符,如果应用程序发送这 100 个字符没有问题,但有时它发送大约 98 个字符。然后 PIC18 继续等待另外 2 个字符,但下一次应用程序发送它的 100 个字符长的东西。
这导致应用程序与微控制器不同步,因为第一个字节代表一个命令。我发送的每个字符之间有大约 20 毫秒的延迟,但这并没有解决问题。这不会一直发生,但是当它发生时,一切都会变得混乱。我尝试增加似乎有帮助的时间延迟,但我不希望它太慢。
是什么导致一些数据丢失,我该如何解决?
UART代码和中断
#define CLOCK_FREQ 8000000
#define BAUD_RATE 38400
#define SPBRG_VAL ( ((CLOCK_FREQ/BAUD_RATE)/16) - 1)
void ConsoleInit(void)
{
TRISCbits.TRISC7 = 1;
TRISCbits.TRISC6 = 0;
TXSTA = 0x24;
RCSTA = 0x90; // 0b10010000;
SPBRG = SPBRG_VAL;
}
BYTE ConsoleGet(void)
{
if(RCSTAbits.OERR)
{
RCSTAbits.CREN = 0; // Disable UART receiver
RCSTAbits.CREN = 1; // Enable UART receiver
}
return RCREG;
}
void timerInit (void)
{
// Time Period Achieved : 0.001s
T0CONbits.T08BIT = 0;
T0CONbits.T0CS = 0;
T0CONbits.PSA = 1;
TMR0H = 0xF8;
TMR0L = 0x30;
T0CONbits.TMR0ON = 1;
}
中断例程
if (TMR_IF) {
TMR0H = 0xF8;
TMR0L = 0x30;
if (PIR1bits.RCIF )
{
ProcessMenu(); // In this function I call ConsoleGet() and have switch statment
}
if (INTCONbits.TMR0IE) {
/* there was a timer overflow */
PIR1bits.RCIF = 0;
}
}
谢谢!
【问题讨论】:
-
我在每个字符之间添加了 30 毫秒的时间延迟,目前还没有问题,但是发送 100 个字符需要更长的时间。我需要发送更多大约 1000 条消息,每条消息长度为 100 个字符。这个过程需要30多分钟,非常长。如何在不丢失数据的情况下减少时间延迟?我需要提高波特率吗?
-
我把波特率提高到500k看看会不会更好,没有效果,没有30ms的延时我还是丢数据。我很困惑!
-
请考虑添加 UART 初始化代码,您从 UART 例程接收的中断例程?没有代码,有很多地方可能出错。
-
@Jean-francois:我添加了代码,如果您需要其他任何内容,请告诉我,谢谢!
标签: android bluetooth embedded microcontroller pic