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.

[参考译文] CC2651R3:通过 UART 通信轮询问题

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

https://e2e.ti.com/support/wireless-connectivity/other-wireless-group/other-wireless/f/other-wireless-technologies-forum/1435128/cc2651r3-polling-issue-via-uart-communication

器件型号:CC2651R3

工具与软件:

您好、先生、

当我以1秒的轮询间隔通过 Modbus 轮询 CC2651R3器件的配置时、它正常工作。 但是、当我尝试使用相同的 Modbus 轮询配置(间隔为1秒)通过射频通信轮询不同的 CC2651R3器件时、它无法正常工作。 有趣的是、如果我将轮询间隔增加到2秒、则通信正常工作。 什么原因可能导致该问题?

此致、

Reshmi。

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

    您好、Reshmi:

    我希望你做得好。 器件使用哪些 SDK、这是定制电路板还是 LaunchPad、您使用的是什么通信(PHY)?

    谢谢!
    Alex F

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

    您好、Alex、

    我使用的是定制 CC2651R3电路板、而 SimpleLink CC13xx/CC26xx SDK 版本为7.10.01.24。 请查看我使用的附加 PHY 属性。

    谢谢!

    Reshmi。

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

    您好、Reshmi:

    感谢您发送编修。 我不太确定我们目前对 Modbus 的支持;然而,如果我们只想看 RCL 或无线电发送/接收数据包,那么我们应该能够在这里持续接收数据包(使用1秒"轮询")。 您可以展示您的无线电代码的一个小片段(应该类似或基于我们在 SDK 中提供的 rfpacketTx 和 rfpacketRx 示例)吗。

    谢谢!
    Alex F

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

    您好、Alex、

    我以 rfUARTBridge 的示例代码 为例、 请在下面找到无线电代码

    void * mainThread (void * arg0){

      packetRxCb = no_packet;

       rf_Params rfParams;
       rf_params_init (&rfParams);

       if (RFQueue_defineQueue (&dataQueue、
                                   rxDataEntryBuffer、
                                   sizeof (rxDataEntryBuffer)、
                                   NUM_DATA_ENTRIES、
                                   max_length + NUM_APPLATED_BYTES)
       {
           /*无法为所有数据条目分配空间*/
           while (1);
       }

       /*修改设置以便能够执行 RX*/
       /*为接收到的数据设置数据实体队列*/
       RF_cmdPropRx.pQueue =&dataQueue;
       /*丢弃 Rx 队列中忽略的数据包*/
       rf_cmdPropRx.rxConf.bAutoFlushIgnored = 1;
       /*从 Rx 队列中丢弃有 CRC 错误的数据包*/
       rf_cmdPropRx.rxConf.bAutoFlushCrcErr = 1;
       /*实施数据包长度过滤以避免 PROP_ERROR_RXBUF */
       RF_cmdPropRx.maxPktLen = MAX_LENGTH;
       RF_cmdPropRx.pktConf.bRepeatOk = 1;
       RF_cmdPropRx.pktConf.bRepeatNok = 1;

       rf_cmdPropTx.pPKt =数据包;
       RF_cmdPropTx.startTriggerType = trig_now;

       /*请求访问对讲机*/
       rfHandle = rf_open (&rfObject、&rf_prop、(RF_RadioSetup*)&RF_cmdPropRadioDivSetup、&R rfParams);

       /*设置频率*/
       RF_postCmd (rfHandle、(RF_Op*)&RF_cmdfs、RF_PriorityNormal、NULL、0);

       rfPostHandle = RF_postCmd (rfHandle、(RF_Op*)&RF_cmdPropRx、RF_PriorityNormal、&ReceivedOnRFcallback、RF_EventRxEntryDone);

     while (1){

     //我的应用程序代码

     }

    }

    void ReceivedOnRFcallback (RF_Handle h、RF_CmdHandle ch、RF_EventMask e)

       if (e & RF_EventRxEntryDone)
       {
           /*获取当前未处理的数据条目*/
           currentDataEntry = RFQueue_getDataEntry ();//从条目加载数据

           /*处理 数据、位于&currentDataEntry->data:
            *-长度是当前配置的第一个字节
            *-数据从第二个字节开始*/
           长度     =*(uint8_t*)(&currentDataEntry->data);//获取 长度(使用发送)
           DataPointer =(uint8_t*)(&currentDataEntry->data + 1);//data 从第二个字节开始

           /*将有效负载+状态字节复制到 变量*/
           memcpy (testbuff、DataPointer、(长度+ 1));
           totalBytes =长度;

           /*将读取条目指针移动到下一个条目*/
           RFQueue_nextEntry();
            RXCb = packet_received;
       }
    }

    谢谢!

    Reshmi。

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

    您好、Reshmi:

    从初始看来、您的代码看上去一切正常、但接下来我不确定是否使用示例代码!  

    谢谢!
    Alex F

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

    您好、Reshmi:

    您的代码还在 rfPostHandle 行后包含如下代码行正确吗?

        while(1)
        {
            /* Check if anything has been received via RF*/
            if(packetRxCb)
            {
                memcpy(input, packet, (packetLength));
                size_t bytesWritten = 0;
                while (bytesWritten == 0)
                {
                    status = UART2_write(uart, &input, packetLength, &bytesWritten);
                    if (status != UART2_STATUS_SUCCESS)
                    {
                        /* UART2_write() failed */
                        while (1);
                    }
                }
    
                /* Reset RF RX callback flag */
                packetRxCb = NO_PACKET;
            }
    
            /* Check if anything has been received via UART*/
            if (bytesReadCount != 0)
            {
                /*The packet length is set to the number of
                 * bytes read by UART2_read() */
                RF_cmdPropTx.pktLen = bytesReadCount;
                int i;
                for (i=0; i<bytesReadCount; i++)
                {
                    uint8_t* buffer8 = (uint8_t*) input;
                    packet[i] = buffer8[i];
                }
    
                /*Cancel the ongoing command*/
                RF_cancelCmd(rfHandle, rfPostHandle, 1);
    
                /*Send packet*/
                RF_runCmd(rfHandle, (RF_Op*)&RF_cmdPropTx, RF_PriorityNormal, NULL, 0);
    
                /* Toggle green led to indicate TX */
                GPIO_toggle(CONFIG_GPIO_GLED);
    
                /* Resume RF RX */
                rfPostHandle = RF_postCmd(rfHandle, (RF_Op*)&RF_cmdPropRx,
                                                                     RF_PriorityNormal, &ReceivedOnRFcallback,
                                                                     RF_EventRxEntryDone);
                bytesReadCount = 0;
    
                /* Resume UART read */
                status = UART2_read(uart, &input, bytesToRead, NULL);
            }
        }
    }

    谢谢!
    Alex F