Index
Index forum Index forum
Autentificare Autentificare
Inregistrare Inregistrare
Cine este online Cine este online
Galerie imagini Galerie imagini
Calendar evenim. Calendar evenim.
Cautare detaliata Cautare detaliata
Ghid forum Ghid forum
Album astrofoto
Cu_luneta_spre_luna_5.JPG
Imagine aleatoare
Blog
Inregistreaza-te pe forumul astronomy.ro
Colaboratori

Te intereseaza un domeniu al astronomiei si ai vrea sa scrii pentru siteul nostru? Alatura-te echipei noastre.

Meteo
Vremea in Bucuresti
Statistici forum
Numar total de mesaje in forum: 224027
Numar de utilizatori inregistrati: 2824
Cel mai nou utilizator inregistrat: Dan.M
Cei mai multi utilizatori conectati au fost 502 la data de Joi Mar 28, 2024
Actualmente sunt 0 utilizatori pe chat   
Aceste date se bazeaza pe utilizatorii activi de peste 5 minute
Legenda
Mesaje noi Mesaje noi
Nu sunt mesaje noi Nu sunt mesaje noi
Forumul este inchis Forumul este inchis

Adaptor pentru SkySafari


Du-te la pagina 1, 2  Urmatoare
Creaza un subiect nou   Raspunde la subiect  

DIY / ATM / Reparatii

Subiectul anterior :: Subiectul urmator  
Afiseaza mesajele pentru a le previzualiza:   
Autor Mesaj
Sorin Sfartz
Membru
Membru


Data inscrierii: 10 Sep 2008
Mesaje: 366



Localitate: Onesti

MesajTrimis: 18 Oct 2018 23:13 Download mesaj
Titlul subiectului: Adaptor pentru SkySafari
Raspunde cu citat (quote)

Cei care doresc sa foloseasca pentru controlul monturii programul SkySafari, instalat pe telefon/tableta, sunt obligati sa isi cumpere un adaptor wifi sau bluetooth care de regula sunt destul de scumpe.

M-am gandit la cateva variante mai ieftine si nu foarte dificil de realizat. Toate variantele au fost testate pe montura CGEM si au functionat ok. In principiu ar trebui sa functioneze si la alte monturi. Conexiunea la montura sa face via portul serial RS232 care este disponibil la montura CGEM la capatul telecomenzii. Multe monturi "goto" dispun de un astfel de port. Pentru conexiunea la acest port este necesar un adaptor TTL/RS232 care se gaseste la pretul de 3-4eur (poate si mai ieftin prin China). Eu am folosit adaptoare bazate pe chipul MAX3232 si au functionat foarte bine. CGEM are si un port auxiliar care este identic cu cel in care se introduce telecomanda, insa acest gen de port este un port serial TTL prin care se comunica cu un alt tip de protocol, decat acelea folosite de programele de planetariu. Folosirea unui astfel de port ar elimina nevoia adaptorului RS232, insa in acest caz ar trebui scris un software care sa replice exact ceea ce face telecomanda.

Adaptoarele RS232/TTL pe care le-am folosit aveau toate port serial cu 9 pini tip mama. Cablul de la montura are si el tot o mufa db9 mama deoarece este gandit sa fie conectat la un port serial de la pc, care de obicei este tata. Eu nu am gasit adaptor rs232/ttl tata, astfel ca in teste am pus niste fire de conexiune intre mufe. Conexiunea se poate face mai elegant cu 2 mufe db9 de tip tata cu firele conectate corect. Pinul 5 (Gnd) al adaptorului trebuie conectat la pinul 5 al monturii. Pinul 2 al adaptorului trebuie conectat la pinul 3 al monturii si pinul 3 al adaptorului la pinul 2 al monturii.
In partea TTL, adaptorul se conecteaza la un microcontroler care la randul sau este conectat la un adaptor wireless (bluetooth sau wifi).

