@@ -607,21 +607,27 @@ int8_t Modbus::query( modbus_t telegram )
607607
608608 au8Buffer[ NB_HI ] = highByte (telegram.u16CoilsNo );
609609 au8Buffer[ NB_LO ] = lowByte ( telegram.u16CoilsNo );
610- au8Buffer[ NB_LO+ 1 ] = u8bytesno;
610+ au8Buffer[ BYTE_CNT ] = u8bytesno;
611611 u8BufferSize = 7 ;
612612
613- u8regsno = u8bytesno = 0 ; // now auxiliary registers
614- for (uint16_t i = 0 ; i < telegram.u16CoilsNo ; i++)
613+ for (uint16_t i = 0 ; i < u8bytesno; i++)
615614 {
616-
617-
615+ if (i%2 )
616+ {
617+ au8Buffer[ u8BufferSize ] = lowByte ( au16regs[ i/2 ] );
618+ }
619+ else
620+ {
621+ au8Buffer[ u8BufferSize ] = highByte ( au16regs[ i/2 ] );
622+ }
623+ u8BufferSize++;
618624 }
619625 break ;
620626
621627 case MB_FC_WRITE_MULTIPLE_REGISTERS:
622628 au8Buffer[ NB_HI ] = highByte (telegram.u16CoilsNo );
623629 au8Buffer[ NB_LO ] = lowByte ( telegram.u16CoilsNo );
624- au8Buffer[ NB_LO+ 1 ] = (uint8_t ) ( telegram.u16CoilsNo * 2 );
630+ au8Buffer[ BYTE_CNT ] = (uint8_t ) ( telegram.u16CoilsNo * 2 );
625631 u8BufferSize = 7 ;
626632
627633 for (uint16_t i=0 ; i< telegram.u16CoilsNo ; i++)
@@ -684,7 +690,7 @@ int8_t Modbus::poll()
684690 // transfer Serial buffer frame to auBuffer
685691 u8lastRec = 0 ;
686692 int8_t i8state = getRxBuffer ();
687- if (i8state < 7 )
693+ if (i8state < 6 ) // 7 was incorrect for functions 1 and 2 the smallest frame could be 6 bytes long
688694 {
689695 u8state = COM_IDLE;
690696 u16errCnt++;
@@ -1149,15 +1155,21 @@ void Modbus::buildException( uint8_t u8exception )
11491155 */
11501156void Modbus::get_FC1 ()
11511157{
1152- uint8_t u8byte, i;
1153- u8byte = 0 ;
1154-
1155- // for (i=0; i< au8Buffer[ 2 ] /2; i++) {
1156- // au16regs[ i ] = word(
1157- // au8Buffer[ u8byte ],
1158- // au8Buffer[ u8byte +1 ]);
1159- // u8byte += 2;
1160- // }
1158+ uint8_t u8byte, i, maxI;
1159+ u8byte = 3 ;
1160+ for (i=0 ; i< au8Buffer[2 ]; i++) {
1161+
1162+ if (i%2 )
1163+ {
1164+ au16regs[i/2 ]= word (au8Buffer[i+u8byte], lowByte (au16regs[i/2 ]));
1165+ }
1166+ else
1167+ {
1168+
1169+ au16regs[i/2 ]= word (highByte (au16regs[i/2 ]), au8Buffer[i+u8byte]);
1170+ }
1171+
1172+ }
11611173}
11621174
11631175/* *
0 commit comments