Lecture UART

Bonjour
J’ai une télécommande IR qui possède un port série (UART).
J’écoute ce port avec un ESP8266 pour comprendre les échanges série.
Voici mon code :

	uart:
	  - id: uart_bus
		tx_pin: D5
		rx_pin: D6
		baud_rate: 9600
		stop_bits: 1
		debug:
			direction: BOTH
			dummy_receiver: true
			after:
			  bytes: 256
			sequence:
			  - lambda: UARTDebug::log_hex(direction, bytes, ':');

Et ce que je vois dans la fenêtre debug :

	[14:08:27][D][uart_debug:109]: <<< 56:62:02:6C:18:00
	[14:08:28][D][uart_debug:109]: >>> 2F:33:0A
	[14:08:29][D][uart_debug:109]: <<< 56:62:02:6C:18:00
	[14:08:30][D][uart_debug:109]: >>> 2F:33:0A
	[14:08:31][D][uart_debug:109]: <<< 56:62:02:6C:18:00
	[14:08:32][D][uart_debug:109]: >>> 2F:33:0A

Je visualise donc parfaitement les échanges UART.

Je me suis alors attelé à faire un ‹ Custom Text Sensor › que voici :

	#include "esphome.h"
	class UartReadLineSensor_rx : public Component, public UARTDevice, public TextSensor {
	 public:
	  UartReadLineSensor_rx(UARTComponent *parent) : UARTDevice(parent) {}

	  void setup() override {
							// nothing to do here
	  }

	  int readline(int readch, char *buffer, int len)
	  {
		static int pos = 0;
		int rpos;

		if (readch > 0) {
		  switch (readch) {
			case 0x0A: 		// Return on CR
			  rpos = pos;
			  pos = 0;  	// Reset position index ready for next time
			  return rpos;
			case 0x00: 		// Return on CR
			  rpos = pos;
			  pos = 0;  	// Reset position index ready for next time
			  return rpos;
			default:
			  if (pos < len-1) {
				buffer[pos++] = readch;
				buffer[pos] = 0;
			  }
		  }
		}
		return -1;			// No end of line has been found, so return -1.
	  }

	  void loop() override {
		const int max_line_length = 80;
		static char buffer[max_line_length];
		while (available()) {
		  if(readline(read(), buffer, max_line_length) > 0) {
			publish_state(buffer);
		  }
		}
	  }
	};

et le YAML correspondant :

	text_sensor:
	  - platform: custom
		lambda: |-
		  auto remote = new UartReadLineSensor_rx(id(uart_bus));
		  App.register_component(remote);
		  return {remote};
		text_sensors:
		  id: "remote"
		  name: "Télécommande IR"

Seulement voilà…
Les échanges que je vois parfaitement en ‹ debug › ne remontent pas en ‹ text_sensor › et je ne comprends pas pourquoi…

image

Qui pourrait m’orienter sur la solution ?
Je souhaite récupérer dans Home Assistant le code reçu : 56:62:02:6C:18:00
et émettre depuis home Assistant l’accusé de réception : 2F:33:0A
Par avance merci.

Bruno

A vu de nez ça ressemble à un problème de conversion binaire/texte, il faudrait les convertir en ASCII pour l’affichage.

Pour pas vous fatiguer vous pouvez mettre les case avec le même code l’un sous l’autre

		case 0x0A: 		// Return on CR
		case 0x00: 		// Return on CR

Si nécessaire il faudrait aussi traiter le cas ou vous avez rempli votre buffer sans rencontrer de retour à la ligne sinon vous risquez d’être bloqué indéfiniment.

En effet, c’est bien vu.
Mon code à bien changé depuis ce post mais un simple ‹ to_string › et c’est bon.
Merci pour la simplification des ‹ case › l’un sous l’autre et au plaisir. :wink:

1 « J'aime »