In prima varianta am folosit o placuta arduino nano (o clona chinezeasca care costa pe aliexpress cca 2usd). Aceasta are conectati pinii 8 si 9 la pinii Tx si respective Rx ai modulului Bluetooth HC-05. Modulul bluetooth HC-05 costa pe la noi cca 30 lei insa pe aliexpress se gasesc cu 2.5-3usd.
Placa arduino nano are de asemenea pinii 10 si 11 conectati la pinii Tx si Rx ai modulului RS232. Uneori aceste module RS232 au logica inversata astfel ca in acest caz se conecteaza Rx la Rx si Tx la Tx. Pinii Rx, Tx ai modulului HC-05 functioneaza la 3.3V, astfel ca pinul Rx al lui HC-05 trebuie protejat, deoarece pinul Tx al lui arduino nano are 1logic = 5V. Pt aceasta am pus 2 rezistente intr-un divizor rezistiv, pt ca la iesirea arduino sa avem 3.3V. Pinul Rx al lui nano interpreteaza fara probleme 3.3V de la HC-05 ca 1 logic. In fine problema finala e alimentarea. O varianta simpla ar fi conectarea placii nano direct la pinul Vin cu +12V si folosirea iesirii de 5V pt a alimenta atat modulul HC-05 cat si adaptorul RS232. O placa autentica ar putea merge asa, insa clonele nano testate de mine au un regulator de tensiune foarte prost care se arde foarte repede. Astfel ca am adaugat un regulator LM7805 care alimenteaza toate placile cu 5V. Aceste regulatoare costa de regula maxim 1euro.

Am atasat o poza cu conexiunile si o poza cu montajul de test. Realizarea acestuia mi-a luat vreo 15 minute si m-a costat: adaptor RS232 3 euro + modul HC-05 30 lei (in china se gasesc mult mai ieftin) + clona arduino nano 1.5euro + LM7805 0.5 euro = cca 12 euro.
Cea mai laborioasa parte a fost scrierea softului care functioneaza ca un bridge intre HC-05 si adaptorul RS232.



1.montajHC05.jpg
 Descriere:
 Marime fisier:  87.58 kb
 Vizualizat:  de 7262 ori

1.montajHC05.jpg



2.montajHC05.jpg
 Descriere:
 Marime fisier:  113.12 kb
 Vizualizat:  de 7262 ori

2.montajHC05.jpg



hc5-nano-rs232.jpg
 Descriere:
 Marime fisier:  88.12 kb
 Vizualizat:  de 7262 ori

hc5-nano-rs232.jpg


Sus
Sorin Sfartz
Membru
Membru


Data inscrierii: 10 Sep 2008
Mesaje: 366



Localitate: Onesti

MesajTrimis: 18 Oct 2018 23:35 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

Am folosit portul hardware serial pentru debug si 2 biblioteci software serial diferite, deorece software serial clasic din arduino nu functioneaza cu 2 porturi simultan. Pentru incarcarea programului in arduino nano trebuie instalat mai intai arduino IDE de pe pagina oficiala:

https://www.arduino.cc/en/Main/Software

Apoi trebuie adaugata bibiloteca aditionala altsoftserial scrisa de Paul Stoffregen :

https://github.com/PaulStoffregen/AltSoftSerial

Se face download in format zip, se extrage folderul care e denumit AltSoftSerial-master si care trebuie redenumit AltSoftSerial. Folderul redenumit trebuie pus in folderol Arduino/libraries care de regula e instalat in folderul Documents. Dupa aceasta programul poate fi incarcat in arduino ide. Pt cei care nu au mai folosit arduino ide: odata cu conectarea placii nano la pc, un nou port COM apare disponibil si trebuie selectat in meniul Tools/Port. Apoi trebuie selectata placa in meniul Tools/Boards - Arduino Nano. La unele versiuni ide trebuie selectat si daca este un chip de tip vechi sau nou.

Dupa toate aceste preliminarii simple se apasa butonul Upload si daca totul merge bine apare intr-o bara mai jos mesajul Done Uploading. Apoi placa este gata de functionare.

