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.

[参考译文] UART 读取

Guru**** 2538930 points
Other Parts Discussed in Thread: Z-STACK, CC2530

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/570603/uart-read

Thread 中讨论的其他器件:Z-stackCC2530

大家好、我正在使用 z-stack mesh、我想知道在 Generecapp.c 中实现 UART 读取代码的正确位置在哪里?

我希望在数据到达时读取 UART。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以参考 sunmaysky.blogspot.jp/.../how-to-use-two-uart-ports-in-cc2530-z.html 并注册 UART RX 回调函数以进行 UART 接收。 顺便说一下、UART 仅在 CC253x 未处于节能模式时工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您会告诉我分步执行、从 UART 读取需要哪些代码以及如何修改 GenericApp 以从 UART 读取吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果我正确地记得、GenericApp 默认启用 UART、您可以检查 MT_UART.c 以了解详细信息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不想使用 MT 并且我想使用 HalUARTRead() 函数,但是我不知道在 GenericApp.C 中执行此函数的正确位置

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请勿使用 HalUARTRead 接收 UART。 在调用 HalUARTOpen 并在回调函数中接收 UART 消息时、您应该分配一个 UART RX 回调函数。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    那么、实现该函数的序列是什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您只需在应用程序初始化函数中调用 HalUARTOpen、并在同一 C 文件中实现 UART RX 回调函数。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这样我不成功、您 是否会修改我的代码来实现这一目的?


    /*********
     *包括
     *
    #include "OSAL.h"
    #include "stdio.h"
    #include "AF.h"
    #include "ZDUP.h"
    #include "ZDObject.h"
    #include "ZDProfile.h"
    #include "stdio.h"
    #include "GenericApp.h"
    #include "DebugTrace.h"
    #include "mac_low_level.h"
    #include "string.h"

    #if !Defined( WIN32 )|| Defined( ZBIT )
     #include "onboard.h"
    #endif

    /* HAL *//
    #include "hal_lcd.h"
    #include "hal_led.h"
    #include "hal_key.h"
    #include "hal_UART.h"
    #include "hal_adc.h"

    /* RTOS */

    #if defined (IAR_ARMCM3_LM)
    #include "rtos_App.h"
    #endif


    //此列表应填充应用程序特定的群集 ID。
    const CID_t GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS]=

     GENERICAPP_clusterid
    };


    const SimpleDescriptionFormat_t GenericApp_SimpleDesc =

     GENERICAPP_ENPOINT、             // int 端点;
     GENERICAPP_PROFID、               // uint16 AppProfId[2];
     GENERICAPP_DEVICEID、             // uint16 AppDeviceId[2];
     GENERICAPP_DEVICE_VERSION、       // int  AppDevVer:4;
     GENERICAPP_FLAGS、                // int  AppFlags:4;
     GENERICAPP_MAX_CODERSICS、         // byte AppNumInClusters;
     (CID_t *) GenericApp_ClusterList、 // byte *pAppInClusterList;
     GENERICAPP_MAX_CODERSICS、         // byte AppNumInClusters;
     (CID_t *) GenericApp_ClusterList  // byte *pAppInClusterList;
    };

    //这是端点/接口描述。  这里对它进行了定义、但是
    //在 GenericApp_Init()中填充。  另一种方法是填充
    //在这里的结构中将其设置为"const"(在代码空间中)。  。
    //在该示例应用中定义它的方式在 RAM 中定义。
    endPointDesc_t GenericApp_epDesc;


    //配置 UART
    halUARTCfg_t uartConfig;



    /*********
     *局部变量
     *
    字节 GenericApp_TaskID;  //用于内部任务/事件处理的任务 ID
                             //此变量将在何时接收
                             // GenericApp_Init()被调用。

    devstats_t GenericApp_NWKState;

    字节 GenericApp_TransID; //这是唯一的消息 ID (计数器)

    afAddrType_t GenericApp_DstAddr;
    afAddrType_t Tag_DstAddr;
    //收到的消息数
    静态 uint16 rxMsgCount;




    字符 theMessageData[40];



     

    //发送消息之间的时间间隔
    静态 uint32 txMsgDelay = GENERICAPP_SEND_MSG_TIMEOUT;

    /*********
     *本地函数
     *
    静态空 GenericApp_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg );
    静态空 GenericApp_HandleKeys (字节移位、字节键);
    静态空 GenericApp_MessageMSGCB (afIncomingMSGPacket_t *pckt);
    静态空 GenericApp_SendTheMessage( void );
    //static void GenericApp_ReadADC ( void );


    /*********
     *网络层回调
     *

    /*********
     *公共函数
     *

    /*********
     *@fn     GenericApp_Init
     *
     *@  Generic App 任务的简要初始化函数。
     *         这是在初始化期间调用的、应包含
     *         任何特定于应用的初始化(例如硬件
     *         初始化/设置、表初始化、加电
     很         棒的酒店 )。
     *
     *@param  task_id -由 OSAL 分配的 ID。  此 ID 应为
     *                   用于发送消息和设置计时器。
     *
     *@返回 无
     *
    void GenericApp_Init( uint8 task_id )

     GenericApp_TaskID = task_id;
     GenericApp_NWKSTATE = DEV_INIT;
     GenericApp_TransID = 0;
     
     macRadioSetTxPower (10);
     
       /* UART 配置*/
     uartConfig.Configured = true;
     uartConfig.波特 率= HAL_UART_BR_115200;
     uartConfig.FlowControl = false;
     uartConfig.flowControlThreshold = 64;
     uartConfig.Rx.maxBufSize = 128;
     uartConfig.TX.maxBufSize = 128;
     uartConfig.idleTimeout = 6;
     uartConfig.intEnable = true;
     uartConfig.callBackFunc =空;
     HalUARTOpen (HAL_UART_PORT_0、uartConfig);
     
     //HalUARTWrite (HAL_UART_PORT_0、"Hello World!"、12);

     
     

     //GenericApp_ReadADC();
     
     
     //注册 ZDO 初始化
    // ZDO_RegisterForZDOMsg (GenericApp_TaskID、Device_annce);
     

    //器件硬件初始化可以在此处或 main()(Zmain.c)中添加。
    //如果硬件是特定于应用的,请将其添加到此处。
    //如果硬件是设备的其他部分,则将其添加到 main()中。
     
    // GenericApp_DstAddr.addrMode =(afAddrMode_t) AddrNotPresent;
    // GenericApp_DstAddr.endpoint = 0;
    // GenericApp_DstAddr.addr.shortAddr = 0;
     
     
     GenericApp_DstAddr.addrMode = afAddr16位;
     GenericApp_DstAddr.addr.shortAddr = 0x0000;//协调器
     GenericApp_DstAddr.EndPoint = GENERICAPP_ENPOINT;

     
     
     //填写端点描述。
     GenericApp_epDesc.endpoint = GENERICAPP_ENPOINT;
     GenericApp_epDesc.task_id =&GenericApp_TaskID;
     GenericApp_epDesc.simpleDesc
               =(SimpleDescriptionFormat_t *) GenericApp_SimpleDesc;
     GenericApp_epDesc.latencyReq = noLatencyReq;

     
     //向 AF 注册端点描述
     afRegister (GenericApp_epDesc);

     
     //注册所有关键事件-此应用程序将处理所有关键事件
     RegisterForKeys ( GenericApp_TaskID );


     ZDO_RegisterForZDOMsg( GenericApp_TaskID、End_Device_Bind_rsp );
     ZDO_RegisterForZDOMsg( GenericApp_TaskID,match_DESC_rsp );












    /*********
     *@fn     GenericApp_ProcessEvent
     *
     *@简要  介绍通用应用任务事件处理器。  此函数
              调用*以处理任务的所有事件。  事件
     *         包括计时器、消息和任何其他用户定义的事件。
     *
     *@param  task_id - OSAL 分配的任务 ID。
     *@参数  事件-要处理的事件。  这是位图和 CAN
     *                  包含多个事件。
     *
     *@返回 无
     *
    uint16 GenericApp_ProcessEvent( uint8 task_id,uint16事件)

     afIncomingMSGPacket_t * MSGpkt;
     afDataConfirm_t * afDataConfirm;

     //数据确认消息字段
     字节 sentEP;
     ZStatus_t sentStatus;
     字节 sentTransID;      //这应与发送的值匹配
     (void) task_id; //有意未引用的参数

     if (事件和 SYS_EVENT_MSG)
     {
       MSGpkt=(afIncomingMSGPacket_t *) osal_msg_receive (GenericApp_TaskID);
       while (MSGpktt)
       {
         switch ( MSGpkt->HDR.event )
         {
           案例 ZDO_CB_MSG:
             GenericApp_ProcessZDOMsgs((zdoIncomingMsg_t *)MSGpkt);
             中断;
             
             
           大小写键_更改:
             GenericApp_HandleKeys((((keyChange_t *)MSGpkt)-->状态(((keyChange_t *)MSGpkt)-->密钥);
             中断;

           案例 AF_DATA_CONFIRM_CMD:
             //接收此消息是对发送的数据包的确认。
             //状态为 ZStatus_t 类型[在 ZComDef.h]中定义]
             //消息字段在 AF.h 中定义
             afDataConfirm =(afDataConfirm_t *) MSGpkt;

             sentEP = afDataConfirm->ender;
             (空) sentEP; //此信息现在未使用
             sentTransID = afDataConfirm->transID;
             (空) sentTransID; //此信息现在未使用

             sentStatus = afDataConfirm->HDR.status;
             //收到确认时采取的操作。
             if ( sentStatus != ZSuccessess )
             {
               //数据没有传送--做些什么
             }
             中断;

           案例 AF_Incoming_MSG_CMD:
             GenericApp_MessageMSGCB ( MSGpktt );
             中断;

           案例 ZDO_State_change:
             GenericApp_NWkState =(devStates_t)(MSGpkt->HDR.status);
             if ((GenericApp_NWKState =DEV_ZB_COord)||
                  (GenericApp_NWkState =DEV_router)||
                  (GenericApp_NWKState =DEV_END_DEVICE))
             {
               //开始定期发送“该”消息。
               
               OSAL_START_timerEx (GenericApp_TaskID、
                                   GENERICAPP_SEND_MSG_EVT、
                                   txMsgDelay);
             }
             中断;

          默认值:
             中断;
         }

         //释放内存
         OSAL_msg_dealloc((uint8 *)MSGpkt);

         //下一步
         MSGpkt=(afIncomingMSGPacket_t *) osal_msg_receive (GenericApp_TaskID);
       }

       //返回未处理的事件
       返回(事件^ SYS_EVENT_MSG);
     }

     //发送消息输出-此事件由计时器生成
     // (在 GenericApp_Init()中设置)。
     if (事件和 GENERICAPP_SEND_MSG_EVT)
     {
      //发送“该”消息
       //GenericApp_SendTheMessage();
       
       
       
       //GenericApp_ReadADC();

       
       
       
      //设置以再次发送消息
       OSAL_START_timerEx (GenericApp_TaskID、
                           GENERICAPP_SEND_MSG_EVT、
                           txMsgDelay);

       //返回未处理的事件
       返回(事件^ GENERICAPP_SEND_MSG_EVT);
     }

    #if defined (IAR_ARMCM3_LM)
     //接收来自 RTOS 队列的消息
     if (事件和 GENERICAPP_RTOS_MSG_EVT)
     {
       //处理来自 RTOS 队列的消息
       GenericApp_ProcessrtosMessage();

       //返回未处理的事件
       返回(事件^ GENERICAPP_RTOS_MSG_EVT);
     }
    #endif

     //丢弃未知事件
     返回0;


    /*********
     *事件生成函数
     *

    /*********
     *@fn     GenericApp_ProcessZDOMsgs()
     *
     *@  简短的过程响应消息
     *
     *@param  none
     *
     *@返回 无
     *
    静态空 GenericApp_ProcessZDOMsgs( zdoIncomingMsg_t *inMsg )

     
     switch ( inMsg->clusterID )
     {
       Case End_Device_Bind_rsp:
         if ( ZDO_ParseBindRsp( inMsg )=ZSuccessess )
         {
           //光 LED
          // HalLedSet (HAL_LED_3、HAL_LED_MODE_ON);
           
         }
              
         中断;
     }


    /*********
     *@fn     GenericApp_HandleKeys
     *
     *@brief  会处理此设备的所有重要事件。
     *
     *@param  shift -如果在 shift/alt 中、则为 true。
     *@param  keys -密钥事件的位字段。
     *
     *@返回 无
     *
    静态空 GenericApp_HandleKeys (uint8 shift、uint8 key)

     zAddrType_t dstAddr;

       if (键& HAL_KEY_SW_6)
       {
        // HalLedSet (HAL_LED_1、HAL_LED_MODE_ON);

         //为强制端点启动终端设备绑定请求
         dstAddr.addrMode = Addr16Bit;
         dstAddr.addr.shortAddr = 0x0000;//协调器
         ZDP_EndDeviceBindReq (&dstAddr、NLME_GetShortAddr ()、
                               GenericApp_epDesc.endpoint、
                               GENERICAPP_PROFID、
                               GENERICAPP_MAX_CLUSTERSICS、(CID_t *) GenericApp_ClusterList、
                               GENERICAPP_MAX_CLUSTERSICS、(CID_t *) GenericApp_ClusterList、
                               false );

       }
       
       if (keys & HAL_key_sw_7)
       {
         //GenericApp_SendTheMessage();
        // HalLedSet (HAL_LED_1、HAL_LED_MODE_FLASH);
         //NLME_GetShortAddr();
         
       }



    /*********
     *本地函数
     *

    /*********
     *@fn     GenericApp_MessageMSGCB
     *
     *@简短  的数据消息处理器回调。  此函数处理
     *         任何传入数据-可能来自其他设备。  基于
     *         在群集 ID 上,执行预期的操作。
     *
     *@param  none
     *
     *@返回 无
     *

    char * a、b[20];
    int c;
    uint8 lq;
    uint16 e;

    //char y;
    int i=0;
    char buf[10];
    char buf2[10];
    char buf3[10];
    字符 buf4[10];
    char main_buff [40];
    char main_buff 测试[40];
    //A=&b;
    静态空 GenericApp_MessageMSGCB (afIncomingMSGPacket_t *pktt)

     
     
    //inja pkt ra 布置8 biti ya 1 byti mifestim
     //uint8 *ptr =(uint8*)&pkt;
     
     交换机(pkt->clusterid)
     {
       案例 GENERICAPP_clusterid:
         rxMsgCount += 1; //计算此消息
         
           //闪烁 LED
       //in ghesmat rooye UART pktt ra mifresti
       //HalUARTWrite (HAL_UART_PORT_0、PTR、sizeof (afIncomingMSGPacket_t));  
     }
     
     a=(char*) pkt->cmd.Data;
     //b=*a;
     C=pkt->RSSI;
     lq=pkt->LinkQuality;
     e=pkt->srcAddr.addr.shortAddr;
     //y=e;
     

     if (strcmp (a、"ping")=0){
       //strcpy (b、"这是可以的。");
     HalLedSet (HAL_LED_3、HAL_LED_MODE_BLINK);
     
        //HalUARTWrite (HAL_UART_PORT_0、A、4);
        //HalUARTWrite (HAL_UART_PORT_0,模板,10);
        
     
     
        sprintf (buf、"LQi=%d"、LQ);
        sprintf (buf2、"RSSI=%d"、c);
        sprintf (buf3、"sho=%d"、e);
        sprintf (buf4、"data=%d"、a);
        
        
        对于(i=0;i<40;i++)
        {
          if (i<10)
            main_buff [i]=buf[i];
          否则、如果(i>=10&i<20)
            main_buff[i]=buf2[i-10];
          否则、如果(i>=20&i<30)
            MAIN_buff [i]=buf3[I-20];
          否则(i>=30&i<40)
            main_bubuff [i]=buf4[i-30];           
        }
        
        
        
    //    sprintf (MessageData、"%d"、main_buff);
    //    HalUARTWrite (HAL_UART_PORT_0、buf、16);
    //    HalUARTWrite (HAL_UART_PORT_0、buf2、20);
    //    HalUARTWrite (HAL_UART_PORT_0、but3、30);
    //    HalUARTWrite (HAL_UART_PORT_0、buf4、15);
    //    HalUARTWrite (HAL_UART_PORT_0、MAIN_buff、40);  
        
        
         // strcpy (main_buff 测试、main_buff);
        //strcpy (MessageData、main_buff);
        
        
             对于(i=0;i<40;i++)
        {
          MessageData[i]=main_fbuff [i];
        }
        
        GenericApp_SendTheMessage();
          
        


    // 结构 Alireza_Pack1
    // {
    //   int C;
    //////uint8   lq;
    ////  uint16 E;
    // };
     
     //struct Alireza_Pack1 Obj_Pack1;
     //Obj_Pack1.C=c;
     //Obj_Pack.LQ=LQ;
     //Obj_Pack.E=e;
     //INT8 * Ptr2 =(INT8*)&Obj_Pack1;
     // HalUARTWrite (HAL_UART_PORT_0、Ptr2、1);
     // GenericApp_SendTheMessage();
     }
     否则{;}




    /*********
     *@fn     GenericApp_SendTheMessage
     *
     *@简短  发送"消息。
     *
     *
       
     



    静态空 GenericApp_SendTheMessage( void )

     
     //printf (MessageData、"adc=%d"、abbss);
     
     
     if (AF_DataRequest (&GenericApp_DstAddr、&GenericApp_epDesc、
                          GENERICAPP_clusterid、
                          41、
                          (字节*) MessageData (&T)、
                          GenericApp_TransID (GenericApp_TransID)、
                          AF_DISAV_route、
                          AF_DEFAULT_RADIUS )== afStatus_Success )
     {
       //已成功请求发送。
       //HalLedSet (HAL_LED_1、HAL_LED_MODE_BLINK);
       //GenericApp_ReadADC();

     }
     其他
     {
       //请求发送时出错。
      // HalLedSet (HAL_LED_1、HAL_LED_MODE_FLASH);
     }


    //uint16 adc_ain4=0;
    //uint16 abss;
    //uint16级别;
    //uint16 last_level=0;
    //static void GenericApp_ReadADC( void )
    //{
    // HalAdcSetReference (HAL_ADC_REF_125V);
    // adc_ain4=HalAdcRead (HAL_adc_chn_AIN4、HAL_adc_resolution_10);
    // abbss=adc_ain4;
    // if (abbss<300){
    //   HalLedSet (HAL_LED_2、HAL_LED_MODE_OFF);
    //   级别=1;
    // }
    // 否则(abbss>300 && abbss<400)
    // {
    //   HalLedSet (HAL_LED_2、HAL_LED_MODE_ON);
    //   级别=2;  
    // }
    // 否则
    // {
    //   HalLedSet (HAL_LED_2、HAL_LED_MODE_OFF);
    //   级别=3;
    // }
    // if (level!= last_level)
    // {
    //  strcpy (MessageData、"Alirezaa");
    //  GenericApp_SendTheMessage();
    // }
    // last_level=level;
    //}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否在项目编译选项中定义了 ZTOOL_P1和 MT_TASK?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不,我不想使用 MT 和 ztool,我在下面的 genericapp.c 中定义了一个函数:
    如何修改应用程序,使其在收到特定字符串时执行某些操作,例如,当我按"Helloworld"时,LED2打开

    void uart1RxCb (uint8端口,uint8事件)

    // char input[20];
    uint8通道;
    // char z[5];
    // int b = 16;
    (无效)事件;

    while (hal_UART_RxBufLen (port))


    //从 UART 到通道读取一个字节
    HalUARTRead (端口、&ch、1);




    if (ch =hello_world){

    HalLedSet (HAL_LED_2、HAL_LED_MODE_BLINK);



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否能够在 uart1RxCb 中接收到 UART 传入消息?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    噢、不、我如何测试它?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以向 CC2530发送字符串、并检查您是否可以在 RX 回调函数中接收字符串。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、但如何理解收到的字符串?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以在 RX 回调函数中设置一个断点来进行检查。