Wpis z mikrobloga

Mircy,
używam #esp8266 na którym stoi serwer TCP, przez sieć wysyłam do niego dane binarne w paczkach po 5 bajtów, kiedy wysyłam dane typu:
{26,147,63,255,98}
wszystko jest ok, ESP ładnie przesyła przez Serial dane do #arduino i wszyscy są zadowoleni.
Problem pojawia się, kiedy w danych pojawia się NULL, NL, CR i być może coś jeszcze (wszystkiego nie sprawdziłem), czyli np:
{63,0,157,242,111}
albo
{85,6,157,13,255}
Takie dane powodują, że ESP nie chce ich wysyłać po Serialu. Pół biedy jeżeli pojawi się ta druga kombinacja, bo dojdą wszystkie bajty oprócz feralnej 13, w przypadku pierwszej kombinacji wszystko za zerem jest ucinane (zero też), w końcu to null.

ESP ma wgrany Nodemcu, kod serwera wygląda tak:

sv:listen(1337,function(c)
c:on("receive", function(c, pl)
print(pl)
end)
end)

Na pewno problem jest po stronie ESP, Arduino kiedy dostaje binarne 0 to ładnie je wypluwa.
Do tego ESP dorzuca do każdej linii 13 i 10 (NL/CR), wie ktoś może jak wyprintować dane bez znaków końca linii? (io.write nic nie daje ( ͡° ͜ʖ ͡°))

#elektronikadiy #elektronika
  • 15
@meetom: potrzebowalbym 2x wiecej wysyłać...
Co w przypadku wysłania danych: {0,0,0,0,0} - taki przypadek też muszę rozważyć.
Spróbuję na innym fw w esp dziś, moze to z nodemcu jest coś nie tak...
@Golomp: No nie, zakładając, że wysyłasz dane od 0 do 255 (jeden bajt), to powiedzmy, że dla 3 "wartości" ("\n", "\0", "\") musisz dodać escape char (czyli poprzedzić dodatkowym bajtem). Czyli statystycznie będziesz wysyłać ok 1% więcej danych (3/256). Pozostałe wartości bez zmian.
@meetom: jak juz to zastapiłbym te wartości innymi, dobrymi a na samym poczatku dodalbym bajt z informacją o tym, które bajty są zmienione.
Slabe rozwiazanie, nie lubie takiego kombinowania, ale jak nie bedzie sie dalo inaczej...
Poprzedzenie dodatkowym bajtem nie zadziała, bo zero i tak wycina mi wszystko za nim :c
@Golomp: Chyba się nie rozumiemy :)
Rozwiązanie może i słabe, ale funkcjonuje od dziesiątek lat.
A po escape char możesz wysłać co innego przecież, chodzi tylko o to, żeby potem to zinterpretować jako zero czy co ram chcesz.

Przykład:
- ryzykowne wartości to 0 i 13.
- escape char to 50

I teraz przykładowo, zastępujesz je tak (zakładając, że 1, 2 i 3 są "bezpieczne"):
0 => 50 + 1
13
@Golomp: Omg, w ogóle się nie rozumiemy :)

0 => 50 + 1

oznacza, że jak napotkasz "0" to wysyłasz "50" oraz "1" :)
Natomiast:

50 + 1 => 0

oznacza, że jak napotkasz (przy odbiorze) "50" to pomijasz i czekasz na kolejny, jeżeli będzie to "1" to wpisujesz gdzie trzeba "0".
@meetom: czyli majac do wysłania
5,20,0,100,100
Wysyłam
5,20,50,1,100,100
Ok
A jak mam np do wysłania:
60,50,2,100,150
To skąd będę wiedział, ze kombinacja 50 i 2 to nie jest escape char? Po liczbie bajtów?
A co przy takich danych do wysłania :
100,50,1,0,100
Wyślę
100,50,1,50,1,100
Skąd mam wiedzieć, które to escape char? :p
@Golomp: Jeszcze raz popatrz na to co Ci napisałem:

0 => 50 + 1
13 => 50 + 2
50 => 50 + 3

Czyli jak chcesz wysłać ciąg
60,50,2,100,150
to wysyłasz:
60,50,3,2,100,150

Jak chcesz wysłać:
100,50,1,0,100
To wysyłasz:
100,50,3,1,50,1,100

Sam sobie wymyślasz czym jest escape char. Jako przykład podałem 50 :)