In dispozitivul mobil se face conexiunea cu HC-05 care odata alimentat devine vizibil in lista de dispozitive bt. In SkySafari se configureaza la conexiune - BlueTooth. Conectarea dureaza putin mai mult la inceput deorece modulul HC-05 trimite la inceput cateva caractere de initializare care trebuie ignorate. Insa dupa 1-2 secunde, SkySafari se conecteaza si functioneaza bine chiar si la o rata maxima (10 cereri de coordonate/sec).

Am atasat programul instalat in placa arduino nano. Este in format pdf pt ca forumul nu permite atasarea altor soiuri de fisiere. In arduino ide se deschide un nou sketch si se goleste de continut. Apoi se copiaza in el continutul din fisierul pdf (fara prima linie de titlu) se salveaza si apoi se face "upload".



HC05-ArduinoNano-RS232.pdf
 Descriere:

Descarcare
 Nume fisier:  HC05-ArduinoNano-RS232.pdf
 Marime fisier:  24.29 kb
 Descarcat:  de 178 ori

Sus
Sorin Sfartz
Membru
Membru


Data inscrierii: 10 Sep 2008
Mesaje: 366



Localitate: Onesti

MesajTrimis: 19 Oct 2018 00:23 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

Varianta nr.2

Cea mai ieftina varianta testata, implica renuntarea la un microcontroler si folosirea unui modul wifi ieftin de tip ESP8266. Aceste module au inclus un microcontroler mult mai rapid decat arduino, care cu ceva efort poate fi programat pentru a face el conexiunea intre modulul wifi si portul serial.

Exista module ESP8266 configurate ca placi de dezvoltare cu o multime de intrari/iesiri, etc. Insa eu am folosit cel mai ieftin modul care are doar 8 pini : Rx, Tx, Vcc, Gnd, Reset, Enable,GPIO0,GPIO2. Placuta poate fi programata cu un adaptor USB-TTL sau daca aveti o placa arduino uno,aceasta poate fi folosita ca un adaptor USB-TTL conectand pinul reset la Gnd. In acest caz se conecteaza pinul Tx al lui 8266 la pinul Tx al lui Uno si respectiv Rx la Rx. Daca folosim un adaptor USB-TTL conectam Rx la Tx si Tx la Rx. Majoritatea documentatiilor avertizeaza ca ESP8266 functioneaza doar la 3.3V. Placuta trebuie alimentata la 3.3V, dar cel putin doar pentru partea de upload a programului se poate folosi iesirea Tx de 5V a lui Uno fara probleme. Daca folosim un adaptor usb-ttl, acesta trebuie setat din jumperi sa aiba 3.3V la iesiri (majoritatea adaptoarelor permit aceasta). In arduino ide trebuie selectata placa generic ESP8266 module, upload speed 115200 si portul COM. Pentru progamarea lui ESP8266, in plus fata de conectarea adecvata a pinilor seriali Rx si Tx, trebuie conectat GPIO0 la Gnd, INAINTE de alimentarea placii. Astfel placuta cu pinul GPIO0 conectat la Gnd va intra la alimentare in modul de programare.

Dupa incarcarea programului in modul, acesta se conecteaza direct la adaptorul RS232. Am atasat poze cu schema si cu montajul de test. Programul configureaza un server care va comunica prin protocolul TCP cu clientul (skysafari). In skysafari se introduce adresa ip a serverului (192.168.4.22)si portul 80. Acestea,cat si numele retelei create de 8266 pot fi schimbate in program.

Placuta este foarte rapida, astfel ca la citirea datelor ce vin de la montura CGEM, trebuie intarziat putin procesul de citire pentru ca toate datele sa ajunga in bufferul serial. Am mentionat aceasta, pt ca pentru alte monturi aceste valori ar putea fi nevoie sa fie adaptate. Pt CGEM e nevoie de un delay de 2ms dupa fiecare byte citit. Acelasi lucru e valabil si la citirea datelor din modulul bluetooth din montajul precedent.

