This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/CC2541:BLE 在尝试从 UART 接收数据时崩溃

Guru**** 2563550 points
Other Parts Discussed in Thread: CC2541

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/569614/compiler-cc2541-ble-crashes-when-trying-to-receive-data-from-uart

器件型号:CC2541

工具/软件:TI C/C++编译器

您好!

我在 ALT 1位置使用 USART0

当我尝试从 UART 引脚(计算机-> CC2541)接收数据时、遇到问题

当我从 COM 端口连续发送数据时、BLE 能够接收数据、但当我偶尔发送数据时、BLE 崩溃。 我正在通过 COM 端口连续发送数据。

例如:当我在 X 时间从 COM 端口发送数据并在 Y 时间在 BLE 应用上读取数据时、BLE 会崩溃

请建议解决上述问题。

这里是代码片段

//in keyfrom_init()
//为备用1配置 USART0 =>端口 P0 (PERCFG.U0CFG = 0)。
PERCFG =(PERCFG 和~PERCFG_U0CFG)| PERCFG_U0CFG_ALT1;

//为端口0引脚将 USART 0优先于定时器1。
P2DIR &= P2DIR_PRIP0_USART0;

//将引脚2、3和5设置为外设 I/O,将引脚4设置为 GPIO 输出。
P0SEL |= BIT5 | BIT4 | BIT3 | BIT2;

//初始化比特率= 9600波特率
U0BAUD = UART_BAUD_M;
U0GCR =(U0GCR &~U0GCR_BAUD_E)| UART_BAUD_E;

//初始化 UART 协议(起始/停止位、数据位、奇偶校验等):
// USART 模式= UART (U0csr.mode = 1)
U0CSR |= U0csr_mode;

//起始位电平=低=>空闲电平=高电平(U0UCR.START = 0)。
U0UCR &=~U0UCR_START;

//停止位电平=高电平(U0UCR.STOP = 1)。
U0UCR |= U0UCR_STOP;

//停止位数= 1 (U0UCR.SPB = 0)。
U0UCR &=~U0UCR_SPB;

//奇偶校验=禁用(U0UCR.奇 偶校验= 0)。
U0UCR &=~U0UCR_parity;

// 9位数据使能= 8位传输(U0UCR.BIT9 = 0)。
U0UCR &=~U0UCR_BIT9;

//位9的电平= 0 (U0UCR-D9 = 0)、在 U0UCR.BIT9 = 1时使用。
//位9的电平= 1 (U0UCR-D9 = 1)、在 U0UCR.BIT9 = 1时使用。
//奇偶校验=偶数(U0UCR-D9 = 0)、在 U0UCR.奇 偶校验= 1时使用。
//奇偶校验=奇数(U0UCR-D9 = 1)、在 U0UCR.奇 偶校验= 1时使用。
U0UCR &=~U0UCR_D9;

//流控=被禁用(U0UCR.flow = 0)。
U0UCR &=~U0UCR_flow;

//位顺序= LSB 优先(U0GCR.Order = 0)。
U0GCR &=~U0GCR_Order;

//in 周期性函数
//接收 UART 数据
uart0Receive (uartRxBuffer、Size_of_UART_RX_buffer);

//此处为 uart0Receive 函数
void uart0Receive (uint8* uartRxBuf、uint16 uartRxBufLength)
{
uint16 uartRxIndex;

//启用 UART0 RX (U0csr.re = 1)。
U0CSR |= U0csr_re;

//清除任何挂起的 RX 中断请求(设置 U0csr.RX_BYTE = 0)。
U0CSR &=~U0csr_RX_BYTE;

//循环:从 UART0 RX 线接收每个 UART0样本。
对于(uartRxIndex = 0;uartRxIndex < uartRxBufLength;uartRxIndex++)
{
//等待直到接收到数据(U0csr.RX_BYTE = 1)。
while (!(U0CSR 和 U0csr_RX_Byte)));

//读取 UART0 RX 缓冲器。
uartRxBuf[uartRxIndex]= U0DBUF;
}
}

谢谢、此致。

伊德里斯  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    当您说能够连续发送数据时、您是否意味着您立即读取数据。 发生故障的情况与您不能立即读取数据或仅以随机(非连续)时间发送数据的情况之间的区别是什么?

    -弥敦
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Nathan、

    是的,当我发送数据并立即读取数据时,您是对的,此时数据正常工作。 我随机发送它并随机读取 BLE Hanga

    伊德里斯
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我建议使用调试器来查找它在代码中的挂起位置。

    -弥敦
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    当我们处于调试模式时,我们无法将手机连接到 BLE 设备。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    代码实际上是挂起的、还是连接刚刚中断? 您是否仍然能够对器件执行其他操作(例如其他 UART 读取)?

    -弥敦