Arduino - Basic UART Communication
Arduino Serial Transmission and Reception
void setup() {
// Initialize serial communication at 9600 baud
Serial.begin(9600);
// Wait for serial port to connect (for USB serial)
while (!Serial) {
; // Wait
}
Serial.println("Arduino UART Example");
Serial.println("Type something and press Enter");
}
void loop() {
// Check if data is available to read
if (Serial.available() > 0) {
// Read incoming byte
char incomingByte = Serial.read();
// Echo back
Serial.print("Received: ");
Serial.println(incomingByte);
// Read entire string
String incomingString = Serial.readStringUntil('\n');
Serial.print("String: ");
Serial.println(incomingString);
}
// Send periodic message
static unsigned long lastSend = 0;
if (millis() - lastSend > 5000) {
Serial.println("Heartbeat message");
lastSend = millis();
}
}
Arduino - Multiple Serial Ports
Using Hardware Serial Ports
// For Arduino Mega, Due, or boards with multiple UARTs
void setup() {
Serial.begin(9600); // USB Serial (for debugging)
Serial1.begin(9600); // Hardware UART1 (pins 18/19)
Serial2.begin(115200); // Hardware UART2 (pins 16/17)
Serial.println("Multiple UART Example");
}
void loop() {
// Read from Serial1 and echo to Serial (debug)
if (Serial1.available()) {
char data = Serial1.read();
Serial.print("From Serial1: ");
Serial.println(data);
}
// Read from Serial and send to Serial2
if (Serial.available()) {
String command = Serial.readStringUntil('\n');
Serial2.println(command);
Serial.print("Sent to Serial2: ");
Serial.println(command);
}
// Read from Serial2
if (Serial2.available()) {
String response = Serial2.readStringUntil('\n');
Serial.print("From Serial2: ");
Serial.println(response);
}
}
Arduino - Software Serial
Using Software Serial for Additional UARTs
#include <SoftwareSerial.h>
// Define RX and TX pins for software serial
SoftwareSerial mySerial(10, 11); // RX, TX
void setup() {
Serial.begin(9600); // Hardware serial
mySerial.begin(9600); // Software serial
Serial.println("Software Serial Example");
}
void loop() {
// Forward data from software serial to hardware serial
if (mySerial.available()) {
char c = mySerial.read();
Serial.write(c);
}
// Forward data from hardware serial to software serial
if (Serial.available()) {
char c = Serial.read();
mySerial.write(c);
}
}
// Note: SoftwareSerial has limitations:
// - Maximum ~115200 baud (lower for reliable operation)
// - Cannot transmit and receive simultaneously
// - May miss data if not read frequently
STM32 - HAL UART Implementation
STM32 HAL UART Configuration and Usage
UART_HandleTypeDef huart2;
/* UART2 initialization */
void UART_Init(void) {
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart2) != HAL_OK) {
Error_Handler();
}
}
/* Blocking transmit */
void UART_SendString(char* str) {
HAL_UART_Transmit(&huart2, (uint8_t*)str, strlen(str), HAL_MAX_DELAY);
}
/* Blocking receive */
void UART_ReceiveByte(uint8_t* data) {
HAL_UART_Receive(&huart2, data, 1, HAL_MAX_DELAY);
}
/* Non-blocking interrupt-based transmit */
void UART_SendString_IT(char* str) {
HAL_UART_Transmit_IT(&huart2, (uint8_t*)str, strlen(str));
}
/* Non-blocking interrupt-based receive */
uint8_t rxBuffer[100];
void UART_ReceiveData_IT(void) {
HAL_UART_Receive_IT(&huart2, rxBuffer, 100);
}
/* UART interrupt callback */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
if (huart->Instance == USART2) {
// Process received data
// Restart reception
HAL_UART_Receive_IT(&huart2, rxBuffer, 100);
}
}
GPS Module Example (NMEA Parsing)
Reading GPS Data via UART
#include <SoftwareSerial.h>
SoftwareSerial gpsSerial(4, 3); // RX, TX
void setup() {
Serial.begin(9600);
gpsSerial.begin(9600);
Serial.println("GPS UART Example");
}
void loop() {
// Read NMEA sentences from GPS
if (gpsSerial.available()) {
String nmeaSentence = gpsSerial.readStringUntil('\n');
// Check for GPGGA sentence (Global Positioning System Fix Data)
if (nmeaSentence.startsWith("$GPGGA")) {
Serial.print("GPS Data: ");
Serial.println(nmeaSentence);
// Parse NMEA sentence (simplified example)
parseGPGGA(nmeaSentence);
}
}
}
void parseGPGGA(String sentence) {
// GPGGA format: $GPGGA,time,lat,N/S,lon,E/W,quality,numSV,HDOP,alt,M,...
int commaIndex[15];
int index = 0;
// Find comma positions
for (int i = 0; i < sentence.length() && index < 15; i++) {
if (sentence.charAt(i) == ',') {
commaIndex[index++] = i;
}
}
if (index >= 9) {
String latitude = sentence.substring(commaIndex[1] + 1, commaIndex[2]);
String longitude = sentence.substring(commaIndex[3] + 1, commaIndex[4]);
String altitude = sentence.substring(commaIndex[8] + 1, commaIndex[9]);
Serial.print("Lat: "); Serial.print(latitude);
Serial.print(" Lon: "); Serial.print(longitude);
Serial.print(" Alt: "); Serial.println(altitude);
}
}