Costul acestei variante este de cca 5euro.
Avantajul acestei variante este ca are nevoie doar de 2 componente si este ieftina. Dezavantajul este ca programarea lui ESP8266 e putin mai complicata. In plus acest modul se mai blocheaza uneori si are nevoie de un reset. Poate e o problema doar cu modulul pe care l-am folosit eu.



montajESP8266.jpg
 Descriere:
 Marime fisier:  106.25 kb
 Vizualizat:  de 7236 ori

montajESP8266.jpg



esp8266-rs232.jpg
 Descriere:
 Marime fisier:  71.93 kb
 Vizualizat:  de 7236 ori

esp8266-rs232.jpg



ESP8266-TCP-RS232.pdf
 Descriere:

Descarcare
 Nume fisier:  ESP8266-TCP-RS232.pdf
 Marime fisier:  24.7 kb
 Descarcat:  de 197 ori



Ultima modificare efectuata de catre Sorin Sfartz la 19 Oct 2018 09:39, modificat de 1 data in total
Sus
Sorin Sfartz
Membru
Membru


Data inscrierii: 10 Sep 2008
Mesaje: 366



Localitate: Onesti

MesajTrimis: 19 Oct 2018 00:26 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

Iata si un filmulet care arata cum functioneaza varianta 2 - cu ESP-8266

https://www.youtube.com/watch?v=etEBoD1yIrg&feature=youtu.be


Ultima modificare efectuata de catre Sorin Sfartz la 19 Oct 2018 09:18, modificat de 1 data in total
Sus
Sorin Sfartz
Membru
Membru


Data inscrierii: 10 Sep 2008
Mesaje: 366



Localitate: Onesti

MesajTrimis: 19 Oct 2018 00:41 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

In final am testat o varianta similara cu varianta 2, insa in loc de ESP8266, am folosit un modul ESP32, care s-a nimerit sa fie prin sertar. S-ar putea folosi o placa de dezvoltare bazata tot pe ESP8266 cu acelasi program de conectare prin wifi. In testul facut de mine am facut conexiunea prin bluetooth (modulul ESP are si wifi si bluetooth). Aceste placi sunt mai usor de programat avand port usb. Placa testata de mine nu era ieftina - era un model Huzzah esp32 de la Adafruit, insa exista in china astfel de placute la cca -5-6 euro. O sa incerc sa comand o clona chineza si sa o testez.


esp32-rs232.jpg
 Descriere:
 Marime fisier:  73.7 kb
 Vizualizat:  de 7218 ori

esp32-rs232.jpg



esp-rs232.pdf
 Descriere:

Descarcare
 Nume fisier:  esp-rs232.pdf
 Marime fisier:  23.19 kb
 Descarcat:  de 177 ori



Ultima modificare efectuata de catre Sorin Sfartz la 19 Oct 2018 09:19, modificat de 1 data in total
Sus
nobody
Membru
Membru


Data inscrierii: 02 Apr 2010
Mesaje: 4776

Motto: Never ever give up !

Localitate: Nowhere

MesajTrimis: 19 Oct 2018 01:48 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

Ce rol are firstChar=='$' ?
Sus
Sorin Sfartz
Membru
Membru


Data inscrierii: 10 Sep 2008
Mesaje: 366



Localitate: Onesti

MesajTrimis: 19 Oct 2018 08:12 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

Pai e o conditie care verifica daca comanda primita de la SkySafari incepe cu ´$´. Modulul bluetooth trimite la initializare un sir de genul $$$, care perturba comunicatia cu montura. Din cauza lui nu se conecta SkySafari. Daca sirul inStrWifi (care ipotetic contine comanda trimisa de skysafari), incepe cu $, se citesc in continuare caractere din sir pana se termina toate caracterele ´$´. Orice insiruire de 2 sau mai multi dolari e ignorata. Apoi in eventualitatea in care in buffer s-au acumulat dupa sirul de caractere $$$ si alte caractere utile, dupa ce se termina toti dolarii sunt acumulate (eventualele caractere utile) in alt sir (realString) care este trimis la montura ca si comanda.

