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.

[参考译文] LP-EM-CC2340R5:写入10个字节时、GATT_WriteCharValue 失败。

Guru**** 2589280 points
Other Parts Discussed in Thread: CC2340R5

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1375434/lp-em-cc2340r5-gatt_writecharvalue-fails-when-writing-10-bytes

器件型号:LP-EM-CC2340R5
主题中讨论的其他器件:CC2340R5

工具与软件:

您好!

为什么使用 GATT_WriteCharValue 发送10个字节的数据会导致错误 ISR?

这个代码将10字节数据从中央器件发送至外设。

void Write_doGattWriteCB(char *pdata) //uint8 index
{
    bStatus_t status;

    uint8_t charVals[100] = {0};
//    uint8 index = *pdata;
//    uint8_t charVals[4] = { 0x00, 0x02, 0x55, 0xFF };

    req.handle = 43; // handle characteristic 3

    req.pValue = GATT_bm_alloc(0, ATT_WRITE_REQ, strlen(pdata), NULL);//menuCurrentConnHandle
    req.len = strlen(pdata);

   // req.pValue[0] = (uint8*)pdata;
    memcpy(req.pValue, pdata, req.len);

    req.sig = 0;
    req.cmd = 0;

    status = GATT_WriteCharValue(0, &req, BLEAppUtil_getSelfEntity());
    if ( status != SUCCESS )
    {
        GATT_bm_free((gattMsg_t *)&req, ATT_WRITE_REQ);
        UART2_write(uart, (const char *)"write fail...\r\n", strlen((const char *)"write fail...\r\n"), NULL);
    }
    else
        UART2_write(uart, (const char *)"write ok...\r\n", strlen((const char *)"write ok...\r\n"), NULL);
}

 *  ======== callbackFxn ========
 */
void callbackFxn(UART2_Handle handle, void *buffer, size_t count, void *userArg, int_fast16_t status)
{
    if (status != UART2_STATUS_SUCCESS)
    {
        /* RX error occured in UART2_read() */
        while (1) {}
    }


    numBytesRead = count;
    if(AT_State == 0)
         sem_post(&sem);
}

/*
 *  ======== mainThread ========
 */
void *mainThread(void *arg0)
{
    char input;
    const char echoPrompt[] = "Echoing characters:\r\n";
    UART2_Params uartParams;
    int32_t semStatus;
    uint32_t status = UART2_STATUS_SUCCESS;

    /* Call driver init functions */
    GPIO_init();

    /* Configure the LED pin */
    //GPIO_setConfig(CONFIG_GPIO_LED_0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);

    /* Create semaphore */
    semStatus = sem_init(&sem, 0, 0);

    if (semStatus != 0)
    {
        /* Error creating semaphore */
        while (1) {}
    }

    /* Create a UART in CALLBACK read mode */
    UART2_Params_init(&uartParams);
    uartParams.readMode     = UART2_Mode_CALLBACK;
    uartParams.readCallback = callbackFxn;
    uartParams.baudRate     = 115200;

    uart = UART2_open(CONFIG_DISPLAY_UART, &uartParams);

    if (uart == NULL)
    {
        /* UART2_open() failed */
        while (1) {}
    }

    /* Turn on user LED to indicate successful initialization */
    //GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_ON);

    /* Pass NULL for bytesWritten since it's not used in this example */
    UART2_write(uart, echoPrompt, sizeof(echoPrompt), NULL);

    /* Loop forever echoing */
    while (1)
    {
      switch(AT_State)
      {
          case 0:
              numBytesRead = 0;

              /* Pass NULL for bytesRead since it's not used in this example */
              status = UART2_read(uart, &input, 1, NULL);

              if (status != UART2_STATUS_SUCCESS)
              {
                  /* UART2_read() failed */
                  while (1) {}
              }

              /* Do not write until read callback executes */
              sem_wait(&sem);


              if (numBytesRead > 0)
              {
                  ch_buffer[ch_cnt++] = (uint8_t)input;

                  //AT command process flow.
                  if(strstr((const char *)ch_buffer,(const char *)"\r\n" ) != 0)
                  {
                      if(strcmp((const char *)ch_buffer,(const char *)"AT+CONNECT\r\n") == 0 )
                      {
                          AT_State =  3;
                          UART2_write(uart, (const char *)"\r\nMsg:success:", strlen((const char *)"\r\nMsg:success:"), NULL);
                      }
                      else
                      if(strcmp((const char *)ch_buffer,(const char *)"AT+WRITE\r\n") == 0 )
                      {
                          AT_State =  6;

                          UART2_write(uart, (const char *)"\r\nMsg:success:", strlen((const char *)"\r\nMsg:success:"), NULL);

                      }


                   status = UART2_write(uart, (const char *)ch_buffer, strlen((const char *)ch_buffer), NULL);
                   if (status != UART2_STATUS_SUCCESS)
                   {
                           /* UART2_write() failed */
                        while (1) {}
                   }

                   void *ptr = (void *)ch_buffer;
                   memset(ptr,0,100);
                   ch_cnt = 0;
                 }
              }
           break;

           case 3: //connect device
               UART2_write(uart, (const char *)"connect start...\r\n", strlen((const char *)"connect start...\r\n"), NULL);
               sleep(1);
               BLEAppUtil_invokeFunction(connect_dev, NULL);
               sleep(1);
               AT_State =  0;
           break;

           case 6: //send signal byte.
               //BLEAppUtil_invokeFunction(Write_doGattWriteCB,&send_count);
               BLEAppUtil_invokeFunction(Write_doGattWriteCB,(char*)"Test abc\r\n");
               if(++send_count >= 4)
                   send_count = 0;
               sleep(1);
               AT_State =  0;
           break;



        }


    }
}

