Search code examples
cfunctionpointersuart

reading uart software on mcu - code understanding


Below is code in a uart driver header file for performing a non blocking read on the uart interface.

/**
 * Perform a single character read from the UART interface.
 * This is a blocking synchronous call.
 *
 * @brief UART character data read.
 * @param [in] uart UART index.
 * @param [out] data Data to read from UART.
 * @return ti_uart_status_t Returns UART specific return code.
 */
 ti_uart_status_t ti_uart_read(const ti_uart_t uart, uint8_t *data);

Below is example code that uses the above function to get the character from the uart interface. I'm trying to understand it.

I would of thought that ti_uart_read() reads the character from the uart interface, hence why is there a need for getcharacter()?

Also why is it necessary to pass &c to the function? What is its function?

Many thanks

int getcharacter(void) {
uint8_t c = 0;
int ret;
  ret = ti_uart_read(ti_UART_0, &c);
  if (ti_RC_OK == ret) {
    return ((int) c);
  }
  return -1;
}

Solution

  • The function getcharacter is a wrapper for the the UART function ti_uart_read, that handles the operation's status as well as getting the byte. ti_uart_read supplies two items of data: the status of the operation, and the value read. To acheive that the status was returned as the function value, and the data was set by a pointer. The reason it is done that way round, is that smoother and more idiomatic program logic can be achieved if you are checking a function's return value. Some library functions manage this all in one; fgetc is one example. getcharacter works in a similar way: it returns -1 (data you didn't expect) in the case of an error.