Nu sunt sigur ca asta e abordarea cea mai buna. Daca or exista protocoale care sa inceapa cu $$ sau cu $$$ sau $$$$ etc, programul asta va ignora astfel de secvente. Prima data am exclus complet orice $ din comenzile primite, dar chestia asta nu merge pentru ca protocolul celestron trimite si caractere $ in comenzile de slew de exemplu. In fapt protocolul asta celestron e cel mai idiot protocol pe care l-am vazut: trimite zeci de caractere netiparibile - daca nu te uiti la byte-ul efectiv receptionat, nici nu stii ce e acolo. In plus cel mai agasant e faptul ca nu foloseste terminatori. ioptron termina orice comanda cu #. Skywatcher incepe orice comanda cu : si o termina cu CR. Ideea e ca daca apar erori la transferul de date, in protocoalele normale stii sa izolezi datele utile, stii daca pachetul de date e corupt etc. La celestron nu stii nimic. Iar daca trimiti ceva eronat la montura, aceasta incepe sa raspunda haotic si trimite sute de caractere complet aiurea. Cel putin CGEM-ul meu asa face.
Sus
Sorin Sfartz
Membru
Membru


Data inscrierii: 10 Sep 2008
Mesaje: 366



Localitate: Onesti

MesajTrimis: 19 Oct 2018 09:04 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

M-am uitat abia acum pe fisierele cu codul sursa pe care le-am atasat si am vazut ca multe linii de comentariu au fost sparte, astfel ca ele incep pe un rand si continua pe urmatorul rand. Daca o sa puneti codul in IDE va trebui sa stergeti enter-ul care rupe linia de comentariu, sau sa stergeti comentariul cu totul, altfel vor aparea erori la compilare. La fel stau lucrurile si cu numarul de pagina din fisierul pdf si cu prima linie de titlu, care au fost adaugate la crearea pdf-ului. Trebuie sters orice nu e instructiune valida.

Imi pare rau, dar nu am gasit alta metoda sa atasez programele. Forumul nu permite atasarea fisierelor text sau .ino sau .C etc
Sus
nobody
Membru
Membru


Data inscrierii: 02 Apr 2010
Mesaje: 4776

Motto: Never ever give up !

Localitate: Nowhere

MesajTrimis: 19 Oct 2018 16:44 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

Se pare ca secventa aia de "$$$" o trimite chiar SkySafari.
E "escape sequence" pentru modulul Wifly (similar cu "+++" la modemuri).

Protocolul de la Celestron (NexStar) este folosit si de Skywatcher.
Ala cu ":..#" cred ca e LX200 de la Meade.
Protocolul NexStar contine si date in format binar, nu doar ASCII.
Comenzile au o lungime predeterminata. Raspunsurile de la HC se termina cu "#".

Este o problema cu felul cum ai folosit acel buffer. Un mesaj binar nu e bine sa-l stochezi intr-un string pentru ca daca iti apare un caracter 0x00 (NULL), acesta are o semnificatie speciala, inseamna sfarsitul stringului. Cand se citeste stringul respectiv, citirea se va opri la NULL. Practic vei ramane cu un mesaj trunchiat.

Am testat pe Skywatcher sa-i trimit dolari, ii ignora complet. Cre' ca accepta numa' Euro. Laughing
Sus
Sorin Sfartz
Membru
Membru


Data inscrierii: 10 Sep 2008
Mesaje: 366



Localitate: Onesti

MesajTrimis: 19 Oct 2018 18:02 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

