ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
27 ноября
1281127 Топик полностью
IBAH (03.02.2023 14:15, просмотров: 185) ответил maleon на Полученная последовательность байтов есть большая древовидная структура
Во многой мудрости много печали. Умножающий сущности умножает скорбь. У меня все работает без этих проблем. 
//
 if(PaketRX[1]==0x01)
      {
      //вычисление адреса запрашиваемых бит
      unsigned short AdresBit=(((((unsigned short)PaketRX[2])<<8)|(PaketRX[3])));
      //вычисление количества запрашиваемых бит
      unsigned short KolvoBit=((((unsigned short)PaketRX[4])<<8)|(PaketRX[5]));
      
      //если неправильный адрес и количество
      if(KolvoBit>ModBusMaxOutBitTX || KolvoBit==0)
        {//неправильное количество
#if ModBusUseErrMes!=0         
        MesErrRTU(ILLEGAL_DATA_VALUE);
#endif        
        return;
        }     
      if((AdresBit+KolvoBit)>ModBusMaxOutBit)
        {//неправильный адрес
#if ModBusUseErrMes!=0         
        MesErrRTU(ILLEGAL_DATA_ADDRESS);
#endif        
        return;
        }
      
      Prg2ModBusOutBit();//Заполнение регистров Модбас 
      
      //формирование пакета ответа
      //адрес
      ModBusPUT(PaketRX[0]);
      unsigned short TmpCRC=CRCfunc(0xFFFF,PaketRX[0]);
      //код команды    
      ModBusPUT(1);
      TmpCRC=CRCfunc(TmpCRC,1);
      //количество полных байт
      ModBusPUT((KolvoBit+7)>>3);
      TmpCRC=CRCfunc(TmpCRC,((KolvoBit+7)>>3));
      
      //копирование битов в пакет ответа
      unsigned char TxByte=0;//текущий байт
      unsigned char Bit=AdresBit&7;//указатель бит в ModBusOutBit[]
      AdresBit=AdresBit>>3;//указатель байт ModBusOutBit[]
      //копирование из регистра ModBusOutBit[] в пакет
      int i=0;
      while(!0)
        {
        if((ModBusOutBit[AdresBit].byte)&(1<<Bit))
          {
          TxByte=TxByte|(1<<(i&7));
          }
        Bit++;
        if(Bit==8){Bit=0;AdresBit++;}
        i++;
        if((i&7)==0)
          {//скопирован байт
          ModBusPUT(TxByte);
          TmpCRC=CRCfunc(TmpCRC,TxByte);
          TxByte=0;
          if(i==KolvoBit) { break; } else { continue; }
          }
        if(i==KolvoBit) 
          {//скопированы все биты
          ModBusPUT(TxByte);
          TmpCRC=CRCfunc(TmpCRC,TxByte);
          break;
          }
        }
      ModBusPUT(TmpCRC);
      ModBusPUT(TmpCRC>>8);
      return;
      }//