找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2667|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

從串口發(fā)送數(shù)據(jù)到終端為什么有時(shí)候能接收到數(shù)據(jù)有時(shí)候接收不到?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
我用串口控制終端模塊的燈,發(fā)送121(第一位1代表第一個(gè)模塊,第三位1代表打開(kāi)燈)和120(第三位0代表關(guān)燈),用串口調(diào)試助手發(fā)送到協(xié)調(diào)器,協(xié)調(diào)器發(fā)送到終端,但是發(fā)送一次沒(méi)反應(yīng),需要連續(xù)點(diǎn)擊發(fā)送很多次才有用,不知道原因(與波特率沒(méi)關(guān)系),請(qǐng)大佬們指點(diǎn),下面是代碼:



協(xié)調(diào)器接收數(shù)據(jù)代碼:
static void rxCB(uint8 port,uint8 event)
{
  uint8 uartbuf[3];
  HalUARTRead(0,uartbuf,3);    //從串口讀取三個(gè)字節(jié)的數(shù)據(jù)到uartbuf中
  AF_DataRequest( &GenericApp_DstAddr, &GenericApp_epDesc,
                       GENERICAPP_CLUSTERID,
                       3,    //發(fā)送三個(gè)字節(jié)的數(shù)據(jù)
                       uartbuf,    //發(fā)送的數(shù)據(jù)內(nèi)容,其實(shí)就是從串口收到的3個(gè)字節(jié)的數(shù)據(jù)
                       &GenericApp_TransID,
                       AF_DISCV_ROUTE, AF_DEFAULT_RADIUS );
}

終端代碼:

uint8 buffer[3];
static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )//接受處理函數(shù)
{
   switch ( pkt->clusterId )
   {
    case GENERICAPP_CLUSTERID:
            osal_memcpy(buffer,pkt->cmd.Data,3);
            break;
   }
}
static void GenericApp_LED_Control(void)
{
   if(buffer[0]=='1')  //收到1則模塊1進(jìn)行判斷,收到2則模塊2進(jìn)行判斷
   {
      if((buffer[1] == '2') & (buffer[2] == '1'))//如果收到的是2和1,就點(diǎn)亮led1
      {
          HalLedSet(HAL_LED_1,HAL_LED_MODE_ON);
      }
      if((buffer[1] == '2') & (buffer[2] == '0'))//如果收到的是2和0,就熄滅led1
      {
          HalLedSet(HAL_LED_1,HAL_LED_MODE_OFF);//熄滅led1
      }
   }
}


而如果我把終端程序改成下面這樣就正常了,就會(huì)發(fā)送121立馬亮燈,發(fā)送120立馬熄滅,只不過(guò)我需要增加GenericApp_LED_Control這個(gè)函數(shù),所以我才改成上面那種,希望大佬指點(diǎn)一下原因:
uint8 buffer[3];
static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )//接受處理函數(shù)
{
   switch ( pkt->clusterId )
   {
    case GENERICAPP_CLUSTERID:
            osal_memcpy(buffer,pkt->cmd.Data,3);
            if(buffer[0]=='1')  //收到1則模塊1進(jìn)行判斷,收到2則模塊2進(jìn)行判斷
            {
               if((buffer[1] == '2') & (buffer[2] == '1'))//如果收到的是2和1,就點(diǎn)亮led1
               {
                   HalLedSet(HAL_LED_1,HAL_LED_MODE_ON);
               }
               if((buffer[1] == '2') & (buffer[2] == '0'))//如果收到的是2和0,就熄滅led1
               {
                   HalLedSet(HAL_LED_1,HAL_LED_MODE_OFF);//熄滅led1
               }
            }

            break;
   }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:161164 發(fā)表于 2021-7-18 00:55 | 只看該作者
有可能是osal_memcpy(buffer,pkt->cmd.Data,3);這句會(huì)不斷更新buffer
  1. static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )//接受處理函數(shù)
  2. {
  3.    switch ( pkt->clusterId )
  4.    {
  5.     case GENERICAPP_CLUSTERID:
  6.                         if(pkt->cmd.Data=='1')//先驗(yàn)證資料再處理
  7.                         {
  8.                                 osal_memcpy(buffer,pkt->cmd.Data,3);
  9.                         }
  10.             break;
  11.    }
  12. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

板凳
ID:954161 發(fā)表于 2021-7-18 09:16 | 只看該作者
本帖最后由 njtechlhr 于 2021-7-18 09:18 編輯
lkc8210 發(fā)表于 2021-7-18 00:55
有可能是osal_memcpy(buffer,pkt->cmd.Data,3);這句會(huì)不斷更新buffer

非常感謝lkc8210大佬,我按照您的分析和代碼進(jìn)行了改動(dòng),問(wèn)題得到了解決(但是您的代碼我在編譯的時(shí)候出錯(cuò),因?yàn)閜kt->cmd.Data和‘1’的數(shù)據(jù)類(lèi)型不同不能判斷,下面是我稍作的改動(dòng))。但是有一個(gè)新的問(wèn)題,就是燈的反應(yīng)時(shí)間變長(zhǎng)了,即發(fā)送指令過(guò)去要4秒或者5秒左右(有時(shí)候很快)才能做出反應(yīng)這是為什么呢?

  1. uint8 buffer[3];
  2. static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )//接受處理函數(shù)
  3. {
  4.   uint8 BUFFER[3];
  5.   switch ( pkt->clusterId )
  6.   {
  7.     case GENERICAPP_CLUSTERID:
  8.             osal_memcpy(BUFFER,pkt->cmd.Data,3);
  9.             if(BUFFER[0]=='1')
  10.             {  
  11.             osal_memcpy(buffer,pkt->cmd.Data,3);
  12.             }
  13.             break;

  14.   }
  15. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表