Secventa aceea apare la conexiunea bluetooth, nu la wifi. Daca secventa $$$ o trimite SkySafari e o prostie din partea dumnealui, pentru ca nici o montura nu asteapta asa ceva. Poate ca Skywatcherul ignora caracterele acelea, insa CGEM-ul meu o ia complet razna daca ii trimiti ce nu vrea el. Sau poate ca e o secventa special gandita pentru SkyBT-ul ala al lor si in cazul asta secventa nici nu ar trebui sa ajunga la portul serial.

Asa este, m-am grabit, protocolul telecomenzii skywatcher e la fel cu nexstar. Acela de care am spus eu e protocolul intern al lui skywatcher, adica cum discuta telecomanda cu placa lui interna.

Comenzile in protocolul nexstar nu au o lungime predefinita. De exemplu V#-versiune, e-solicitarea pozitiei, iar comenzile de slew au chiar si 8 caractere.Insa intr-adevar, ceea ce vine de la montura se termina cu #. Si intr-adevar sunt o multime de caractere speciale cum deja am spus, ceea ce poate fi neplacut. De exemplu intr-o prima abordare in care am cautat sa evit programarea modulului esp8266 am incercat sa folosesc comenzi AT, dar din cauza caracterelor non standard ASCII nu a functionat.

De asta la primele teste am folosit un array de bytes. Intr-adevar daca vreo-un protocol ar folosi ´/0´ asta ar da peste cap totul. Dar sper ca nici un creator de protocoale nu va fi atat de ... ma rog. In primele 2 programe nu am folosit array´s. Doar in ultimul (care de fapt o fost primul test) le-am uitat. O sa le schimb si pe acelea ca la primele 2.
Sus
nobody
Membru
Membru


Data inscrierii: 02 Apr 2010
Mesaje: 4776

Motto: Never ever give up !

Localitate: Nowhere

MesajTrimis: 19 Oct 2018 20:18 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

Cand am zis lungime predefinita, m-am referit ca fiecare mesaj are o lungime cunoscuta, nu ca toate mesajele au aceeasi lungime fixa. De ex. comanda "V" are lungimea 1, tot timpul. Comenzile de slew au tot timpul lungimea de 8 caractere, din care ultimele doua sunt ... chr(0) & chr(0).

Daca vrei sa setezi sau sa citesti ora ... iar dai de 0x00, uite chiar acum o captura de pe portul serial (sunt si valorile in hexa):
Cod:
Comanda:
h
68

Raspuns:
 Q  :  * <1><1><n> V <0> #
51 3A 2A 01 01 0A 56 00 23


Explicatia:
The format of the time commands is: QRSTUVWX, where:
Q is the hour (24 hour clock). [poate fi 0]
R is the minutes. [poate fi 0]
S is the seconds. [poate fi 0]
T is the month.
U is the day.
V is the year (century assumed as 20). [mai rar 0]
W is the offset from GMT for the time zone. Note: if zone is negative, use 256-zone.
X is 1 to enable Daylight Savings and 0 for Standard Time.
For example, to set the time to 3:26:00PM on April 6, 2005 in the Eastern time zone (-5 UTC: 256-5 = 251) you would send:
“H” & chr(15) & chr(26) & chr(0) & chr(4) & chr(6) & chr(5) & chr(251) & chr(1)

Vezi documentatia de la protocol, e plin de NULL sau valori care pot fi NULL (zero binar):



NexStarCommunicationProtocolV1.2.pdf
 Descriere:

Descarcare
 Nume fisier:  NexStarCommunicationProtocolV1.2.pdf
 Marime fisier:  54.12 kb
 Descarcat:  de 154 ori

Sus
Sorin Sfartz
Membru
Membru


Data inscrierii: 10 Sep 2008
Mesaje: 366



Localitate: Onesti

MesajTrimis: 19 Oct 2018 22:51 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

