diff --git a/src/drv_softserial.c b/src/drv_softserial.c index 848cb7d1e7..abc33768ae 100644 --- a/src/drv_softserial.c +++ b/src/drv_softserial.c @@ -218,17 +218,20 @@ void processTxState(softSerial_t *softSerial) softSerial->internalTxBuffer = (1 << (TX_TOTAL_BITS - 1)) | (byteToSend << 1); softSerial->bitsLeftToTransmit = TX_TOTAL_BITS; softSerial->isTransmittingData = true; + return; } - mask = softSerial->internalTxBuffer & 1; - softSerial->internalTxBuffer >>= 1; + if (softSerial->bitsLeftToTransmit) { + mask = softSerial->internalTxBuffer & 1; + softSerial->internalTxBuffer >>= 1; - setTxSignal(softSerial, mask); - - if (--softSerial->bitsLeftToTransmit <= 0) { - softSerial->isTransmittingData = false; + setTxSignal(softSerial, mask); + softSerial->bitsLeftToTransmit--; + return; } + + softSerial->isTransmittingData = false; } enum { diff --git a/src/drv_softserial.h b/src/drv_softserial.h index 260568d51e..0f18f9e0e9 100644 --- a/src/drv_softserial.h +++ b/src/drv_softserial.h @@ -24,7 +24,7 @@ typedef struct softSerial_s { uint8_t rxEdge; uint8_t isTransmittingData; - uint8_t bitsLeftToTransmit; + int8_t bitsLeftToTransmit; uint16_t internalTxBuffer; // includes start and stop bits uint16_t internalRxBuffer; // includes start and stop bits