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.

[参考译文] simpleCentral - UART 实现

Guru**** 2587365 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/596141/simplecentral---uart-implementation

您好!

我正在使用 simpleCentral 进行一些更改、我希望实施 UART、以便与 SIM 模块(SIM808)进行不时的通信、以发送 SMS、因为我需要发送"at"命令并验证答案。 您是否知道是否可以使用常规 UART 实现该功能?  

静态 UART_Handle uart1;
静态 UART_Params uartParams;

。
。
。

/*创建一个数据处理关闭的 UART。 */
uartParams_init (&uartParams);
uartParams.stopbits = UART_stop_1;
uartParams.writeDataMode = UART_DATA_binary;
uartParams.readDataMode = UART_DATA_binary;
uartParams.readReturnMode = UART_ReturnFull;
uartParams.readEcho = UART_ECHO_OFF;
uartParams.波特 率= 9600; //Budrate mais f充足

uart1 = UART_open (Board_UART0、&uartParams);

if (uart1 == NULL){
System_printf ("打开 UART\n"时出错);
} 

如果可能、我需要做什么?

谢谢、

米格尔·维埃拉

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

    UART 驱动程序具有基本的写入和读取 API。

    我假设您只需要实现发送 ASCII "at"命令的 UART_write()调用,然后使用 UART_read()读取"at"响应。

    我将查看 UART 驱动程序文档、甚至 TI-RTOS 或 Simplelink CC2640R2 SDK 中的 UART 回显示例。

    Tom

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

    您好、Tom、

    我使用回显示例测试 UART、并修改了它以向 GSM 模块发送 AT 命令。 当我将代码迁移到具有 BLE 的程序(如 simpleCentral)时,当我尝试执行 UART_write()时,程序会卡住。 我是否应该使用某种器件实现正确的程序功能?

    谢谢、

    Miguel

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此驱动程序具有阻塞和回调模式。 请务必仅从 TI-RTOS 任务上下文调用 UART_write()。 请勿在来自中断的回调处理程序(Hwi 函数)中使用时钟函数(它是 Swi 上下文)。

    此外、您还可以使用 ROV 并查看正在运行的任务。 也许您能够成功地解除阻止一个更高优先级的任务,该任务正在使调用 UART_write()的任务陷于饥饿状态。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Tom、

    因此、即使在阻塞或回调模式下、UART 也应该工作、问题可能是任务同时尝试"工作"、对吧? 您建议什么、我应该使用信标吗?

    谢谢、

    Miguel
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由你决定。 回调模式更复杂、但它允许您在调用 UART_write/read()后继续执行任务。 为了简化操作、如果您现在正在进行原型设计、我建议您进行阻止。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Tom、

    感谢您的回答。 我正在实施 UART、可以通过它发送信息。 我将 UART 引脚配置为用于 RX 的 RF2.8和用于 TX 的 RF2.10 (SmartRF06 EB)、并使用外部器件通过 PC 查看消息、我将看到任何内容、显示为发送"x"字节。 可能还有其他一些引脚? 我已经检查了所有板级配置文件并为我的引脚配置它们。

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

    忘记我之前的回答(2017年5月23日晚上9:58)。 我可以使用配置了我的引脚的 UART 发送数据,问题是当我使用 UART_write()时,发送数据需要很长时间。 您知道原因吗? 我可以做些什么来改变它呢?

    谢谢、
    米格尔·维埃拉
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    将波特率提高到115200左右。 即使如此,UART 也相对较慢,因此您需要注意调用 UART_write()的位置。 我看到有人试图用这个编写调试语句、只是为了破坏他们系统的时序。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我尝试过它、它是相同的。 数据仅在数分钟后到达目标。 可能是缓冲器? 或类似的东西? 我也在使用时钟、时钟是否会影响 UART? 我可以发布我的一些代码。

    谢谢、

    Miguel

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

    主要任务:

    静态空 SimpleBLECentral_taskFxn (UArg a0、UArg A1)
    {
    //初始化应用
    SimpleBLECentral_init ();
    
    //
    应用程序主循环(;)
    {
    //等待与调用线程关联的信号量。
    //请注意、当发出信号时、与线程关联的信号量会发出信号
    //消息在线程的消息接收队列中排队,或在何时排队
    // iCall_signal ()函数被调用到信号量上。
    iCall_errno errno = iCall_Wait (ICALL_TIMEOUT_FOREVAL);
    
    if (errno =ICALL_errno_Success)
    {
    iCall_EntityID dest;
    iCall_ServiceEnum src;
    iCall_HciExtEvt *pMsg =空;
    
    if (iCall_fetchServiceMsg (&src、&dest、
    (void **)&pMsg)=ICALL_errno_Success)
    {
    IF (((src =ICALL_SERVICE_CLASS_BLE)&&(dest =self Entity))
    {
    //处理任务间消息
    SimpleBLECentral_processStackMsg ((iCall_HDR *) pMsg);
    }
    
    if (pMsg)
    {
    iCall_freeMsg (pMsg);
    }
    }
    
    
    //如果 RTOS 队列不为空,则处理应用程序消息
    while (!Queue_empty (appMsgQueue))
    {
    Mix_str *pMsgEvt =(Mix_str *) Util_dequeueMsg (appMsgQueue);
    sbcEvt_t * pMsgEvt1 =(sbcEvt_t *) pMsgEvt;
    //app_msg_t * pMsgApp =(app_msg_t *) pMsgEvt;
    //char_data_t *pCharData =(char_data_t *) pMsgApp->PDU;
    
    IF (pMsgEvt1)
    {
    //Display_Print1 (dispHandle、3、0、"%d"、pMsgEvt1->HDR.event);
    SimpleBLECentral_processAppMsg (pMsgEvt1);
    }
    iCall_free (pMsgEvt);
    }
    
    IF (事件和 SBC_START_DISCOVERY EVT)
    {
    事件&=~SBC_START_DISCOVERY EVT;
    
    SimpleBLECentral_startDiscovery();
    }
    
    Display_print0 (dispHandle、2、0、"主任务");
    
    //semaphore_post (semaphore_handle (&semGSM));
    GSM_Proccess ();
    
    //poweroff();
    }
    

    UART 配置:

    UART_INIT ();
    
    UART_PARAMS_INIT (&uartParams);
    uartParams.stopbits = UART_STOP_ONE;
    uartParams.writeDataMode = UART_DATA_BINARTIN;
    uartParams.readDataMode = UART_DATA_BINART;
    uartParams.readReturnMode = UART_return_full;
    uartParams.readEcho = UART_ECHO_OFF;
    uartParams.波特 率= 9600; //Budrate mais futado - 9600
    
    uart1 = UART_OPEN (Board_UART0、&uartParams);
    
    if (uart1 = NULL){
    System_printf ("打开 UART\n"时出错);
    } 

    使用 UART 的函数:

    静态空 GSM_Proccess (){
    
    int x;
    字符*文本;
    Task_BLOCK (Task_Handle (&sbcTask));
    
    poweron ();
    //Task_sleep (200000 / Clock_tickPeriod); //1000 - 2ms
    _delay_cycles (90000000);
    
    //通过 UART 使用 não μ s ouver mais nada para Fazer envia menagem
    x = UART_WRITE (uart1、"AT+CREG?"、8);
    UART_WRITE (uart1、&CR、sizeof (CR));
    
    } 

    在此版本中、我使用了 task_block、并以这种方式立即发送命令。

    如果您知道更好的解决方案或"解决方案"、请告诉我。

    谢谢、

    Miguel