Da, am citit si eu protocolul ala. Si nu imi place deloc. E complet neintuitiv. Parerea mea. Ce om normal ar raspunde la comanda V# (adica versiunea monturii) cu chr(major) & chr(minor) & “#”? Nemaivorbind ca pana sa verific ce trimite CGEM, eu nu mi-am dat seama ce sunt minor si major acelea.
Sau de ce trebuie o banala comanda de slew sa fie asa: “P” & chr(2) & chr(16) & chr(36) & chr(rate) & chr(0) & chr(0) & chr(0)? Poate e doar o chestiune de gusturi.

In fine chiar daca se trimit o gramada de NULL - uri in protocolul ala, nu e nici o problema din mai multe motive:

1. Bufferul este un array de bytes. Asignarea valorii zero in orice pozitie din array nu are nici o importanta.
De altfel o buna dovada pentru lucrul asta, este ca programul merge perfect. Am testat toate slew-urile si functioneaza perfect. Daca un singur caracter in comanda aia tampita ar fi gresit, sau ar lipsi, CGEM-ul meu ar lua-o complet razna. Stiu asta pt ca am verificat. CGEM-ul in primul rand intra in asteptare mult timp, astfel ca skysafari se deconecteaza, iar apoi incepe sa verse pe portul serial sute de caractere aiurea.

2. Chiar daca bufferul ar fi un string C, adica un array de caractere, asignarea unui NULL intr-o pozitie oarecare, iarasi nu influenteaza cu nimic datele, caci imediat s-ar scrie un nou caracter in pozitia urmatoare, deci nu ar conta ca scrierea unui zero sterge tot ce urmeaza dupa el.

3. Am mari dubii ca scrierea unui NULL in momentul rularii programului are vreo influenta. Banuiesc ca trebuie sa declari explicit in program buffer[10]='\0'; pentru ca compilatorul sa anuleze tot ce ar fi dupa indexul 10. Daca array-ul este definit de la inceput de o anumita marime fixa, de unde sa stie compilatorul ce o sa puna ulterior portul serial intr-o pozitie oarecare in array? Eu cred ca array-ul va ramane cu valorile scrise din portul serial asa cum au venit. Ar putea fi intr-adevar o problema daca s-ar apela functii pentru stringuri care cauta caracterul null.

4. Nici in varianta declararii unui string cu "String sir=..." nu are importanta daca concatenam la momentul rularii programului un NULL. Sa presupunem ca sirul este: a, b, NULL, c, d. Dupa concatenare el va arata astfel: ab cd.

Eu am pus array-ul acela de bytes din varianta 3 chiar in primele teste, din dorinta de a nu exista ambiguitati vizavi de cum e interpretat un caracter sau altul. Apoi am vazut ca merge si cu stringuri declarate cu String si codul e mai simplu. Insa acum daca ma gandesc mai bine, cea mai de incredere varianta e tot aceea cu array-ul de bytes. Nu e nici un dubiu vizavi de o valoare a unui numar intreg intre 0 si 255.
Sus
topacid
Membru
Membru


Data inscrierii: 06 Apr 2009
Mesaje: 253



Localitate: Bacau/Bucuresti

MesajTrimis: 19 Oct 2018 23:56 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

Foarte mișto Very Happy
_________________
Takahashi TSA102, FSQ85 Baby-Q, iOptronCEM60, 150/1000, Generic 8" Dob, OO 200mm f4.5, ASI120MMS,1600MM cu filtre, 19 Pan, Pentax5mm XW,28 UWAN, 8mm TeleVue Plossl, 13mm T6 Nagler, 3.5, 6, 10 Delos,
Sus
nobody
Membru
Membru


Data inscrierii: 02 Apr 2010
Mesaje: 4776

Motto: Never ever give up !

Localitate: Nowhere

MesajTrimis: 20 Oct 2018 02:45 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

Vorbeam de prima varianta cu bluetooth unde incerci sa speli dolarii.

La acelasi String poti adauga NULL, dar cand incepi sa folosesti functii de manipulare, acel string devine impredictibil dupa primul NULL.

