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.

[参考译文] 编译器/CC2650:CC2650 UART_Read 在 SimpleBlePeripharal 示例代码中的 UART_WRITE 之后不工作

Guru**** 2587365 points
Other Parts Discussed in Thread: CC2650, BLE-STACK

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/592069/compiler-cc2650-cc2650-uart_read-not-working-after-uart_write-in-simplebleperipharal-sample-code

器件型号:CC2650
Thread 中讨论的其他器件: BLE-STACK

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

您好!

我只是在将 BLE-CC2650与 NRF Connect 应用程序连接后尝试同时读取_CHARCTERSTIC_2 (通知类型)和 WRITE_CHARACTERSTIC_5。 在我们的应用程序中、我们将从一个控制器发送和接收数据到 ble (CC2650)、然后再发送到 app、反之亦然。 但是、我们已经通过 CRO 进行了检查、BLE Rx 引脚正在从控制器获取数据。

我面临的问题:

 使用 UART_Write()函数调用后、UART_ReadCallback 不会出现。

//UART 配置代码片段

空 UART_Configuration ()

uint16_t n;

/*UART 初始化*/
UART_PARAMS_INIT (uartParams);
uartParams.writeDataMode = UART_DATA_BINARY;
uartParams.readDataMode = UART_DATA_BINARY;
uartParams.readMode = UART_MODE_CALLACK;
uartParams.writeMode = UART_MODE_BLOCKING;
//uartParams.readReturnMode = UART_RETURN_FULL;
uartParams.readCallback =&UART_readCallBack;
uartParams.readEcho = UART_ECHO_OFF;
uartParams.baudrate = 9600;

hUART = UART_open (Board_UART、uartParams);
N = UART_READ (hUART、recv_buf、1);

/*UART 读取回调代码片段*/

void UART_readCallBack (UART_Handle handle、void *ptr、size_t size)

uint8_t n;

if (buf_index >= BLEBUFSIZE)

buf_index = 0;

if (recv_buf[0]!='\0')

UART_buf[buf_index++]= recv_buf[0];
memcpy (SendData、UART_buf、BLEBUFSIZE);

N = UART_READ (hUART、recv_buf、1);

如果(n!= 0)

UART_readCancel (hUART);
UART_READ (hUART、recv_buf、1);

在 CCS 中进行调试后、我知道我能够读取通知/指示、然后如果我尝试写入任何5个特性、那么当我们当时尝试读取特征2的指示/通知 UART 读取中断时、我能够写入之后的特性 我不知道我做什么错了。

// GATTPROFILE.c 代码片段

静态 bStatus_t simpleProfile_WriteAttrCB (uint16_t connHandle、gattAttribute_t * pAttr、uint8_t * pValue、uint16_t len、uint16_t offset、uint8_t 方法)

bStatus_t status =成功;
字符 I = 0;

//如果属性权限要求写入授权,则返回错误
if ( gattPermitAuthorWrite( pAttr->权限))

//授权不足
返回(ATT_ERR_INFLOAD_Author);

if (pAttr->type.len == ATT_BT_UUID_SIZE)

// 16位 UUID
uint16 uuid = build_uint16 (pAttr->type.uuuuid[0]、pAttr->type.uuuid[1]);
交换机(uuid)

/*问题 SIMPLEPROFILE_CHAR2_UUID:
如果(status == Success)

void memcpy( pAttr->pValue、pValue、20 );
(* simpleProfileCB)(SIMPLEPROFILE_CHAR2);

中断;*/

案例 GATT_CLIENT_CHAR_CFG_UUID:
状态= GATTServApp_ProcessCCCWriteReq (connHandle、pAttr、pValue、len、
offset、GATT_CLIENT_CFG_Indicate);
if (status == Success)(如果(状态==成功))

uint16 value = build_uint16 (pValue[0]、pValue[1]);
(* simpleProfileCB)((值=GATT_CFG_NO_OPERATION)? SIMPLEPROFILE_CHAR6:DATA_TRANSITE);

中断;

