Software UART Library
mikroBasic PRO for PIC32 provides library which implements 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 |
sub function Soft_UART_Init(dim byref port as longword, dim rx, tx as longword, dim baud_rate as longword, dim inverted as word) as byte |
---|---|
Description |
Configures and initializes the software UART module. Software UART routines use Delay_Cyc routine. If requested baud rate is too low then calculated parameter for calling If requested baud rate is too high then rounding error of |
Parameters |
|
Returns |
|
Requires |
Nothing. |
Example |
This will initialize software UART and establish the communication at 9600 bps: ' Initialize Software UART communication on pins RB1(Rx), RB2(Tx), at 9600 bps Soft_UART_Init(PORTB, 1, 2, 9600, 0) |
Notes |
The Software UART library implements time-based activities, so interrupts need to be disabled when using it. |
Soft_UART_Read
Prototype |
sub function Soft_UART_Read(dim byref error as byte) as byte |
---|---|
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 |
|
Returns |
Byte received via UART. |
Requires |
Software UART must be initialized before using this function. See the Soft_UART_Init routine. |
Example |
dim data_ as byte error as word ... ' wait until data is received do data_ = Soft_UART_Read(error) loop until (error = 0) |
Notes |
The Software UART library implements time-based activities, so interrupts need to be disabled when using it. |
Soft_UART_Write
Prototype |
sub procedure Soft_UART_Write(dim udata as byte) |
---|---|
Description |
This routine sends one byte via the Software UART bus. |
Parameters |
|
Returns |
Nothing. |
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 |
dim some_byte as byte ... some_byte = $0A ' Write a byte via Soft UART Soft_UART_Write(some_byte) |
Notes |
The Software UART library implements time-based activities, so interrupts need to be disabled when using it. |
Soft_UART_Break
Prototype |
sub procedure Soft_UART_Break() |
---|---|
Description |
Soft_UART_Read is blocking routine and it can block the program flow. Calling |
Parameters |
None. |
Returns |
Nothing. |
Requires | Nothing. |
Example |
dim data1, error, counter as byte sub procedure Timer1Int() org IVT_ADDR_T1INTERRUPT counter = 0 if (counter >= 20) then Soft_UART_Break() counter = 0 ' reset counter else Inc(counter) ' increment counter end if T1IF_bit = 0 ' Clear Timer1 overflow interrupt flag end sub main: ... if (Soft_UART_Init(PORTF, 2, 3, 14400, 0) = 0) then Soft_UART_Write(0x55) end if ... ' try Soft_UART_Read with blocking prevention mechanism IPC0 = IPC0 or 0x1000 ' Interrupt priority level = 1 T1IE_bit = 1 ' Enable Timer1 interrupts T1CON = 0x8030 ' Timer1 ON, internal clock FCY, prescaler 1:256 data1 = Soft_UART_Read(&error) T1IE_bit = 0 ' Disable Timer1 interrupts end. |
Notes |
The Software UART library implements time-based activities, so interrupts need to be disabled when using it. |
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 mikroBasic PRO for PIC32 USART communication terminal, launch it from the drop-down menu Tools › USART Terminal or simply click the USART Terminal Icon .
program Soft_UART
dim error_ as byte
counter, byte_read as byte ' Auxiliary variables
main:
CHECON = 0x32
AD1PCFG = 0xFFFF ' Configure AN pins as digital I/O
TRISB = 0x00 ' Set PORTB as output (error signalization)
PORTB = 0 ' No error
error_ = Soft_UART_Init(PORTF, 2, 8, 56000, 0) ' Initialize Soft UART at 56000 bps
if (error_ > 0) then
PORTB = error_ ' Signalize Init error
while TRUE
nop ' Stop program
wend
end if
Delay_ms(100)
for counter = "z" to "A" step-1 ' Send bytes from "z" downto "A"
Soft_UART_Write(counter)
Delay_ms(100)
next counter
while TRUE ' Endless loop
byte_read = Soft_UART_Read(error_) ' Read byte, then test error flag
if (error_ <> 0) then ' If error was detected
PORTB = error_ ' signal it on PORTB
else
Soft_UART_Write(byte_read) ' If error was not detected, return byte read
end if
wend
end.
What do you think about this topic ? Send us feedback!