Cod:

  char mightynull = 0 ;
 
  String string_1 = "$$$String_1_";
  string_1 += mightynull ;
  string_1 += "LOSTINVAIN";
  Serial.println(string_1);
  Serial.println(string_1.length());

  String string_2 = "WTF_";
  string_2 += string_1;
  Serial.println(string_2);
  Serial.println(string_2.length());
 
  String string_3 = "HMMMMM";
  string_3 = string_1.substring(3, 23);
  Serial.println(string_3);
  Serial.println(string_3.length());



Rezultat:
Cod:

$  $  $  S  t  r  i  n  g  _  1  _ <0> L  O  S  T  I  N  V  A  I  N
24 24 24 53 74 72 69 6E 67 5F 31 5F 00 4C 4F 53 54 49 4E 56 41 49 4E
Lungime: 23, s-a pastrat si ce-i dupa NULL

W  T  F  _  $  $  $  S  t  r  i  n  g  _  1  _  <0>_ <0> I  N <0><n><0><0><0> r
57 54 46 5F 24 24 24 53 74 72 69 6E 67 5F 31 5F 00 5F 00 49 4E 00 0A 00 00 00 72
Lungime: 27 OK, dar s-a alterat continutul dupa NULL

S  t  r  i  n  g  _  1  _
53 74 72 69 6E 67 5F 31 5F
Lungime:9, trebuia sa fie 20, dar e trunchiat de la NULL



In C, unde apare primul '\0' intr-un string, acolo se considera terminat. Asta n-are treaba cu compilatorul, ci cu conventiile din bibliotecile standard.

In fine, fa cum vrei.
Sus
Sorin Sfartz
Membru
Membru


Data inscrierii: 10 Sep 2008
Mesaje: 366



Localitate: Onesti

MesajTrimis: 20 Oct 2018 14:33 Download mesaj
Titlul subiectului:
Raspunde cu citat (quote)

Ah. Nu imi dadusem seama despre ce parte vorbeai. Ok. O sa schimb stringul ala intr-un array de bytes precum in var.3. E mai sigur asa intr-adevar. Dar asta inseamna ca trebuie sa retestez totul.

"In C, unde apare primul '\0' intr-un string, acolo se considera terminat. Asta n-are treaba cu compilatorul, ci cu conventiile din bibliotecile standard. "

Stiu asta. Este elementar. Totusi are treaba si cu compilatorul. In exemplele tale compilatorul "stie" ca in primul sir este un null, pentru ca tu ai initializat sirurile in felul ala. Pe masura ce concatenezi sirurile se vor altera tot mai mult pentru ca compilatorul "stie" de acel null si nu aloca resurse pentru ce e dupa el. Insa daca compilatorul e instruit doar sa primeasca caractere pe portul serial, nu va sti si nu ii va pasa de ceea ce vine pe acolo. Poti acumula ce vine in orice fel de string si sirul nu va fi corupt pt ca compilatorul aloca corect spatiu pentru insiruirea de caractere ce vine de la serial. De asta primele 2 variante functioneaza totusi ok, chiar si cu protocolul acela aiurit.
Un astfel de sir primit pe portul serial va fi considerat "terminat" la null, doar de functiile de manipulare a stringurilor care cauta astfel de caractere. Insa in programele mele nu exista astfel de functii, pt ca programul este doar un banal bridge de transfer de date.
Sus
Afiseaza mesajele pentru a le previzualiza:   
Creaza un subiect nou   Raspunde la subiect   DIY / ATM / Reparatii Du-te la pagina 1, 2  Urmatoare

Download topic
Pagina 1 din 2
 
Mergi direct la:  
Nu puteti crea un subiect nou in acest forum
Nu puteti raspunde in subiectele acestui forum
Nu puteti modifica mesajele proprii din acest forum
Nu puteti sterge mesajele proprii din acest forum
Nu puteti vota in chestionarele din acest forum
Nu puteti atasa fisiere in acest forum
Puteti descarca fisiere in acest forum
© 2015 astronomy.ro
Termeni si conditii generale      Termeni si conditii forum      Contact