Ce este Serial.begin (9600)?

Știu că aceasta este pentru a inițializa ceva:

Serial.begin(9600); 

Dar vreau să știi ce înseamnă cu adevărat?

Comentarii

Răspuns

Serial.begin(9600) nu tipărește de fapt nimic. Pentru asta vrei să folosești Serial.print("Hello world!") pentru a tipări textul” Salut Lume!” la consola serială. Mai degrabă inițializează conexiunea serială la 9600 biți pe secundă.

Ambele părți ale conexiunii seriale (adică Arduino și computerul dvs.) trebuie setate pentru a utiliza aceeași conexiune serială de viteză pentru a obține orice fel a datelor inteligibile. Dacă există o nepotrivire între ceea ce cred cele două sisteme, viteza este atunci datele vor fi distruse.

9600 de biți pe secundă este implicit pentru Arduino și este perfect adecvat pentru majoritatea utilizatorilor, dar îl puteți schimba la alte viteze: Serial.begin(57600) ar seta Arduino să transmită la 57600 de biți pe secundă. Trebuie să setați orice software pe care îl utilizați pe computer (cum ar fi Monitorul serial Arduino IDE) la aceeași viteză pentru a vedea datele trimise.

Comentarii

  • Baud și BPS sunt două lucruri diferite … nu pot ‘ să găsesc linkul pe care îl căutam acum.
  • ce se întâmplă dacă pun ” Serial .begin (0); ” sau ” Serial.begin (4000); ” . Adică vreau să știu care este diferența dintre numere?
  • Serial.begin este folosit pentru a seta viteza de comunicare, în biți pe secundă. Un octet este egal cu 8 biți, dar conexiunile seriale trimit un bit de pornire și oprire pentru a identifica începutul și sfârșitul unui anumit octet către sistemul de recepție. Astfel, sunt necesari 10 biți pentru a trimite un caracter. Utilizarea Serial.begin(0) îi spune Arduino că ar trebui să comunice cu serialul la 0 biți pe secundă. Așa cum v-ați putea aștepta, acest lucru înseamnă că Arduino nu va trimite niciodată date. Serial.begin(4000) va determina Arduino să trimită date la 4000 de biți pe secundă. Acest lucru nu este standard, dar altfel este bun.
  • Pe scurt: modificarea numărului modifică viteza. Micșorând numărul (de ex., Serial.begin(300)), Arduino trimite datele mai lent. Creșterea acestuia, să spunem la 57600, va trimite date mai repede. Atât sistemul de trimitere, cât și sistemul de recepție trebuie să fie de acord cu ce viteză să utilizați: programul serial al computerului ‘, precum fereastra Arduino Serial Monitor, vă va permite să setați viteza la care computerul dvs. va primi date, dar puteți selecta doar din viteza obișnuită: 300, 1200, 2400, 4800, 9600, 19200, 38400, 57600 și 11520 biți / sec. Nu puteți ‘ să introduceți alte viteze, cum ar fi 4000. 9600 este de obicei bun.
  • Baud and BPS are two different things... can't find the link I was looking for now. – Aici ‘ o explicație: Anexa C: ” baud ” vs. ” bps ”

Răspunde

O imagine valorează 1000 de cuvinte, așa că se spune (1024 de cuvinte dacă lucrezi cu computere), așa că voi posta câteva imagini …

Am configurat Uno-ul meu pentru a trimite „Fab” la 9600 baud și am capturat rezultatele pe un analizor logic.

Comunicări seriale - 3 litere

Părțile umbrite în roșu reprezintă perioada„ inactivă ”între octeți.

Din nota grafică de mai sus că Linia de date Tx (transmisie) este în mod normal ridicată (1) până când scade jos pentru a indica începutul unui caracter (octet). Acesta este bitul de pornire . Apoi cei 8 biți de date (indicați prin puncte albe) ) apar la viteza de transmisie (9600 de probe pe secundă). După aceea, linia este ridicată din nou. Acesta este bitul de oprire (partea roșie). Apoi vedem bitul de început pentru următorul personaj și așa mai departe. Porțiunea „stop” poate avea o durată nedeterminată, cu toate acestea trebuie să aibă cel puțin o lungime de biți.


Mai multe detalii pentru primul caracter (litera „F” sau 0x46 sau 0b01000110) pot fi văzut aici:

