Hello guys, I am implementing my little protocol to send data to from microcontroller to PC via RS232. I would like to know if there is a way to determine size of a buffer passed to a function, besides sending buffer size as a function parameter
Here is my function that does encoding
Code:
int8_t getMessage(const char* serializedBuffer, char* encodedBuffer, uint8_t encodedBufferLen, uint8_t messageType)
{
uint8_t serializedBufferLen;
uint8_t minimumRequiredEncodedBufferLen;
serializedBufferLen = strlen(serializedBuffer);
minimumRequiredEncodedBufferLen = serializedBufferLen + MESSAGE_MINIMUM_HEADER_SIZE;
if (encodedBufferLen <= minimumRequiredEncodedBufferLen)
{
return ENCODED_BUFFER_NOT_ENOUGH_SPACE;
}
// Add header
encodedBuffer[MESSAGE_START_INDEX] = STX;
if (messageType == MESSAGE_TYPE_TEMPERATURE)
{
encodedBuffer[MESSAGE_OPTION_FLAG_BYTE_POSITION] = MESSAGE_TYPE_TEMPERATURE;
}
else
{
encodedBuffer[MESSAGE_OPTION_FLAG_BYTE_POSITION] = MESSAGE_TYPE_CONTROL;
}
// Add data to encodedBuffer
strcpy(&encodedBuffer[MESSAGE_DATA_START_INDEX], serializedBuffer);
// Add NULL terminator and End Of Text bytes
memset(&encodedBuffer[MESSAGE_DATA_LENGTH_INDEX], serializedBufferLen + '0', 1);
memset(&encodedBuffer[serializedBufferLen + 3], '\0', 1);
memset(&encodedBuffer[serializedBufferLen + 4], ETX, 1);
return MESSAGE_ENCODER_OK;
}
Third parameter 'uint8_t encodedBufferLen' takes care of buffer that data will be stored in.
But let's say that there is a scenario where user writes following:
Code:
int main(void)
{
#define ENCODED_BUFFER_LENGTH 10
uint8_t encodedBuffer[ENCODED_BUFFER_LENGTH];
uint8_t serializedBuffer[10];
float floatNo = 125.61f;
int8_t retVal;
getSerializedMessage(serializedBuffer
retVal = getMessage((const char*)serializedBuffer, encodedBuffer, ENCODED_BUFFER_LENGTH, MESSAGE_TYPE_TEMPERATURE);
return 0:
}
For floatNo = 125.61f I need atleast buffer of length 11 atleast, and since user passed to the function getMessage, argument ENCODED_BUFFER_LENGTH == 10, my encoding will fail since I won't have enough space to store all data.