Hallo,
Momenteel ben ik bezig met een toepassing waarbij een Raspberry Pi communiceert met 8 microcontrollers via een half-duplex RS-485 verbinding, zie figuur.

De RPI (master) verstuurd een commando waarbij de geadresseerde microcontroller (slave) een antwoord terugstuurt. Zowel het commando als de response hebben een vaste lengte van 20 bytes. De code voor de RPI is geschreven in Java en maakt gebruik van de PI4J library.
Het volgende stukje code verstuurd een commando en leest de response
Ter verduidelijking "serialPort" is een object van de klasse Serial in de PI4J library en "txdenPin" is de IO-pin die bepaald of de RS485 transceiver chip (ST1480) als transmitter of als receiver wordt gebruikt. De opdracht wordt doorgegeven aan een single thread executor omdat de read method wacht tot er data binnenkomt.
Aan de hand van de teruggegeven Future kan de response gelezen wordt inclusief het detecteren van een timeout:
Met een timeout van 1000ms loopt het af en toe fout terwijl er wel degelijk een response wordt teruggestuurd en dit ruim binnen de ingestelde timeout. Dit heb ik geverifieerd met een logic analyzer. Als ik de timeout vrij hoog kies bv. 5000ms werkt het perfect. Ik vroeg mij dus af wat de oorzaak hiervan zou kunnen zijn ?
Steve
Momenteel ben ik bezig met een toepassing waarbij een Raspberry Pi communiceert met 8 microcontrollers via een half-duplex RS-485 verbinding, zie figuur.

De RPI (master) verstuurd een commando waarbij de geadresseerde microcontroller (slave) een antwoord terugstuurt. Zowel het commando als de response hebben een vaste lengte van 20 bytes. De code voor de RPI is geschreven in Java en maakt gebruik van de PI4J library.
Het volgende stukje code verstuurd een commando en leest de response
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| public Future<byte[]> startTransaction(byte[] frameOut){ Future<byte[]> futureResult = executor.submit(new Callable<byte[]>() { @Override public byte[] call() throws Exception { // put RS-485 transceiver in transmit mode txdenPin.high(); // send command frame serialPort.write(frameOut); serialPort.flush(); // put RS-485 transceiver in receive mode txdenPin.low(); // read response frame return serialPort.read(frameOut.length); } }); return futureResult; } |
Ter verduidelijking "serialPort" is een object van de klasse Serial in de PI4J library en "txdenPin" is de IO-pin die bepaald of de RS485 transceiver chip (ST1480) als transmitter of als receiver wordt gebruikt. De opdracht wordt doorgegeven aan een single thread executor omdat de read method wacht tot er data binnenkomt.
Aan de hand van de teruggegeven Future kan de response gelezen wordt inclusief het detecteren van een timeout:
Java:
1
2
3
4
5
6
7
8
9
| try{ response = futureResult.get(1000, TimeUnit.MILLISECONDS); }catch(InterruptedException ex){ }catch(ExecutionException ex){ }catch(TimeoutException ex){ // HANDLE TIMEOUT } |
Met een timeout van 1000ms loopt het af en toe fout terwijl er wel degelijk een response wordt teruggestuurd en dit ruim binnen de ingestelde timeout. Dit heb ik geverifieerd met een logic analyzer. Als ik de timeout vrij hoog kies bv. 5000ms werkt het perfect. Ik vroeg mij dus af wat de oorzaak hiervan zou kunnen zijn ?
Steve