Software UART Library
The mikroC PRO for AVR provides routines for implementing Software UART communication. These routines are hardware independent and can be used with any MCU.
The Software UART Library provides easy communication with other devices via the RS232 protocol.
![]() |
Library Routines
Soft_UART_Init
Prototype |
char Soft_UART_Init(char *port, char rx_pin, char tx_pin, unsigned long baud_rate, char inverted); |
---|---|
Returns |
|
Description |
Configures and initializes the software UART module. Parameters :
Software UART routines use If requested baud rate is too high then rounding error of |
Requires |
Nothing. |
Example |
This will initialize software UART and establish the communication at 14400 bps: char error; ... error = Soft_UART_Init(&PORTC, 7, 6, 14400, 0); // Initialize Soft UART at 14400 bps |
Soft_UART_Read
Prototype |
char Soft_UART_Read(char * error); |
---|---|
Returns |
Byte received via UART. |
Description |
The function receives a byte via software UART. This is a blocking function call (waits for start bit). Programmer can unblock it by calling Soft_UART_Break routine. Parameters :
|
Requires |
Software UART must be initialized before using this function. See the Soft_UART_Init routine. |
Example |
char data_, error; ... // wait until data is received do data = Soft_UART_Read(&error); while (error); // Now we can work with data: if (data_) {...} |
Soft_UART_Write
Prototype |
void Soft_UART_Write(char udata); |
---|---|
Returns |
Nothing. |
Description |
This routine sends one byte via the Software UART bus. Parameters :
|
Requires |
Software UART must be initialized before using this function. See the Soft_UART_Init routine. Be aware that during transmission, software UART is incapable of receiving data – data transfer protocol must be set in such a way to prevent loss of information. |
Example |
char some_byte = 0x0A; ... // Write a byte via Soft UART Soft_UART_Write(some_byte); |
Soft_UART_Break
Prototype |
void Soft_UART_Break(); |
---|---|
Returns |
Nothing. |
Description |
Soft_UART_Read is blocking routine and it can block the program flow. Calling this routine from the interrupt will unblock the program execution. This mechanism is similar to WDT. ![]() |
Requires | Nothing. |
Example |
char i, error, byte_read; // Auxiliary variables void main(){ DDRB = 0xFF; // Set PORTB as output (error signalization) PORTB = 0; // No error error = Soft_UART_Init(&PORTD,0,1,9600,0); // Initialize Soft UART at 9600 bps if (error > 0) { PORTB = error; // Signalize Init error while(1) ; // Stop program } Delay_ms(100); for (i = 'z'; i >= 'A'; i--) { // Send bytes from 'z' downto 'A' Soft_UART_Write(i); Delay_ms(100); } while(1) { // Endless loop byte_read = Soft_UART_Read(&error); // Read byte, then test error flag if (error) // If error was detected PORTB = error; // signal it on PORTB else Soft_UART_Write(byte_read); // If error was not detected, return byte read } } |
Library Example
This example demonstrates simple data exchange via software UART. If MCU is connected to the PC, you can test the example from the mikroC PRO for AVR USART Terminal Tool.
char i, error, byte_read; // Auxiliary variables void main(){ DDRB = 0xFF; // Set PORTB as output (error signalization) PORTB = 0; // No error error = Soft_UART_Init(&PORTD,0,1,9600,0); // Initialize Soft UART at 9600 bps if (error > 0) { PORTB = error; // Signalize Init error while(1) ; // Stop program } Delay_ms(100); for (i = 'z'; i >= 'A'; i--) { // Send bytes from 'z' downto 'A' Soft_UART_Write(i); Delay_ms(100); } while(1) { // Endless loop byte_read = Soft_UART_Read(&error); // Read byte, then test error flag if (error) // If error was detected PORTB = error; // signal it on PORTB else Soft_UART_Write(byte_read); // If error was not detected, return byte read } }
What do you think about this topic ? Send us feedback!