Во многой мудрости много печали. Умножающий сущности умножает
скорбь. У меня все работает без этих проблем.
// 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; }//