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.

[参考译文] RTOS/MSP430FR5994:从 SIM800 GPRS 模块接收数据时出现问题

Guru**** 2584275 points
Other Parts Discussed in Thread: MSP-EXP430FR5994, MSP430FR5994

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/610556/rtos-msp430fr5994-problems-receiving-data-from-the-sim800-gprs-module

器件型号:MSP430FR5994
主题中讨论的其他器件: MSP-EXP430FR5994

工具/软件:TI-RTOS

您好!

如果我重置 SIM800模块、我应该得到三个响应。

RDY

+CFUN:1.

+CPIN:SIM 引脚

响应始终以相同的顺序开始和结束:\r\n 或13 10

我使用 DriverLib 编写了一个程序、该程序每10秒复位一次模块、使用 EUSCI_A0等待3个响应、并使用 EUSCI_A3将响应发送到计算机。 此示例已附加、运行完美。

但是、我尝试对 RTOS 执行相同的操作、它的工作时间很短、其余的我接收到错误的字符。

这是 DriverLib 示例的输出:


RDY

+CFUN:1.

+CPIN:SIM 引脚

RDY

+CFUN:1.

+CPIN:SIM 引脚

RDY

+CFUN:1.

+CPIN:SIM 引脚

RDY

+CFUN:1.

+CPIN:SIM 引脚

RDY

+CFUN:1.

+CPIN:SIM 引脚

RDY

+CFUN:1.

+CPIN:SIM 引脚

RDY

+CFUN:1.

+CPIN:SIM 引脚

RDY

+CFUN:1.

+CPIN:SIM 引脚

这是 RTOS 的输出:


RDY

+CFUN:1.

+CPIN:SIM 引脚
*

RDY

+CFUN:1.

+CPIN:SIM 引脚

RDY

+CFUN:1.

+CPIN:SIM 引脚
*

RDY

+CFUN:1.

+CPIN:SIM 引脚
HVHh.U9 1.
°•M%5引脚
*
HVHh.U9 1.
°•M%5引脚

RDY

+CFUN:1.
°•N:SIM PIN
*

RDY

+CFUN:1.
°•N:SIM PIN

UART 具有相同的配置、这两个示例都是相同的。

我希望您能帮我解决这个问题、因为我已经测试了很多天了。

谢谢、此致、

Juan Antonio

