1.1.10.2 Using the Library
The USART driver builds on top of the USART or UART Peripheral Library (PLIB) and provides write, read APIs in Blocking and Non-blocking modes.
- In Asynchronous (non-blocking) mode, application can either register a callback to get notified once the data transfer is complete or can poll the status of the data transfer using the status APIs.
- In Asynchronous mode, application can queue more than one transmit/receive requests without waiting for the previous request to be completed. The number of transmit/receive requests that can be queued depends on the depth of the transfer queue configured using the MCC.
- The Asynchronous mode is supported in both Bare-Metal and RTOS environment.
- The Synchronous (blocking) mode of the driver is supported only in an RTOS environment.
- The Synchronous mode of the driver does not support callback or queuing multiple requests. This is because the implementation is blocking in nature.
- Supports DMA for Transfer/Receive in both Asynchronous and Synchronous mode.
Example Application to Read and Write From UART Console in Asynchronous Mode
#define APP_DATA_SIZE 1 APP_DATA appData; static const char messageBuffer[] = "*** USART Driver Echo Demo Application ***\r\n" "*** Type a character and observe it echo back ***\r\n"; static void APP_USARTBufferEventHandler( DRV_USART_BUFFER_EVENT bufferEvent, DRV_USART_BUFFER_HANDLE bufferHandle, uintptr_t context ) { switch(bufferEvent) { case DRV_USART_BUFFER_EVENT_COMPLETE: { appData.transferStatus = true; break; } case DRV_USART_BUFFER_EVENT_ERROR: { appData.state = APP_STATE_ERROR; break; } default: { break; } } } void APP_Initialize ( void ) { /* Place the App state machine in its initial state. */ appData.state = APP_STATE_INIT; appData.transferStatus = false; appData.usartHandle = DRV_HANDLE_INVALID; appData.bufferHandle = DRV_USART_BUFFER_HANDLE_INVALID; } void APP_Tasks ( void ) { /* Check the application's current state. */ switch ( appData.state ) { /* Application's initial state. */ case APP_STATE_INIT: { appData.usartHandle = DRV_USART_Open(DRV_USART_INDEX_0, DRV_IO_INTENT_READWRITE); if (appData.usartHandle != DRV_HANDLE_INVALID) { DRV_USART_BufferEventHandlerSet(appData.usartHandle, APP_USARTBufferEventHandler, 0); appData.state = APP_STATE_TRANSMIT_MESSAGE; } else { appData.state = APP_STATE_ERROR; } break; } case APP_STATE_TRANSMIT_MESSAGE: { DRV_USART_WriteBufferAdd(appData.usartHandle, (void*)messageBuffer, strlen(messageBuffer), &appData.bufferHandle); if (appData.bufferHandle != DRV_USART_BUFFER_HANDLE_INVALID) { appData.state = APP_STATE_WAIT_MESSAGE_TRANSFER_COMPLETE; } else { appData.state = APP_STATE_ERROR; } break; } case APP_STATE_WAIT_MESSAGE_TRANSFER_COMPLETE: { if(appData.transferStatus == true) { appData.transferStatus = false; appData.state = APP_STATE_RECEIVE_DATA; } break; } case APP_STATE_RECEIVE_DATA: { DRV_USART_ReadBufferAdd(appData.usartHandle, appData.readBuffer, APP_DATA_SIZE, &appData.bufferHandle); if (appData.bufferHandle != DRV_USART_BUFFER_HANDLE_INVALID) { appData.state = APP_STATE_WAIT_RECEIVE_COMPLETE; } else { appData.state = APP_STATE_ERROR; } break; } case APP_STATE_WAIT_RECEIVE_COMPLETE: { if(appData.transferStatus == true) { appData.transferStatus = false; appData.state = APP_STATE_TRANSMIT_DATA; } break; } case APP_STATE_TRANSMIT_DATA: { /* Echo the received data back on the terminal */ DRV_USART_WriteBufferAdd(appData.usartHandle, appData.readBuffer, APP_DATA_SIZE, &appData.bufferHandle); if (appData.bufferHandle != DRV_USART_BUFFER_HANDLE_INVALID) { appData.state = APP_STATE_WAIT_TRANSMIT_COMPLETE; } else { appData.state = APP_STATE_ERROR; } break; } case APP_STATE_WAIT_TRANSMIT_COMPLETE: { if(appData.transferStatus == true) { appData.transferStatus = false; LED_TOGGLE(); appData.state = APP_STATE_RECEIVE_DATA; } break; } case APP_STATE_ERROR: { LED_OFF(); appData.state = APP_STATE_IDLE; break; } case APP_STATE_IDLE: default: { break; } } }
