GY-63_MS5611/libraries/RS485/MESSAGES.MD
2024-02-03 12:28:23 +01:00

4.0 KiB

Messages

Examples of command/answer protocols over RS485. (to be elaborated)

This is part of the RS485 class - https://github.com/RobTillaart/RS485

Guidelines

Designing a protocol is most often not trivial and might need more than one iteration.

  • Keep protocols as simple as possible.
  • Make sure that baud rates match between the nodes in the network.
  • Software Serial can work when time between requests is long enough. It depends on how much processing is needed.
  • Be aware of implications of future expansion. Design your protocol with room for additional commands. Or even add a version number in it.
  • In designing a protocol be aware of ambiguities. An request or answer may contain bytes (sequences) that might trigger other nodes.
  • If you request data from a node, it might happen that it won't answer or that the answer fails to arrive in correct state (missing bytes, flipped bits etc.)

ASCII codes

Possible useful char codes.

commando value meaning
ASCII_SOH 0x01 start of header
ASCII_STX 0x02 start of text
ASCII_ETX 0x03 end of text
ASCII_EOT 0x04 end of transmission
ASCII_ACK 0x06 ACKnowledge
ASCII_NAK 0x15 Not Acknowledge
ASCII_CAN 0x18 CANcel

See also ASCII_CONTROL.h


example 1 - simplest?

A minimal message protocol consisting of 1 byte commands

command = (0x80 | 7 bits command) answer = (0x00 | 7 bits answer)*

All command are coded in a single byte with 0x80 bit set. All answers bytes 0 or more (sender knows how many to expect, or a specific end char.

requirement:

  • All devices listen to a (possibly) disjunct command set.

example 2 - add device ID

Using a device id to send the command to.

command := { ASCII_SOH start of header, (attention new command) deviceID to (is it for me?) should not equal SOH command (if so, exec command) bytes expected (to generate the bytes) }

answer := { bytes requested bytes (send them back) }


example 3 - PRO I

Command and answer have same layout. Uses device ID's to address specific device.

{ ASCII_SOH start of header 0x01 deviceID to deviceID sender length length of message message idem in ASCII

optional extend with: checksum optional ASCII_EOT optional (end of transmission) }


example 4 - PRO II

More complex package with multiple fields and Checksum / CRC per message. In fact this is an elaborated variation on previous example.

ASCII_SOH start of header deviceID to deviceID sender fields 0 or more

  length       length of field 1
  ASCII_STX    start of text
  message      idem
  CHECKSUM     idem, message only!
  ASCII_ETX    end of text

  length       length of field 2
  ASCII_STX    start of text
  message      idem
  CHECKSUM     idem, message only!
  ASCII_ETX    end of text
  ...

ASCII_EOT end of transmission


example 5 - PING still alive

Maybe most simple protocol, just send an ID, and if the slave is alive it responds with its ID. Think of it as the PING command

command = ID answer = ID

If the slave is a single function device (light switch) it might just toggle upon receiving its ID.

Note this simple protocol cannot discriminate between an command and answer.

A PING command could be embedded in other protocols too,


example 6 - Get value

Reading a simple slave could be done with a one byte command.

command = ID answer = returns value. // this should never contain an ID of another device.

An example is remote reading a sensor or an analog port.

To improve the reliability the answer can be a "packet".

command = ID answer = { ASCII_SOH, IDmaster, IDslave, length, value }


Future

  • binary protocols