找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1980|回复: 2
收起左侧

从串口发送数据到终端为什么有时候能接收到数据有时候接收不到?

[复制链接]
ID:954161 发表于 2021-7-17 19:34 | 显示全部楼层 |阅读模式
我用串口控制终端模块的灯,发送121(第一位1代表第一个模块,第三位1代表打开灯)和120(第三位0代表关灯),用串口调试助手发送到协调器,协调器发送到终端,但是发送一次没反应,需要连续点击发送很多次才有用,不知道原因(与波特率没关系),请大佬们指点,下面是代码: 1.png



协调器接收数据代码:
static void rxCB(uint8 port,uint8 event)
{
  uint8 uartbuf[3];
  HalUARTRead(0,uartbuf,3);    //从串口读取三个字节的数据到uartbuf中
  AF_DataRequest( &GenericApp_DstAddr, &GenericApp_epDesc,
                       GENERICAPP_CLUSTERID,
                       3,    //发送三个字节的数据
                       uartbuf,    //发送的数据内容,其实就是从串口收到的3个字节的数据
                       &GenericApp_TransID,
                       AF_DISCV_ROUTE, AF_DEFAULT_RADIUS );
}

终端代码:

uint8 buffer[3];
static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )//接受处理函数
{
   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进行判断,收到2则模块2进行判断
   {
      if((buffer[1] == '2') & (buffer[2] == '1'))//如果收到的是2和1,就点亮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
      }
   }
}


而如果我把终端程序改成下面这样就正常了,就会发送121立马亮灯,发送120立马熄灭,只不过我需要增加GenericApp_LED_Control这个函数,所以我才改成上面那种,希望大佬指点一下原因:
uint8 buffer[3];
static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )//接受处理函数
{
   switch ( pkt->clusterId )
   {
    case GENERICAPP_CLUSTERID:
            osal_memcpy(buffer,pkt->cmd.Data,3);
            if(buffer[0]=='1')  //收到1则模块1进行判断,收到2则模块2进行判断
            {
               if((buffer[1] == '2') & (buffer[2] == '1'))//如果收到的是2和1,就点亮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;
   }
}

回复

使用道具 举报

ID:161164 发表于 2021-7-18 00:55 | 显示全部楼层
有可能是osal_memcpy(buffer,pkt->cmd.Data,3);這句會不斷更新buffer
  1. static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )//接受处理函数
  2. {
  3.    switch ( pkt->clusterId )
  4.    {
  5.     case GENERICAPP_CLUSTERID:
  6.                         if(pkt->cmd.Data=='1')//先验证资料再处理
  7.                         {
  8.                                 osal_memcpy(buffer,pkt->cmd.Data,3);
  9.                         }
  10.             break;
  11.    }
  12. }
复制代码
回复

使用道具 举报

ID:954161 发表于 2021-7-18 09:16 | 显示全部楼层
本帖最后由 njtechlhr 于 2021-7-18 09:18 编辑
lkc8210 发表于 2021-7-18 00:55
有可能是osal_memcpy(buffer,pkt->cmd.Data,3);這句會不斷更新buffer

非常感谢lkc8210大佬,我按照您的分析和代码进行了改动,问题得到了解决(但是您的代码我在编译的时候出错,因为pkt->cmd.Data和‘1’的数据类型不同不能判断,下面是我稍作的改动)。但是有一个新的问题,就是灯的反应时间变长了,即发送指令过去要4秒或者5秒左右(有时候很快)才能做出反应这是为什么呢?

  1. uint8 buffer[3];
  2. static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )//接受处理函数
  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. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表