@@ -91,19 +91,33 @@ float JkModbus::get_setup_priority() const {
91
91
// After UART bus
92
92
return setup_priority::BUS - 1 .0f ;
93
93
}
94
- void JkModbus::send (uint8_t address, uint8_t function, uint16_t start_address, uint16_t register_count) {
95
- uint8_t frame[8 ];
96
- frame[0 ] = address;
97
- frame[1 ] = function;
98
- frame[2 ] = start_address >> 8 ;
99
- frame[3 ] = start_address >> 0 ;
100
- frame[4 ] = register_count >> 8 ;
101
- frame[5 ] = register_count >> 0 ;
102
- auto crc = chksum (frame, 6 );
103
- frame[6 ] = crc >> 8 ;
104
- frame[7 ] = crc >> 0 ;
105
-
106
- this ->write_array (frame, 8 );
94
+ void JkModbus::send (uint8_t function, uint8_t address, uint8_t value) {
95
+ uint8_t frame[22 ];
96
+ frame[0 ] = 0x4E ; // start sequence
97
+ frame[1 ] = 0x57 ; // start sequence
98
+ frame[2 ] = 0x00 ; // data length lb
99
+ frame[3 ] = 0x14 ; // data length hb
100
+ frame[4 ] = 0x00 ; // bms terminal number
101
+ frame[5 ] = 0x00 ; // bms terminal number
102
+ frame[6 ] = 0x00 ; // bms terminal number
103
+ frame[7 ] = 0x00 ; // bms terminal number
104
+ frame[8 ] = function; // command word: 0x01 (activation), 0x02 (write), 0x03 (read), 0x05 (password), 0x06 (read all)
105
+ frame[9 ] = 0x02 ; // frame source: 0x00 (bms), 0x01 (bluetooth), 0x02 (gps), 0x03 (computer)
106
+ frame[10 ] = 0x02 ; // frame type: 0x00 (read data), 0x01 (reply frame), 0x02 (BMS active upload)
107
+ frame[11 ] = address; // register: 0x00 (read all registers), 0x8E...0xBF (holding registers)
108
+ frame[12 ] = value; // data
109
+ frame[13 ] = 0x00 ; // record number
110
+ frame[14 ] = 0x00 ; // record number
111
+ frame[15 ] = 0x00 ; // record number
112
+ frame[16 ] = 0x00 ; // record number
113
+ frame[17 ] = 0x68 ; // end sequence
114
+ auto crc = chksum (frame, 17 );
115
+ frame[18 ] = 0x00 ; // crc unused
116
+ frame[19 ] = 0x00 ; // crc unused
117
+ frame[20 ] = crc >> 8 ;
118
+ frame[21 ] = crc >> 0 ;
119
+
120
+ this ->write_array (frame, 22 );
107
121
this ->flush ();
108
122
}
109
123
0 commit comments