I have the following system:

enter image description here

As a master, I have an Arduino UNO Chip, more specifically an Atmel MEGA328P. The important thing is that this microcontroller has only one hardware Serial port, and that port is used to communicate with a WiFi adapter.

The problem I'm facing with is that I want to receive data from a Compass and a GPS modules. Booth send data via Serial protocol. The 328p Chip have only one serial which is busy!

I can't use SoftwareSerial as I don't want any delay on master board! I can't also use Arduino Mega2560 which have 3 Serial ports as its sizes are too big.

So there are are my approaches:

  1. Using MCP4725 I2C DAC for Compass, but what we do with GPS?
  2. Using and intermediate Arduino UNO Chip? On that chip I could use Software serial but how to transfer data to MASTER using only digital and analogic pins? Maybe using 10 pins to implement a parallel transfer?
  3. Perhaps there is possible to convert Compass and GPS data to analogic then transfer to MASTER?

Anyway, what possibilities would I have to play around?

  • 1
    That was a lot of design restrictions. You might want to look at an I2C/SPI to UART bridge; nxp.com/products/interface-and-connectivity/… – Mikael Patel Aug 11 '16 at 10:53
  • Maybe you should consider stepping away from Arduino boards and exploring the plethora of more capable boards that are out there - most of which can be programmed with the Arduino IDE using the Arduino API. – Majenko Aug 11 '16 at 11:06
  • You chose the wrong part. Lots of ARM Cortex parts have 3 UARTs, some of them have Arduino ports. – Chris Stratton Aug 11 '16 at 13:29
  • @ChrisStratton Only 3? I'm used to working with chips that have 6 UARTs... ;) – Majenko Aug 11 '16 at 15:49
  • 1
    @Majenko : Can you guys provide some links please? It would be very usefully :) – caffeine Aug 13 '16 at 13:36

This answer summarizes the possibilities:

1) HardwareSerial is always best. You are using that for WiFi.

2) AltSoftSerial is the best software serial library, but it requires pins 8 & 9. Very efficient and non-blocking! Strongly recommended for the GPS connection.

3) NeoSWSerial is next best, but it supports only 9600, 19200 and 38400. It is non-blocking on receive, so it could be used for the GPS connection.

4) SoftwareSerial is the worst. :P Not suitable for the GPS connection, as you have discovered.

I'll also mention my GPS library, NeoGPS. It is smaller and faster than other libraries, and there are examples that show how to make it run during the RX character interrupt, saving even more time. It can also be configured for just the messages and fields that you actually use, saving RAM, program space and execution time.


I think softserials are working based pinchange interrupt. This wont make you any significant delay i hop.Or you should go gps or wifi modules with SPI or IIC interface.

  • SoftwareSerial uses PCINT to start reception. During reception it blocks all other operations. That causes significant delays, especially at lower baud rates. – Majenko Aug 11 '16 at 11:14

Your Answer