//*****************************************************************************
//
// This is the code that gets called when the processor receives a fault
// interrupt.  This simply enters an infinite loop, preserving the system state
// for examination by a debugger.
//
//*****************************************************************************
static void faultISR(void)
{
    /* Enter an infinite loop. */
    while (1) {}
}

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

    您好!

    感谢您联系我们。 您能否共享您使用的 SDK 版本? 我们会查看您的问题、并尽快回复您。

    此致、

    1月

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

    您好、 Jan:

    我的 SDK 为 simplelink_lowpower_f3_sdk_8_10_01_02。 如果我知道如何使用 GATT_WriteCharValue 发送10个字节甚至更多字节、或者有一个示例可供参考、那就太好了。

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

    Anthony、您好!  

    感谢您的确认。 。 basic_ble GATT 客户端是一个值得参考的好示例、它展示了 GATTRead、GATTwrite、GATT_ExchangeMTU、 EnableNotification 和 DisableNotification 。  

    如果您需要进一步的帮助、请告诉我。  

    此致

    Ivan

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

     伊凡、您好!

    根据您提供的信息、我检查了我的代码。 它可以发送多个字节、但如果超过20个字节、仍然存在问题。

    void Write_doGattWriteCB(char *pdata) //uint8 index
    {
        bStatus_t status;
    
    
        #define Send_len 20
    
        //uint8_t charVals[Send_len] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
        uint8_t charVals[Send_len] = {0};
    
        req.handle = 43; // handle characteristic 3
    
        req.pValue = GATT_bm_alloc(0, ATT_WRITE_REQ, Send_len, NULL);//menuCurrentConnHandle
        req.len = Send_len;
    
       // req.pValue[0] = (uint8*)pdata;
        memset(charVals,'Z',Send_len);
        memcpy(req.pValue, charVals, Send_len);
    
        req.sig = 0;
        req.cmd = 0;
    
        status = GATT_WriteCharValue(0, &req, BLEAppUtil_getSelfEntity());
        //status =  GATT_WriteLongCharValue(0, &req, BLEAppUtil_getSelfEntity());
        if ( status != SUCCESS )
        {
            GATT_bm_free((gattMsg_t *)&req, ATT_WRITE_REQ);
            UART2_write(uart, (const char *)"write fail...\r\n", strlen((const char *)"write fail...\r\n"), NULL);
        }
        else
        {
            UART2_write(uart, (const char *)"write ok...\r\n", strlen((const char *)"write ok...\r\n"), NULL);
        }
    }


    此致、

    Anthony

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

    Anthony、您好!  

    只需要几个问题:  

    -编译时会出现什么错误?

    -是否在 GATT 配置文件定义中设置了 charv 的长度?

    CC2340是 GATT 服务器还是 GATT 客户端?   

    MTU 字节大小是多少?  

    此致

    Ivan

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

     伊凡、您好!

    -编译时会出现什么错误?
      编译未显示错误,但从'tatus = GATT_WriteCharValue (0、&req、BLEAppUtil_getSelfEntity());'开始,我发现 GATT_WriteCharValue 未   成功发送。

    -是否在 GATT 配置文件定义中设置了 charv 的长度?
       
     此定义设置在哪里? 我仅通过我编写的代码#define Send_len 30修改了传输长度。
      

        #define Send_len 30
    
        //uint8_t charVals[Send_len] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
        uint8_t charVals[Send_len] = {0};
    
        req.handle = 43; // handle characteristic 3
    
        req.pValue = GATT_bm_alloc(0, ATT_WRITE_REQ, Send_len, NULL);//menuCurrentConnHandle
        req.len = Send_len;
    
       // req.pValue[0] = (uint8*)pdata;
        memset(charVals,'Z',Send_len);
        memcpy(req.pValue, charVals, Send_len);
    
        req.sig = 0;
        req.cmd = 0;
    
        status = GATT_WriteCharValue(0, &req, BLEAppUtil_getSelfEntity());

    是 CC2340 、即 GATT 服务器或 GATT 客户端 ?   
     此 cc2340R5在 GATT 客户端中使用。  

    MTU 字节大小是多少?  
      
    我发现 syscfg 中的"Max size of PDU"是69。 我想知道它是否与 MTU 有关?

    此致、

    Anthony

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

     伊凡、您好!

    我通过使用 GATT_ExchangeMTU 和调整 PDU 大小解决了我的问题。

    此致、

    Anthony