diff --git a/src/main/fc/fc_msp.c b/src/main/fc/fc_msp.c index 883284b03f..e393674f68 100755 --- a/src/main/fc/fc_msp.c +++ b/src/main/fc/fc_msp.c @@ -186,8 +186,6 @@ typedef enum { #define RATEPROFILE_MASK (1 << 7) -#define JUMBO_FRAME_SIZE_LIMIT 255 - #ifdef USE_SERIAL_4WAY_BLHELI_INTERFACE static void msp4WayIfFn(serialPort_t *serialPort) { diff --git a/src/main/msp/msp_serial.c b/src/main/msp/msp_serial.c index 135eb8545b..b0c80d116f 100644 --- a/src/main/msp/msp_serial.c +++ b/src/main/msp/msp_serial.c @@ -121,13 +121,22 @@ static uint8_t mspSerialChecksumBuf(uint8_t checksum, const uint8_t *data, int l return checksum; } +#define JUMBO_FRAME_SIZE_LIMIT 255 + static void mspSerialEncode(mspPort_t *msp, mspPacket_t *packet) { serialBeginWrite(msp->port); const int len = sbufBytesRemaining(&packet->buf); - const uint8_t hdr[5] = {'$', 'M', packet->result == MSP_RESULT_ERROR ? '!' : '>', len, packet->cmd}; + const int mspLen = len < JUMBO_FRAME_SIZE_LIMIT ? len : JUMBO_FRAME_SIZE_LIMIT; + const uint8_t hdr[5] = {'$', 'M', packet->result == MSP_RESULT_ERROR ? '!' : '>', mspLen, packet->cmd}; serialWriteBuf(msp->port, hdr, sizeof(hdr)); uint8_t checksum = mspSerialChecksumBuf(0, hdr + 3, 2); // checksum starts from len field + if (len >= JUMBO_FRAME_SIZE_LIMIT) { + serialWrite(msp->port, len & 0xff); + checksum ^= len & 0xff; + serialWrite(msp->port, (len >> 8) & 0xff); + checksum ^= (len >> 8) & 0xff; + } if (len > 0) { serialWriteBuf(msp->port, sbufPtr(&packet->buf), len); checksum = mspSerialChecksumBuf(checksum, sbufPtr(&packet->buf), len);