e2e.ti.com/.../SIM800_5F00_driverlib_5F00_MSP430FR5994.zipe2e.ti.com/.../SIM800_5F00_RTOS_5F00_MSP430FR5994.zip 

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

    在 MSP 和计算机之间、波特率似乎存在一些问题、您能否检查波特率设置并使用示波器测量波形?

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

    我将使用示波器检查波形、但问题是 EUSCIA0在 RX 线(P2.1)中测量的字符错误。 我知道这一点是因为我之前的程序是基于接收帧并将其与预期响应进行比较以及代码运行良好的次数更少。 此外、我将 GPRS 的 Tx 线路与 Rx 线路(P2.1)以及 USB 转串行转换器连接在一起。 在这种配置下、我可以看到计算机上的终端程序响应良好、以及使用 MSP430 UART 接收时出现错误。

    谢谢、此致、

    Juan Antonio
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我观察到、当我不调试时、该项目始终运行良好。 但是、在调试项目时、我会得到许多错误的字节。 这是程序序列:

    void taskFxn()

    静态 uint8_t gprsStatus = GPRS_RST_BEGIN;

    while (1)

    Semaphore_pend (LogDataSem、10000);

    switch (gprsStatus){
    案例 GPRS_RST_BEGIN:
    indexgprs = n =前壁= 0;
    memset (字节、0、60);

    System_printf ("Init GPRS\n");
    System_printf ("RST begin\n");
    system_flush();

    //重置 GPRS 模块
    ///EUSCI_A_UART_DisableInterrupt (EUSCI_A0_BASE、EUSCI_A_UART_receive_interrupt);//启用中断
    GPIO_setOutputLowOnPin (GPIO_PORT_P4、GPIO_PIN7);
    Semaphore_pend (LogDataSem、200);
    GPIO_setOutputHighOnPin (GPIO_PORT_P4、GPIO_PIN7);
    //semaphore_pend (LogDataSem、BIOS_wait_forever);
    Semaphore_pend (LogDataSem、5000);

    //System_printf ("3个响应已接收\n"\n);
    //RDY
    //+CFUN:1.
    //+CPIN:SIM PIN
    System_printf ("超时结束\n");
    system_flush();

    //I 在终端中写入分隔符
    EUSCI_A_UART_transmitData (EUSCI_A3_base、'*');
    EUSCI_A_UART_transmitData (EUSCI_A3_base、'\r\n');
    EUSCI_A_UART_transmitData (EUSCI_A3_base、'\n');

    //打印响应
    uint8_t i;
    for (i=0;<indexgprs;i++){)
    EUSCI_A_UART_transmitData (EUSCI_A3_base、bytes[i]);

    while (EUSCI_A_UART_queryStatusFlags (EUSCI_A3_base、EUSCI_A_UART_BUSY));

    indexgprs = n =前壁= 0;
    memset (字节、0、60);
    中断;




    void GPRS_ISR ()

    uint8_t caracter;
    uint16_t isrStatus = EUSCI_A_UART_getInterruptStatus (EUSCI_A0_BASE、EUSCI_A_UART_receive_interrupt);
    EUSCI_A_UART_clearInterrupt (EUSCI_A0_BASE、EUSCI_A_UART_receive_interrupt);

    if (isrStatus & EUSCI_A_UART_receive_interrupt){
    Caracter = EUSCI_A_UART_receiveData (EUSCI_A0_BASE);
    //将接收到的字符回显到计算机
    EUSCI_A_UART_transmitData (EUSCI_A3_base、caracter);
    bytes[indexgprs]=字符;
    indexgprs++;



    如您所见、当 GPRS 模块在相应引脚复位后发送字节时、我不使用 System_print 和 System_flush 这两个句子。

    是否知道在调试时 UART 读取错误字节的原因?

    谢谢、此致、

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

    您似乎接近根本原因。 :)在您说调试时,您能描述更多详细信息吗,比如您在哪里设置断点? 对于 STEP RUN,UART 通信可能在接收到几个字节后中断,例如,在定时器中断中停止。

    在 UARTA0 ISR 中向 UARTA3发送字节的代码建议在 UARTA0 ISA 中设置一个标志、并在 UARTA0 ISR 之外运行 UARTA3。

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

    如果没有在代码中设置任何断点、我就会遇到问题。 我已在 EUSCIA0 ISR 中添加了发送接收到的字节这句话、问题仍然存在。

    谢谢、此致、

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

    您好!

    我无法解决问题。

    cfg 文件中是否有调试程序所需的最低配置?

    我附上项目中使用的模块的屏幕截图。

    谢谢、此致、

    Juan Antonio

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

    以下几点:
    System_flush 使 System_printf 数据进入由 CCS 读取的 CIO 缓冲器。 要读取 CIO 缓冲器、CCS 实际上会停止目标、读取 CIO 缓冲器并恢复目标。 这可能会造成实时影响。 是否可以在不使用 System_flush 的情况下尝试 TI-RTOS 应用程序。 您可以通过 Tools->ROV->SysMin -> OutputBuffer 查看数据。 不过、您需要暂停目标才能读取该值。

    2.为什么您不是只在 TI-RTOS 中使用 UART 驱动程序。 它可以简化您的代码。

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

    当微控制器从 UART 接收数据时、我不调用 System_printf 和 System_flush。 我知道在这种情况下、这不应该是问题。 但是、我将在后续步骤中使用 ROV 工具。 感谢您的推荐。 我使用此工具是因为我观看了 RTOS 培训视频。

    我正在等待以/r/n.开头和结尾的回复 我可以很简单地使用 ISR、并测试前面的字符是否为/r、实际字符是否为/n、并将响应存储在环形缓冲区中。

    我知道、使用 UART 驱动器、我可以读取特定数量的字节。 您能否建议我使用 UART 驱动程序来解决此问题的通用结构?

    谢谢、此致、

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

    您好!

    在今天测试了很多东西之后、我还无法解决这个问题。 希望您能帮助我。

    我编写了一个简单函数、用于使用 EUSCI_A1将帧发送到计算机。 然后、我可以执行以下操作:

    WASE_DebugString ("GPRS 的 INIT UART 错误");

    我 可以在计算机上看到项目的输出。

    我正在使用计算机上的终端模拟 GPRS。

    硬件配置1:

    我正在使用以下典型转换器 :www.alibaba.com/.../FTDI-TTL-232R-3V3-USB-TTL_60565269561.html

    卸下 J101连接器上的 TXD 跳线

    需要在 P2.5 (EUSCI_A1 Tx)和 TXD 跳线(在 FET 侧且靠近 J101文本)之间连接一根导线。 这用于使用上述功能将字符串打印到计算机。

    将 USB 串行转换器的 GND 线与 GND 板相连

    卸下 J101连接器上的 RxD 跳线。

    使用 P2.1连接 USB 串行转换器的 Tx 线路(RxD 跳线靠近>>文本)。 我还在这条线上连接了示波器。

    软件配置1:

    在配置为9600 bps 的计算机上打开两个终端。 一个用于模拟 GPRS 模块、它与计算机上的 USB 串行转换器仿真端口相关联。 另一个用于侦听 WASE_DebugString 调用、它与 MSP-EXP430FR5994板计算机上的仿真端口相关联。

    您可以在右侧终端(与 MSP 板的仿真端口连接)上看到起始消息。 一旦您看到字符串"try"、请使用另一个终端(我在屏幕左侧的情况下)发送 GPRS 模块的3个模拟响应:

    \r\n\r\n RDY\r\n

    \r\n+CFUN:1\r\n

    \r\n +CPIN:SIM PIN\r\n

    5秒后、您应该会在右端子上看到3个响应、因为任务有一个挂起调用5 s。这是输出:

    正如您在屏幕截图中看到的、我没有使用 CCS 调试工程、工程按预期工作。 它可以在没有任何错误的情况下进行多次测试。 但是、这是按下"播放"按钮时的日志(未设置断点):

    第1个 ok、第2个 ok、第3个只收到2个回复、第5个没有回复等

    当然、可以在不使用额外的 USB 转换器且只有一个端子的情况下测试该项目。

    硬件和软件配置2.

    卸下 J101连接器上的 TXD 跳线

    需要在 P2.5 (EUSCI_A1 Tx)和 TXD 跳线(在 FET 侧且靠近 J101文本)之间连接一根导线。 这用于使用上述功能将字符串打印到计算机。

    放置 RxD 跳线并将示波器连接到此跳线上。 我使用两根导线作为跳线、并使用一根额外的导线连接示波器。  

    打开配置为9600 bps 的计算机上的终端。 它用于模拟 GPRS 模块并侦听 WASE_DebugString 调用、它与 MSP-EXP430FR5994板计算机上的仿真端口相关联。

    想法是一样的:等待"尝试消息"、发送模拟 GPRS 的3个响应、并等待5秒钟以查看 MSP430FR5994接收到的响应。

    在任何调试模式下、它都能正常工作。 但是、可以观察到示波器信号比预期的长:1/9600*10位*37字节(3个响应)= 38、54ms、它有40ms。

    这是调试模式下的输出:

    正如您看到的、它也在调试模式下工作(再次只显示"Play"按钮、无断点)、但示波器信号非常奇怪。

    如果我按下 PAUSE DEBUG 并发送帧、这是示波器捕获。 终端上有错误、因为我在收到尝试消息后没有多次按发送按钮。

    最后、这是调试模式的屏幕截图、其中实际 GPRS 连接时、接收字符时出现许多错误。 示波器仅显示最后一个响应:\r\n+CPIN:SIM PIN\r\n

    在任何调试模式下、工程都不会出现任何错误。 示波器再次显示了最后一个响应。

    这是一个项目:

    e2e.ti.com/.../WISE_5F00_GPRS.zip

    非常感谢、此致、

    Juan Antonio

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

    您好、Juan、

    这似乎很明显、但您是否尝试禁用超低功耗调试模式?

    只需转到您的项目属性并在低功耗模式设置下禁用它:  

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

    非常感谢! 现在它起作用了。

    在我用作模板的项目中检查了此选项、在 macOS 中很难看到此选项、因为下面有更多选项、并且滚动条处于隐藏状态。