HEX po Software print

Ludek
Příspěvky: 291
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

HEX po Software print

Příspěvek od Ludek » 13 zář 2023, 17:51

Ještě mám malý problém...
Lze pomocí SoftwareSerial.h poslat třeba 2 hexa byte?

příklad a= 0x0102 a b= 0x0004
a tedy po lince RS485 musí odejít 4byte --> 0001 0010 0000 0100
nějak to neumím

Uživatelský avatar
gilhad
Příspěvky: 789
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: HEX po Software print

Příspěvek od gilhad » 13 zář 2023, 18:54

Serial.write asi bude to, co hledáš, https://www.arduino.cc/reference/en/lan ... ial/write/ ale to posílá buď byte, nebo string, nebo sérii bytů, takže buď

Kód: Vybrat vše

Serial.write(a >>8); // horní byte
Serial.write(a & 0x0FF); // dolní byte

Serial.write(b >>8); // horní byte
Serial.write(b & 0x0FF); // dolní byte

nebo

Kód: Vybrat vše

Serial.write(a,2); // buffer, 2 byte

Serial.write(b,2); // buffer, 2 byte

ale nejsem si teď z hlavy jist pořadím, takže bych si prvně poslal a=0x3132; na textový terminál a buď to vypíše 12, nebo 21

Ludek
Příspěvky: 291
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: HEX po Software print

Příspěvek od Ludek » 13 zář 2023, 18:55

JO JO, to šlape, ale né u Softwareserial :-(

Uživatelský avatar
gilhad
Příspěvky: 789
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: HEX po Software print

Příspěvek od gilhad » 13 zář 2023, 19:01

https://docs.arduino.cc/learn/built-in- ... 6dda#write
Podle tohoto by ta první šlapat měla (pokud ne, napiš, jak to voláš, co to dělá a co bys chtěl, aby to dělalo)

Kód: Vybrat vše

mySerial.write(a >>8); // horní byte
mySerial.write(a & 0x0FF); // dolní byte

mySerial.write(b >>8); // horní byte
mySerial.write(b & 0x0FF); // dolní byte


Ludek
Příspěvky: 291
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: HEX po Software print

Příspěvek od Ludek » 13 zář 2023, 19:03

OK, zkusím, dám vědět

Ludek
Příspěvky: 291
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: HEX po Software print

Příspěvek od Ludek » 13 zář 2023, 19:16

Tak to první s posunem šlape, to druhé mu vadí 2x int. OK tak tomu rozumím.
Ještě tedy jak to udělat, když potřebuju poslat třeba 6 Byte, resp 3Byte a 3 Word
jde to nějak kratším zápisem?

Uživatelský avatar
gilhad
Příspěvky: 789
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: HEX po Software print

Příspěvek od gilhad » 13 zář 2023, 19:58

Obávám se, že tak úplně nechápu otázku.

Jestli jde o vyhnutí se vypisování spousty >>8 >>16 &0xFF a podobně, tak to prostě zabalit do funkce/funkcí (pro různé typy parametrů)/objektu (pro jednodušší používání)

Kód: Vybrat vše

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10,11);

void send_uint16_t(SoftwareSerial &mySerial, uint16_t val) { //send 2 byte value
mySerial.write(val >>8);
mySerial.write(val & 0x0FF);
}
void setup(){
	uint16_t a,b,c;
	uint8_t x,y,z;
	a=b=c=x=y=z=5;
	send_uint16_t(mySerial, a);	// 2 bytes
	send_uint16_t(mySerial, b);
	send_uint16_t(mySerial, c);
	mySerial.write(x);	// 1 byte
	mySerial.write(y);
	mySerial.write(z);
}
void loop(){}


Uživatelský avatar
gilhad
Příspěvky: 789
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: HEX po Software print

Příspěvek od gilhad » 13 zář 2023, 20:29

Případně si udělat vlastní třídu, třeba takto

Kód: Vybrat vše

#include <SoftwareSerial.h>


class myOwnSerial: public SoftwareSerial {
	public:
		myOwnSerial(uint8_t receivePin, uint8_t transmitPin, bool inverse_logic = false) : SoftwareSerial(receivePin,transmitPin,inverse_logic) {};
	size_t write(uint8_t val) {
		return SoftwareSerial::write((uint8_t) val);
	};
	void write(unsigned int val) {
		SoftwareSerial::write((uint8_t)( val >>8));
		SoftwareSerial::write((uint8_t)(val & 0x0FF));
	};
	void write(unsigned long val) {
		SoftwareSerial::write((uint8_t)( (val >>24) & 0x0FF));
		SoftwareSerial::write((uint8_t)( (val >>16) & 0x0FF));
		SoftwareSerial::write((uint8_t)( (val >>8)  & 0x0FF));
		SoftwareSerial::write((uint8_t)(  val       & 0x0FF));
	};


};
myOwnSerial mySerial(10,11);

uint16_t a,b,c;
uint8_t x,y,z;
uint32_t h,j,k;

void posli_data() { // posle namerena data
	mySerial.write(a);	// 2 bytes
	mySerial.write(b);
	mySerial.write(c);
	mySerial.write(x);	// 1 byte
	mySerial.write(y);
	mySerial.write(z);
	mySerial.write(h);	// 4 byte
	mySerial.write(j);
	mySerial.write(k);
}

void setup(){
	a=b=c=x=y=z=h=j=k=5;
	posli_data();
}
void loop(){}

Uživatelský avatar
gilhad
Příspěvky: 789
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: HEX po Software print

Příspěvek od gilhad » 13 zář 2023, 20:31

(a samozřejmě jsou to jen ukázky, takže nedělají nic moc rozumného, musíš si tam dát vlastní data a volat to ve chvíli, kdy to má smysl - ty setup a loop tam mám jen aby se to přeložilo)

Ludek
Příspěvky: 291
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: HEX po Software print

Příspěvek od Ludek » 13 zář 2023, 20:38

Jsi borec!
díky už to šlape...

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 27 hostů