/*问题 SIMPLEPROFILE_CHAR3_UUID:
如果(status == Success)

void memcpy( pAttr->pValue、pValue、5 );
(* simpleProfileCB)(SIMPLEPROFILE_CHAR3);

中断;

Case SIMPLEPROFILE_CHAR4_UUID:
如果(status == Success)

void memcpy( pAttr->pValue、pValue、5 );
(* simpleProfileCB)(SIMPLEPROFILE_CHAR4);

中断;
*
Case SIMPLEPROFILE_CHAR5_UUID:
如果(status == Success)

// void memcpy (pAttr->pValue、pValue、MAX_DATA_LEN);
for (i=0;((i < 50)&&(pValue[i]!='$');i++)

pAttr->pValue[i]= pValue[i];

pAttr->pValue[i]='$';
ConfigLen = I+1;
IndicationFlag = 2;
(* simpleProfileCB)(SIMPLEPROFILE_CHAR5);

中断;

默认值:
//不应该来这里!
状态= ATT_ERR_ATTR_NOT _找到;
中断;


其他

// 128位 UUID
状态= ATT_ERR_INVALID_Handle;

返回(状态);

谢谢

Vidushi

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

    您使用的是哪个版本的 TI BLE-Stack 和 TI-RTOS? 您是否浏览过 TI-RTOS API: software-dl.ti.com/.../_u_a_r_t_8h.html

    您使用的是定制板还是 TI 开发套件?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    也许我在代码片段中没有它,但您在应用程序中的什么位置调用 UART_write()?

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

    您好!

    我们正在使用定制板、我们已从 CRO 中检查数据是否来自 UART 的 Rx 引脚。

    BLE 堆栈 SDK 2_01_01_4467

    RTOS 2_20和2_13

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

    我们在函数 simpleblecharvaluechangeevt char 5和特征6中调用简单的 BLE peri.c 中的 UART 写入、这些是我们为数据传输所做的
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    UART_Write()的代码片段

    静态空 SimpleBLEPeripheral_processCharValueChangeEvt (uint8_t 参数 ID)

    uint8_t BleConfig[50];

    switch (paramID)



    SIMPLEPROFILE_CHAR5案例:
    SimpleProfile_GetParameter (SIMPLEPROFILE_CHAR5、BleConfig);
    //UART_WRITE (hUART、BleConfig、ConfigLen);
    UART_WRITE (hUART、BleConfig、ConfigLen);
    /*IF (RET_UART == UART_ERROR)

    UART_writeCancel (hUART);
    //返回 ret_ptr;
    }*/
    memset (BleConfig、0、50);
    // IndicationFlag = 1;
    中断;

    案例 DATA_Transmit:
    while ((DeviceState = GAPROLE_Connected)&&(IndicationFlag = 1)//&&(SendData[0]!= NULL))

    if (SendData[0]!= NULL)

    if (SendData[0]='&')

    中断;

    其他

    while (SendData[DataLength ]!=空)

    Task_sleep (50000/Clock_tickPeriod);
    EEPROM_Indication (DataLength);
    DataLength = DataLength + MAX_DATA_LEN;
    // Task_sleep (100000/Clock_tickPeriod);
    for (i =(DataLength - MAX_DATA_LEN);(i < DataLength && I >= 0);i++)

    if (SendData[i]='$')

    DataLength = 0;
    memset (SendData、0、BLEBUFSIZE);
    memset (UART_BUF、0、BLEBUFSIZE);
    buf_index = 0;






    中断;


       添加了 BLE- STACK SDK- BLE_cc26xx_2_01_44627、RTOS - tirtos_cc13xx_cc26xx_2_18_00_03和 tirtos_cc13xx_cc26xx_2_20_01_08。

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

    请仅使用一个 TI-RTOS。 对于 BLE-Stack 2.1.1、只有 TI-RTOS 2_13_00_06经验证可与此版本配合使用。
    UART_WRITE()返回的内容是什么,您是否具有有效的句柄? 发送了多少数据?
    3.是否可以确认,如果只_comment out UART_write(),则您的读取回调没有问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Vidushi Jain、

    不能在 UART_Callback 中调用 UART_Read。 您可以使用 SEMI 来唤醒并在 UART_Callback 中调用 UART_Read。

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

    尊敬的 Luu Vy:

    这是我的 UART_readCallback 函数、我没有获得您想要更改的确切内容??

    void UART_readCallBack (UART_Handle handle、void *ptr、size_t size)

    uint8_t n;

    if (buf_index >= BLEBUFSIZE)

    buf_index = 0;

    if (recv_buf[0]!='\0')

    UART_buf[buf_index++]= recv_buf[0];
    memcpy (SendData、UART_buf、BLEBUFSIZE);

    N = UART_READ (hUART、recv_buf、1);

    如果(n!= 0)

    UART_readCancel (hUART);
    UART_READ (hUART、recv_buf、1);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有关在 CC26xx 的 UART 上读取数据的示例代码 
    
    
    void FIOT_UART_Serial_Rx_CB (UART_Handle iHandle、void * OData、size_t count)
    {
    //!*********
    //!将 UART_Rx_Buf 复制到 UART_Tx_Buf
    //!*********
    
    //!*********
    //!将任务唤醒以处理
    //!*********
    Semaphore_post (UART_hSem);
    }
    /*********
    *职能-任务
    /*
    !
    秘书长的报告
    *@fn void FIOT_UART_CreateTask (void)
    *
    *@协议的简短任务创建函数
    *
    @param None
    *
    @return None
    *
    ******** /
    void FIOT UART_CreateTask (void)
    {
    Task_Params TaskParams;
    //!*********
    //!配置任务
    //!*********
    Task_Params_init (&TaskParams);
    TaskParams.stack= UART_TaskStack;
    TaskParams.STACKSIZE= UART_TASK_STACK_SIZE;
    TaskParams.priority= UART_TASK_priority;
    
    Task_con构(&UART_TaskStructure, FIOT_UART_TaskFxn、&TaskParams、NULL);
    }
    /*!
    秘书长的报告
    *@fn void FIOT_UART_InitTask (void)
    *
    *@简要利用 UART 层
    *
    *@param None
    *
    @return None
    *
    ******** /
    void FIOT_UART_InitTask (void)
    {
    //!*********
    //!初始化 UART
    //!*********
    UART_Params uParams;
    
    UART_Params_init (uParams);
    
    uParams.writeDataMode = UART_DATA_binary;
    uParams.readDataMode = UART_DATA_binary;
    uParams.readReturnMode = UART_return_full;
    uParams.readMode = UART_MODE_CALLBACK;
    uParams.readCallback = FIOT_UART_Serial_Rx_CB;
    
    UART_uHandle = UART_OPEN (Board_UART、&uParams);
    //!*********
    //!利用信标
    //!*********
    Semaphore_Params sParams;
    Semaphore_Params_init (&sParams);
    sParams.mode = Semaphore_Mode_binary;
    
    Semaphore_construction (&UART_sSem、0、 sParams);
    UART_hSem = Semaphore_handle (&UART_sSem);
    }
    /*!
    秘书长的报告
    *@fn void FIOT_UART_TaskFxn (UARg a0、UARg A1)
    *
    @协议的简短应用任务入口点。
    *
    *@param a0、A1 -未使用。
    *
    *@无返回
    *
    ******** /
    void FIOT UART_TaskFxn (UArg0、UArg1)
    {
    //!*************
    //!初始化 UART 层
    //!*********
    FIOT_UART_InitTask ();
    //!*********
    //!UART 层的循环
    //!*********
    对于(;;)
    {
    //!*********
    //!refesh 以读取新数据
    //!*********
    UART_READ (UART_uHandle、&UART_Rx、1);
    
    Semaphore_pend (UART_hSem、BIOS_wait_forever);
    //!*********
    //!处理数据
    //!*********
    
    } 

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

    1.我已签入项目设置 CCS 项目只使用一个 TI_RTOS 2.13.0.06。
    在 UART_WRITE 中发送的数据为0到最大20字节、就我所知、我可以通过 UART 发送的字节数没有限制。
    /*
    *==== UART_WRITE ====
    *
    int UART_write (UART_Handle handle、const void * buffer、size_t size)

    return (handle->fxnTablePtr ->writeFxn (handle、buffer、size));

    3、是没有问题、如果我只从 NRF 应用程序读取字符2的指示、那么我也会多次接收回读。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Tom、

    您能不能在字符串5中调用 UART_WRITE 而帮助我吗?回读操作正常。调用 UART_WRITE 函数后、Readcallback 被禁用。

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

    请尝试添加。

    params.writeCallback =空;

    或者、如果您想回电、请尝试查看以下链接是否对您有所帮助。

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

    您好!

    我也不能应对这一变化。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否在调用 UART_write()的位置发布代码? 如果您已使读取回调工作、这是一个好迹象、但该操作应与写入无关。 我想知道这是否是与应用相关的问题、而不是驱动程序。