Skip to content

Commit 3804fc1

Browse files
authored
Merge pull request #27 from alejoseb/codes_1_2_15
Function codes 1, 2 and 15 implemented
2 parents ead1b39 + cc98740 commit 3804fc1

File tree

1 file changed

+28
-16
lines changed

1 file changed

+28
-16
lines changed

ModbusRtu.h

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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
*/
11501156
void 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

Comments
 (0)