沁恒主机连接安森美从机自动断开发数据收不到(小张同学再来看一下)

我现在用沁恒主机连接安森美从机,连接成功。有两个问题。

  1. 会自动断开。


    icon_jpg.gif8.jpg

    如上图。断开原因8

  2. 发数据从机收不到。



    1.jpg

  3. 代码:


  4. static void centralRssiCB( uint16 connHandle, int8 rssi )

  5. {

  6.   //PRINT( "RSSI : -%d dB \n", -rssi );

  7. attWriteReq_t req;

  8. char i;

  9. ADC_ChannelCfg( 2 ); 

  10. for(i=0;i<20;i++);

  11. abcBuff = TouchKey_ExcutSingleConver(0x01);      

  12. if(abcBuff<168)

  13. {

  14. PRINT( "Key AnXia ! \n");


  15. req.cmd = FALSE;

  16. req.sig = FALSE;

  17. req.handle = centralCharHdl;

  18. req.len = 1;

  19. req.pValue = GATT_bm_alloc(centralConnHandle,ATT_WRITE_REQ,req.len,NULL,0);

  20. if ( req.pValue != NULL )

  21. {

  22. req.pValue[0] = 0x31;

  23. if( GATT_WriteCharValue(centralConnHandle,&req,centralTaskId) == SUCCESS )

  24. {      


  25. PRINT( "Send 31 Ok ! \n");

  26. }

  27. else

  28. {

  29. PRINT( "Send 31 Failed ! \n");

  30. GATT_bm_free((gattMsg_t *)&req, ATT_WRITE_REQ);

  31. }

  32. }  

  33. }

  34. ADC_ChannelCfg( 3 );

  35. for(i=0;i<20;i++);

  36. abcBuff = TouchKey_ExcutSingleConver(0x01);      

  37. if(abcBuff<168)

  38. {

  39. PRINT( "Key AnXia ! \n");


  40. req.cmd = FALSE;

  41. req.sig = FALSE;

  42. req.handle = centralCharHdl;

  43. req.len = 1;

  44. req.pValue = GATT_bm_alloc(centralConnHandle,ATT_WRITE_REQ,req.len,NULL,0);

  45. if ( req.pValue != NULL )

  46. {

  47. req.pValue[0] = 0x33;

  48. if( GATT_WriteCharValue(centralConnHandle,&req,centralTaskId) == SUCCESS )

  49. {      


  50. PRINT( "Send 33 Ok ! \n");

  51. }

  52. else

  53. {

  54. PRINT( "Send 33 Failed ! \n");

  55. GATT_bm_free((gattMsg_t *)&req, ATT_WRITE_REQ);

  56. }

  57. }  

  58. }

  59. }

  60. 我按下板子上的触摸按键就发数据。

  61. 获取的char2的特征值句柄是14,和用CC2541主机获取的一样,应该没错。

    用CC2541发数据,安森美从机可以收到,而沁恒主机发的收不到。

    我不明白为什么?高手支招。谢谢

1,断开 reason=8 ,是超时,

这个根本原因是协议栈在连接参数"timeout" 的时间内没有跟对方进行定时的握手,导致的断开.

通常 一方断电,或者影响到了协议栈的运行的代码(比如大量的软延时,while函数等 )会导致这个问题.


2,对于GATT_WriteCharValue 仅当characteristic 的属性支持write,并且之前一个write的流程完成后才能写成功,

这个写,当从机收到后会发回复的, 主机收到回复后会在centralProcessGATTMsg 的处理函数里产生pMsg->method == ATT_WRITE_RSP的事件,这时候一个写流程才算完成.


3,写操作的时间,跟回复的时间,是跟连接参数有关的,如果connect_interval过长,或者slave_latency 过大,会导致这个流程比较长,

主机端,你可以在centralEventCB 函数中,case GAP_LINK_TERMINATED_EVENT: 来得到连接参数更新时候的值.

    case GAP_LINK_PARAM_UPDATE_EVENT:
      {
            PRINT( "Param Update...\n" );
            PRINT("interval =%d\r\n",pEvent->linkUpdate.connInterval);
            PRINT("connLatency =%d\r\n",pEvent->linkUpdate.connLatency);
            PRINT("connTimeout =%d\r\n",pEvent->linkUpdate.connTimeout);
            PRINT("status =%d\r\n",pEvent->linkUpdate.status);
      }
      break;



2.支持写属性,char2可读可写

谢谢!晚上我再试试


icon_jpg.gif2.jpg

else if ( ( pMsg->method == ATT_WRITE_RSP ) ||

       ( ( pMsg->method == ATT_ERROR_RSP ) &&

         ( pMsg->msg.errorRsp.reqOpcode == ATT_WRITE_REQ ) ) )

  {

    

    if ( pMsg->method == ATT_ERROR_RSP == ATT_ERROR_RSP )

    {

      uint8 status = pMsg->msg.errorRsp.errCode;

      

      PRINT( "Write Error: %x\n", status );

    }

    else

    {

      // After a succesful write, display the value that was written and increment value

      //PRINT( "Write sent: %x\n", centralCharVal);

PRINT( "Write sent: 0x31\n");

    }

    

    centralProcedureInProgress = FALSE;    


  }


收到Write sent: 0x31了,说明写流程完成了。

可是:

case GAP_LINK_PARAM_UPDATE_EVENT:

      {

        

PRINT( "Param Update...\n" );

PRINT("interval =%d\r\n",pEvent->linkUpdate.connInterval);

PRINT("connLatency =%d\r\n",pEvent->linkUpdate.connLatency);

PRINT("connTimeout =%d\r\n",pEvent->linkUpdate.connTimeout);

PRINT("status =%d\r\n",pEvent->linkUpdate.status);

      }

      break;


这个打印信息没打印出来。

不知道为什么。


怎么不回答我的问题?


18951746105 你好,这是张工的微信号,可以加张工微信进行更有效的沟通。


谢谢


wangyy,你能回答我的·问题吗?


张工是我们专门负责蓝牙的工程师,可以给你提供更专业的意见。你有什么问题可以微信跟他沟通。


好的,谢谢


只有登录才能回复,可以选择微信账号登录