Its also possible to use a single UART to talk to multiple boards.
Lets say you have 4 Axons:-
Axon#1: Receives from Axon#4, Transmits to Axon#2
Axon#2: Receives from Axon#1, Transmits to Axon#3
Axon#3: Receives from Axon#2, Transmits to Axon#4
Axon#4: Receives from Axon#3, Transmits to Axon#1
So you have a 'ring' of boards on a UART network.
Then you can use a message 'packet' such as:
Byte 0 = Originator Axon ID number
Byte 1 = Destination Axon ID number
Byte 2 = number of message bytes that follow
Byte 3 = the message bytes
When a board receives a whole msg it looks to see if Byte 1 = my ID number. If not then just send the whole message on to the next Axon.
If it is for me: then don't pass the message on. If the message requires a reply then send a new message where Byte 0=me, Byte 1=Byte0 of the original msg, followed by the response.
If an Axon receives a msg where Byte0 = my ID then it means that the message has been passed the whole way around the ring - ie nobody responded (perhaps the Byte1 id is incorrect?!). In this case the msg should be removed otherwise it will keep going round and around forever.
Of course you could change Byte 1 to represent an action that the originator wants to be done. For example:
1 = Set left motor speed to the value in the 1 byte message
2 = Set right motor speed to the value in the 1 byte message
3 = Read sonar and return value
This way each board can decide if it is the one that needs to perform the action, and if not, then pass it to the next board.
EDIT: It also means that each board can be both a 'slave' (processes msgs) AND a 'master' (adds new msgs)