gpt4 book ai didi

android - 从蓝牙到 UART 的数据丢失

转载 作者:行者123 更新时间:2023-11-29 17:47:53 25 4
gpt4 key购买 nike

我正在使用 PIC18F87J11RN42 Bluetooth module波特率为 38400。我制作了一个连接到蓝牙模块的安卓应用程序,并将一些数据从我的手机发送到微 Controller 。一切都很好,但我注意到有时我会丢失一些数据。 PIC18 需要大约 100 个字符,如果应用程序发送这 100 个字符没有问题,但有时它会发送大约 98 个字符。然后 PIC18 继续等待 2 个字符,但下一次应用程序发送 100 个字符长的内容。

这会导致应用与微 Controller 不同步,因为第一个字节代表一个命令。我发送的每个字符之间有大约 20 毫秒的延迟,但这并没有解决问题。这不会一直发生,但是当它发生时,一切都会变得一团糟。我尝试增加似乎有帮助的时间延迟,但我不希望它太慢。

是什么导致部分数据丢失,我该如何解决?

串口代码和中断

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

}

}

谢谢!

最佳答案

当接收程序丢失通过 UART 接收的字节时,这通常意味着接收程序没有足够快地为 UART 的接收中断提供服务。 UART 只能容纳有限数量的接收字节,可能只有一个。因此,您的程序必须在 UART 接收到下一个字节之前从 UART 中读取接收到的字节。如果您没有在下一个字节到达之前从 UART 读取字符,那么 UART 将丢弃一个字节,您的程序将丢失它。

如果您使用 ISR 来处理 UART 的接收中断,那么我可以想到您的程序可能无法足够快地处理中断的两个可能原因。一个原因是程序可能会花费太多时间来服务更高优先级的中断。那么较低优先级的 UART 接收中断可能会被延迟太久,并且 UART 将丢弃字节。您是否有执行数毫秒的更高优先级 ISR?

第二个原因是您的程序可能在接收中断本身上花费了太多时间。您的 ISR 调用 ProcessMenu() 似乎很可疑。如果 ProcessMenu() 进行大量处理并且花费的时间超过串行接口(interface)的字符间延迟,那么您的程序将无法足够快地为接收中断提供服务,并且 UART 将丢弃字节。 ProcessMenu() 的最长执行时间是多少?

这些原因是保持 ISR 简短的一般经验法则的两个例子。

如果 ProcessMenu() 确实花费了太长时间,那么修复方法是,不要从 ISR 中调用 ProcessMenu()。 ISR 应该简单地从 UART 读取字节并将其复制到 RAM 中的循环接收缓冲区。这样,ISR 可以非常快速地完成并在 UART 接收到另一个字节之前再次准备就绪。然后,在 ISR 之外,主编程循环应该轮询接收缓冲区并在有可用字节时调用 ProcessMenu()。

关于android - 从蓝牙到 UART 的数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25146172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com