From fbfbf189c10fbe34c813f9ff2eaeb31d97d53c8e Mon Sep 17 00:00:00 2001 From: ligenxxxx <59721724+ligenxxxx@users.noreply.github.com> Date: Wed, 16 Dec 2020 11:47:12 +0800 Subject: [PATCH 1/7] fixed problem msp send error when serial port buffer full --- src/main/msp/msp_serial.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/msp/msp_serial.c b/src/main/msp/msp_serial.c index 64f13f00b9..961e041822 100644 --- a/src/main/msp/msp_serial.c +++ b/src/main/msp/msp_serial.c @@ -312,6 +312,7 @@ static int mspSerialEncode(mspPort_t *msp, mspPacket_t *packet, mspVersion_e msp uint8_t checksum; int hdrLen = 3; int crcLen = 0; + int ret = 0; #define V1_CHECKSUM_STARTPOS 3 if (mspVersion == MSP_V1) { @@ -388,7 +389,10 @@ static int mspSerialEncode(mspPort_t *msp, mspPacket_t *packet, mspVersion_e msp } // Send the frame - return mspSerialSendFrame(msp, hdrBuf, hdrLen, sbufPtr(&packet->buf), dataLen, crcBuf, crcLen); + // If it fails, resend until success + while (ret==0) + ret = mspSerialSendFrame(msp, hdrBuf, hdrLen, sbufPtr(&packet->buf), dataLen, crcBuf, crcLen); + return ret; } static mspPostProcessFnPtr mspSerialProcessReceivedCommand(mspPort_t *msp, mspProcessCommandFnPtr mspProcessCommandFn) From abc9f868b13773eb95f78b7033e33d3cf514ef37 Mon Sep 17 00:00:00 2001 From: ligenxxxx <59721724+ligenxxxx@users.noreply.github.com> Date: Fri, 18 Dec 2020 11:06:47 +0800 Subject: [PATCH 2/7] Optimized the buffer full solution --- src/main/msp/msp_serial.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/msp/msp_serial.c b/src/main/msp/msp_serial.c index 961e041822..1cf8b6c26a 100644 --- a/src/main/msp/msp_serial.c +++ b/src/main/msp/msp_serial.c @@ -40,6 +40,8 @@ #include "msp_serial.h" +#include "drivers/time.h" + static mspPort_t mspPorts[MAX_MSP_PORT_COUNT]; static void resetMspPort(mspPort_t *mspPortToReset, serialPort_t *serialPort, bool sharedWithTelemetry) @@ -289,8 +291,10 @@ static int mspSerialSendFrame(mspPort_t *msp, const uint8_t * hdr, int hdrLen, c // this allows us to transmit jumbo frames bigger than TX buffer (serialWriteBuf will block, but for jumbo frames we don't care) // b) Response fits into TX buffer const int totalFrameLength = hdrLen + dataLen + crcLen; + const int perByteCostUs = (1000000 / (msp->port->baudRate / 10)); if (!isSerialTransmitBufferEmpty(msp->port) && ((int)serialTxBytesFree(msp->port) < totalFrameLength)) { - return 0; + //Currently TxBuffer free space is not enough, Wait for TxBuffer empty + delayMicroseconds((int)serialTxBytesFree(msp->port) * perByteCostUs); } // Transmit frame @@ -312,7 +316,6 @@ static int mspSerialEncode(mspPort_t *msp, mspPacket_t *packet, mspVersion_e msp uint8_t checksum; int hdrLen = 3; int crcLen = 0; - int ret = 0; #define V1_CHECKSUM_STARTPOS 3 if (mspVersion == MSP_V1) { @@ -389,10 +392,7 @@ static int mspSerialEncode(mspPort_t *msp, mspPacket_t *packet, mspVersion_e msp } // Send the frame - // If it fails, resend until success - while (ret==0) - ret = mspSerialSendFrame(msp, hdrBuf, hdrLen, sbufPtr(&packet->buf), dataLen, crcBuf, crcLen); - return ret; + return mspSerialSendFrame(msp, hdrBuf, hdrLen, sbufPtr(&packet->buf), dataLen, crcBuf, crcLen); } static mspPostProcessFnPtr mspSerialProcessReceivedCommand(mspPort_t *msp, mspProcessCommandFnPtr mspProcessCommandFn) From 00f73a6e0b7277d879a3b8cf46368e05ca328878 Mon Sep 17 00:00:00 2001 From: ligenxxxx <59721724+ligenxxxx@users.noreply.github.com> Date: Thu, 24 Dec 2020 11:20:41 +0800 Subject: [PATCH 3/7] only delay when define USE_MSP_DISPLAYPORT --- src/main/msp/msp_serial.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/msp/msp_serial.c b/src/main/msp/msp_serial.c index 1cf8b6c26a..62bae07dcf 100644 --- a/src/main/msp/msp_serial.c +++ b/src/main/msp/msp_serial.c @@ -291,10 +291,13 @@ static int mspSerialSendFrame(mspPort_t *msp, const uint8_t * hdr, int hdrLen, c // this allows us to transmit jumbo frames bigger than TX buffer (serialWriteBuf will block, but for jumbo frames we don't care) // b) Response fits into TX buffer const int totalFrameLength = hdrLen + dataLen + crcLen; - const int perByteCostUs = (1000000 / (msp->port->baudRate / 10)); if (!isSerialTransmitBufferEmpty(msp->port) && ((int)serialTxBytesFree(msp->port) < totalFrameLength)) { +#ifdef USE_MSP_DISPLAYPORT //Currently TxBuffer free space is not enough, Wait for TxBuffer empty + const int perByteCostUs = (1000000 / (msp->port->baudRate / 10)); delayMicroseconds((int)serialTxBytesFree(msp->port) * perByteCostUs); +#else + return 0; } // Transmit frame From 076732248e47c36793c9fa1e8e98ac573ca9ab8e Mon Sep 17 00:00:00 2001 From: ligenxxxx <59721724+ligenxxxx@users.noreply.github.com> Date: Thu, 24 Dec 2020 11:33:30 +0800 Subject: [PATCH 4/7] Update msp_serial.c --- src/main/msp/msp_serial.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/msp/msp_serial.c b/src/main/msp/msp_serial.c index 62bae07dcf..bbcb867df4 100644 --- a/src/main/msp/msp_serial.c +++ b/src/main/msp/msp_serial.c @@ -298,6 +298,7 @@ static int mspSerialSendFrame(mspPort_t *msp, const uint8_t * hdr, int hdrLen, c delayMicroseconds((int)serialTxBytesFree(msp->port) * perByteCostUs); #else return 0; +#endif } // Transmit frame From a5cd9ea7c317d238b6e925555df643917d9336e7 Mon Sep 17 00:00:00 2001 From: ligenxxxx <59721724+ligenxxxx@users.noreply.github.com> Date: Thu, 24 Dec 2020 19:15:14 +0800 Subject: [PATCH 5/7] Modified UART_TX_BUFFER_SIZE for USE_MSP_DISPLAYPORT I did a test and added a lot of osd elements (basically all osd elements I can add, excluding GPS and ESC elements), and even some have overlapped. In this case, there is no problem at all. TxBufferSize is set to 1024. It is sufficient for normal conditions. --- src/main/drivers/serial_uart_impl.h | 12 ++++++------ src/main/msp/msp_serial.c | 8 -------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/src/main/drivers/serial_uart_impl.h b/src/main/drivers/serial_uart_impl.h index bd11aa96b2..a5ecee7f23 100644 --- a/src/main/drivers/serial_uart_impl.h +++ b/src/main/drivers/serial_uart_impl.h @@ -29,7 +29,7 @@ #define UART_RX_BUFFER_SIZE 128 #endif #ifndef UART_TX_BUFFER_SIZE -#define UART_TX_BUFFER_SIZE 256 +#define UART_TX_BUFFER_SIZE 1024 #endif #elif defined(STM32F3) #define UARTDEV_COUNT_MAX 5 @@ -38,7 +38,7 @@ #define UART_RX_BUFFER_SIZE 128 #endif #ifndef UART_TX_BUFFER_SIZE -#define UART_TX_BUFFER_SIZE 256 +#define UART_TX_BUFFER_SIZE 1024 #endif #elif defined(STM32F4) #define UARTDEV_COUNT_MAX 6 @@ -47,7 +47,7 @@ #define UART_RX_BUFFER_SIZE 128 #endif #ifndef UART_TX_BUFFER_SIZE -#define UART_TX_BUFFER_SIZE 256 +#define UART_TX_BUFFER_SIZE 1024 #endif #elif defined(STM32F7) #define UARTDEV_COUNT_MAX 8 @@ -56,7 +56,7 @@ #define UART_RX_BUFFER_SIZE 128 #endif #ifndef UART_TX_BUFFER_SIZE -#define UART_TX_BUFFER_SIZE 256 +#define UART_TX_BUFFER_SIZE 1024 #endif #elif defined(STM32H7) #define UARTDEV_COUNT_MAX 8 @@ -65,7 +65,7 @@ #define UART_RX_BUFFER_SIZE 128 #endif #ifndef UART_TX_BUFFER_SIZE -#define UART_TX_BUFFER_SIZE 256 +#define UART_TX_BUFFER_SIZE 1024 #endif #elif defined(STM32G4) #define UARTDEV_COUNT_MAX 9 // UART1~5 + UART9 (Implemented with LPUART1) @@ -74,7 +74,7 @@ #define UART_RX_BUFFER_SIZE 128 #endif #ifndef UART_TX_BUFFER_SIZE -#define UART_TX_BUFFER_SIZE 256 +#define UART_TX_BUFFER_SIZE 1024 #endif #else #error unknown MCU family diff --git a/src/main/msp/msp_serial.c b/src/main/msp/msp_serial.c index bbcb867df4..64f13f00b9 100644 --- a/src/main/msp/msp_serial.c +++ b/src/main/msp/msp_serial.c @@ -40,8 +40,6 @@ #include "msp_serial.h" -#include "drivers/time.h" - static mspPort_t mspPorts[MAX_MSP_PORT_COUNT]; static void resetMspPort(mspPort_t *mspPortToReset, serialPort_t *serialPort, bool sharedWithTelemetry) @@ -292,13 +290,7 @@ static int mspSerialSendFrame(mspPort_t *msp, const uint8_t * hdr, int hdrLen, c // b) Response fits into TX buffer const int totalFrameLength = hdrLen + dataLen + crcLen; if (!isSerialTransmitBufferEmpty(msp->port) && ((int)serialTxBytesFree(msp->port) < totalFrameLength)) { -#ifdef USE_MSP_DISPLAYPORT - //Currently TxBuffer free space is not enough, Wait for TxBuffer empty - const int perByteCostUs = (1000000 / (msp->port->baudRate / 10)); - delayMicroseconds((int)serialTxBytesFree(msp->port) * perByteCostUs); -#else return 0; -#endif } // Transmit frame From fd15177fdb0293958aad2138141e14e3b91fe617 Mon Sep 17 00:00:00 2001 From: ligenxxxx <59721724+ligenxxxx@users.noreply.github.com> Date: Thu, 31 Dec 2020 12:17:32 +0800 Subject: [PATCH 6/7] Resize ````UART_TX_BUFFER_SIZE```` --- src/main/drivers/serial_uart_impl.h | 36 ++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/src/main/drivers/serial_uart_impl.h b/src/main/drivers/serial_uart_impl.h index a5ecee7f23..6b6b454020 100644 --- a/src/main/drivers/serial_uart_impl.h +++ b/src/main/drivers/serial_uart_impl.h @@ -29,7 +29,11 @@ #define UART_RX_BUFFER_SIZE 128 #endif #ifndef UART_TX_BUFFER_SIZE -#define UART_TX_BUFFER_SIZE 1024 +#ifdef USE_MSP_DISPLAYPORT +#define UART_TX_BUFFER_SIZE 1280 +#else +#define UART_TX_BUFFER_SIZE 256 +#endif #endif #elif defined(STM32F3) #define UARTDEV_COUNT_MAX 5 @@ -38,7 +42,11 @@ #define UART_RX_BUFFER_SIZE 128 #endif #ifndef UART_TX_BUFFER_SIZE -#define UART_TX_BUFFER_SIZE 1024 +#ifdef USE_MSP_DISPLAYPORT +#define UART_TX_BUFFER_SIZE 1280 +#else +#define UART_TX_BUFFER_SIZE 256 +#endif #endif #elif defined(STM32F4) #define UARTDEV_COUNT_MAX 6 @@ -47,7 +55,11 @@ #define UART_RX_BUFFER_SIZE 128 #endif #ifndef UART_TX_BUFFER_SIZE -#define UART_TX_BUFFER_SIZE 1024 +#ifdef USE_MSP_DISPLAYPORT +#define UART_TX_BUFFER_SIZE 1280 +#else +#define UART_TX_BUFFER_SIZE 256 +#endif #endif #elif defined(STM32F7) #define UARTDEV_COUNT_MAX 8 @@ -56,7 +68,11 @@ #define UART_RX_BUFFER_SIZE 128 #endif #ifndef UART_TX_BUFFER_SIZE -#define UART_TX_BUFFER_SIZE 1024 +#ifdef USE_MSP_DISPLAYPORT +#define UART_TX_BUFFER_SIZE 1280 +#else +#define UART_TX_BUFFER_SIZE 256 +#endif #endif #elif defined(STM32H7) #define UARTDEV_COUNT_MAX 8 @@ -65,7 +81,11 @@ #define UART_RX_BUFFER_SIZE 128 #endif #ifndef UART_TX_BUFFER_SIZE -#define UART_TX_BUFFER_SIZE 1024 +#ifdef USE_MSP_DISPLAYPORT +#define UART_TX_BUFFER_SIZE 1280 +#else +#define UART_TX_BUFFER_SIZE 256 +#endif #endif #elif defined(STM32G4) #define UARTDEV_COUNT_MAX 9 // UART1~5 + UART9 (Implemented with LPUART1) @@ -74,7 +94,11 @@ #define UART_RX_BUFFER_SIZE 128 #endif #ifndef UART_TX_BUFFER_SIZE -#define UART_TX_BUFFER_SIZE 1024 +#ifdef USE_MSP_DISPLAYPORT +#define UART_TX_BUFFER_SIZE 1280 +#else +#define UART_TX_BUFFER_SIZE 256 +#endif #endif #else #error unknown MCU family From 88d593604cba82b3e5ad35878f57a13126c3e4e1 Mon Sep 17 00:00:00 2001 From: ligenxxxx <59721724+ligenxxxx@users.noreply.github.com> Date: Wed, 6 Jan 2021 09:32:02 +0800 Subject: [PATCH 7/7] Update serial_uart_impl.h The msp_displayport function does not support deprecated flight controllers. --- src/main/drivers/serial_uart_impl.h | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/main/drivers/serial_uart_impl.h b/src/main/drivers/serial_uart_impl.h index 6b6b454020..798b8d40f2 100644 --- a/src/main/drivers/serial_uart_impl.h +++ b/src/main/drivers/serial_uart_impl.h @@ -29,12 +29,8 @@ #define UART_RX_BUFFER_SIZE 128 #endif #ifndef UART_TX_BUFFER_SIZE -#ifdef USE_MSP_DISPLAYPORT -#define UART_TX_BUFFER_SIZE 1280 -#else #define UART_TX_BUFFER_SIZE 256 #endif -#endif #elif defined(STM32F3) #define UARTDEV_COUNT_MAX 5 #define UARTHARDWARE_MAX_PINS 4 @@ -42,12 +38,8 @@ #define UART_RX_BUFFER_SIZE 128 #endif #ifndef UART_TX_BUFFER_SIZE -#ifdef USE_MSP_DISPLAYPORT -#define UART_TX_BUFFER_SIZE 1280 -#else #define UART_TX_BUFFER_SIZE 256 #endif -#endif #elif defined(STM32F4) #define UARTDEV_COUNT_MAX 6 #define UARTHARDWARE_MAX_PINS 4