Comunicări seriale - un singur octet

  • A – fără date (Tx este mare)

  • B – „bitul de început”. Linia este scăzută pentru a spune receptorului că un caracter (octet) începe să fie trimis. Receptorul așteaptă o oră și jumătate de ceas înainte de eșantionarea liniei.

  • C – Sosește primul caracter (litera „F” sau 0x46 sau 0b01000110). Nu există bit de ceas ca atare, datele primite sunt eșantionate pur și simplu la viteza de transmisie. Spre deosebire de comunicația SPI, datele ajung mai întâi la bitul cel mai puțin semnificativ (în cazul în care nu trimiteți 8 biți pe octet). Astfel vedem 01100010 (mai degrabă decât 01000110).

  • D – Bitul de oprire. Acest lucru este întotdeauna ridicat, pentru a ne asigura că putem distinge între sfârșitul acestui octet și începutul celui următor. Deoarece bitul de pornire este zero, iar bitul de oprire este unul, există întotdeauna o tranziție clară de la un octet la următorul.

  • E – Bitul de început pentru următorul caracter.


Puteți vedea din captura analizorului logic că T1 - T2 are 0,1041667 ms și, așa cum se întâmplă, adică 1/9600:

1 / 9600 = 0.00010416666 seconds 

Astfel rata de 9600 vă oferă numărul de biți pe secundă iar inversul este intervalul de timp între biți .


Alte considerații

  • Comunicările seriale nu sunt auto-clockate (spre deosebire de SPI sau I2C și altele), prin urmare, atât expeditorul, cât și receptorul trebuie să cadă de acord asupra ratei de ceas.

  • Rata de ceas nu este exactă pe Arduino, deoarece hardware-ul trebuie să împartă ceasul sistemului în jos pentru a obține un ceas serial, iar diviziunea nu este întotdeauna exactă. Aproape întotdeauna există o eroare, suma este dată în foaia de date (cifre citate pentru un ceas de sistem de 16 MHz, cum ar fi pe Uno):

    Eroare la rata de transmisie serial

  • Puteți varia numărul de biți de date, nu trebuie să trimiteți 8 dintre ele, de fapt puteți trimite de la 5 la 9 biți.

  • Opțional poate exista un bit paritate trimis după biții de date.

    • Dacă specificați paritatea „impară”, bitul de paritate este setat în așa fel încât numărul total de 1-biți să fie impar.
    • Dacă specificați paritatea „pare” , bitul de paritate este setat în așa fel încât numărul total de 1-biți să fie egal.
    • Dacă nu specificați nicio paritate, bitul de paritate este omis.

    Acest lucru poate ajuta receptorul să detecteze dacă datele au sosit corect sau nu.

  • Bitul de paritate este trimis înainte de bitul de oprire.

  • În cazul a 9 biți de date (așa cum este utilizat în protocolul SeaTalk), bitul de paritate este refăcut ca un al 9-lea bit de date . Prin urmare, nu puteți avea atât 9 biți de date, cât și un bit de paritate.

  • Puteți avea, de asemenea, doi biți de oprire. Aceasta practic prelungește timpul dintre octeți. În „vechiul” zile „acest lucru a fost astfel încât echipamentele electromecanice lente să poată procesa octetul anterior (de exemplu, pentru a-l imprima).


Posibilă corupție

Dacă începeți să ascultați date seriale în mijlocul unui flux, este foarte posibil ca un 0-bit în mijlocul fluxului să fie interpretat ca un bit de pornire, iar apoi receptorul va interpreta totul în mod incorect.

Singura modalitate reală de a vă recupera din aceasta este să aveți un spațiu suficient de mare, din când în când, (de exemplu, lungime de 10 biți) încât acest lucru nu se poate întâmpla.


Logică inversată

Biții afișați aici (la nivel logic) nu sunt inversați. Adică un 1-bit este HIGH și un 0-bit este LOW. Dacă aveți echipamente RS232 care probabil vor trimite ceva de genul -12 V pentru 1-bit și +12 V pentru 0-bit. Acest lucru este inversat deoarece unul este mai mic un zero, în funcție de tensiune.

Dacă aveți astfel de dispozitive, trebuie să faceți conversia tensiunii și inversarea logică. Cipuri precum MAX232 vor face ambele pentru dvs. De asemenea, pot furniza -12 V necesari pentru a conduce astfel de echipamente, generându-l intern cu ajutorul câtorva condensatoare furnizate de utilizator.


Regula de viteză

Deoarece, cu un bit de pornire, 8 biți de date și un bit de oprire, avem un total de 10 biți, ca regulă rapidă, puteți calcula numărul de octeți puteți transmite într-o secundă împărțind rata de biți la 10.

De ex. La 9600 BPS puteți trimite 960 octeți pe secundă.


Cod de reprodus:

 void setup() { Serial.begin(9600); Serial.print("Fab"); } void loop () { }  

Răspuns

; TLDR; Acesta inițializează portul de comunicație serial și setează rata de transmisie. Dispozitivul cu care comunicați (sau Arduino IDE Serial Monitor) trebuie să fie setat la o rată de transmisie corespunzătoare. Odată ce ați inițializat portul, puteți începe să trimiteți sau să primiți caractere. Referință serială Arduino

Comentarii

  • Să nu diminueze sau să nu respecte @ Nick- Gammon ‘ acoperă excelent acest subiect.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *