Orei bune a zilei!
Vreau să pun în aplicare un protocol de transfer de date în care datele vor fi transmise prin uart cu un singur pachet de 9 biți.
Structura parcelei ar trebui să fie după cum urmează:
0 - bit inițial
5. 7 - trei biți de date
8 - stop bit
Cât de bine să implementați?
Apoi nu va mai exista un alt subiect, cum ar fi "de ce nu iau ceea ce am trimis"
Ei bine, oamenii spun că astfel de lucruri nu se fac. Deci acum sunt confuz :)
Desigur, puteți încerca, urmărind datele din autobuz etc. poate și, de fapt, în 1 octet pot păstra înăuntru. Pentru depanarea "nu o soluție standard" am un analizor de jurnal.
Încă de la început, am pășit cu adevărat, gândindu-mi că biții de start și de stop ar trebui să fie conținute în interiorul pachetului (date): rolleyes:
Acest lucru va permite în viitor (și cel mai probabil acest lucru se va întâmpla) pentru a schimba numărul de echipe la sclavi și poate doriți să transmiteți răspunsul de la sclav.
De ce 8bit, dar nu 9? Este mai ușor să prindă "un computer obișnuit, iar nevoia este probabil să apară.
Protocolul total către dvs.:
transfer de la maestru la sclav
Primul octet -
Al doilea octet -
.
Al doilea octet -
Răspunsul de la sclav la maestru este exact același (dacă este nevoie)
Primul octet -
Al doilea octet -
.
Al doilea octet -
în această structură, puteți transfera date "normale" (scurte, lungi) - prin ambalarea mai multor octeți (există și opțiuni, puteți schimba datele, puteți împacheta cei mai biti din ultimul byte al datelor).
În contul datelor, selecțiile de date și octeții de pe:
există un astfel de lucru ca o structură și uniune.
În cazul tău, poate fi scris ca:
struct
reușită. 4;
s-au înscris char Data. 4;
> Pac;
// acces la câmpuri:
Pac.Addr = 0;
Pac.Data = 5;
În cazul meu:
#define DATA_LEN 1
struct
caracterele nesignificate;
caracterele nesignificate Data [DATA_LEN];
caracterele de date nesignificate; // numărul de date primite
> Pac;
În varianta mea, recepția și prelucrarea vor deveni mai complicate. dacă nu aveți nevoie de ea - opriți-vă pe versiunea originală.
PS Respect față de student, nu fiecare student absolvent (un inginer începător) are o astfel de problemă.
Este bine ca totul să coincidă, exact ceea ce are nevoie TS. Și fiabilitatea este testată pe milioane de mostre, iar împăratul galaxiei a certificat chiar totul. Si poti cumpara o solutie gata;) Si ne tindem creierul. Ți-am spus că unde a trecut creasta, evreul nu are nimic de făcut. Și site-ul a fost ucrainean. ) Bine facut.
Este bine ca totul să coincidă, exact ceea ce are nevoie TS. Și fiabilitatea este testată pe milioane de mostre, iar împăratul galaxiei a certificat chiar totul. Si poti cumpara o solutie gata;) Si ne tindem creierul. Ți-am spus că unde a trecut creasta, evreul nu are nimic de făcut. Și site-ul a fost ucrainean. ) Bine facut.
Nu înțeleg de ce aparține oricărei naționalități. Site-ul citat, deoarece descrierea este într-o limbă accesibilă, care este mai ușor de înțeles. Fără gânduri unde este, există un site și un bun.
Certificarea are legătură cu aceasta. Cum atinge subiectul.
Cine vorbea despre vânzare sau cumpărare?
Și faptul că o mulțime de echipamente lucrează la acest protocol, așa că da, așa este.
Nimeni nu îi obligă pe TS să "prindă" protocolul sau să aplice, dar este posibil să împrumute ideea, mai ales "2. Totul a fost deja divorțat / cumpărat".
1. Toate dispozitivele de pe o placă.
2. Totul a fost deja crescut / cumpărat.
3. Pot face fără confirmare
Acest lucru va permite în viitor (și cel mai probabil acest lucru se va întâmpla) pentru a schimba numărul de echipe la sclavi și poate doriți să transmiteți răspunsul de la sclav.
De ce 8bit, dar nu 9? Este mai ușor să prindă "un computer obișnuit, iar nevoia este probabil să apară.
Despre transferul de 8 biți sunt de acord, deși dacă nu schimb memoria, modulul de recepție / transmisie pe 9 biți poate fi inclus în parametrii aceluiași FT232 (usb-uart). Nu am avut nevoie de un mod pe 9 biți :) Nu am înțeles structura de pachete de la început și am crezut că biții de start și stop sunt incluși în aceste 8-9 biți împreună cu informațiile din pachet (în byte): o
Dar în necesitatea a doi sau mai mulți octeți nu sunt încă sigur. În primul rând, numărul de dispozitive din autobuz nu va fi mai mare de 16, iar în al doilea rând, 16 echipe vor fi mai mult decât suficiente pentru o astfel de sarcină non-trivială.
De fapt, de la comandant, trebuie să trimit următoarele seturi de comenzi:
1 [111] - setat la RC2 la nivel înalt, adică. activați canalul
2 [000] - setați RC2 la un nivel scăzut. opriți canalul
3 [001] - trimiteți un impuls de lungime de 10 ms la RC1
4 - aplicați un impuls RC1 cu o lungime de 50 ms
5 [100] - starea solicitării RC1
6 [101] - solicitați statutul de RC2
7 [110] - abandonați dispozitivul înainte de a reporni, adică opriți canalul și nu primiți comenzi.
La rândul său, sclavul va trimite următorul set de răspunsuri comandantului;
I [111] - canalul a fost activat cu succes (răspuns pozitiv la comanda 1)
II [000] - canalul a fost oprit cu succes (răspuns pozitiv la comanda 2)
III [001] - se aplică pulsul radiant (răspuns pozitiv la comenzile 3, 4)
IV - supracurent! (răspuns negativ la comenzile 1, 2, 3, 4)
V [100] - on (răspuns la comenzile 5, 6)
VI [101] - oprit (răspuns la comenzile 5, 6)
De fapt nu văd sensul în 2 și mai mulți octeți, algoritmul sistemului este simplu și nu necesită transferul de informații grele.
Cu o astfel de redundanță, nu există nici un sens în suma de control, puteți repeta mesajul. Bineînțeles, verificarea corectitudinii pachetului din partea receptorului este foarte bună.
Toate acestea vor funcționa astfel:
Să presupunem că trebuie să activați canalul pe cel de-al patrulea slave (0100 - ID = 4).
Pentru aceasta, o comandă cu următorul conținut este trimisă de la dispozitivul principal:
După această premisă, există încă o sumă de control, pentru a număra suma de control, pentru a număra toate 1 în prima premisă și pentru a le multiplica cu 3, apoi numărul zecimal rezultat este codificat într-un număr zecimal.
În cazul nostru, cea de-a doua premisă are forma:
11110000
[01234567]
unde
0. 3 - 15 în sistemul binar (5 * 3)
7 - pavilion egal cu 0 (desemnarea unui octet cu o sumă de control)
Acum am două întrebări pentru dvs.:
1. Sunt eu idiot?
2. Cum să implementați acest lucru în C? În mod specific, nu înțeleg cum poate fi împărțită parcela primită în biți?
Am aici o astfel de implementare a codului, dar vă permite să trimiteți / primiți caractere și șiruri prin uart.
#include
#include
#definiti BAUD 9600
#define FOSC 4000000L
#define _XTAL_FREQ 4000000
#define NINE_BITS 0
#define SPEED 0x4
# define DIVIDER ((int) (FOSC / (16UL * BAUD) -1))
#define LED_RED RA4
#define LED_GREN RA5
#define on_off RC2
# definește solul RC1
__CONFIG (FOSC_INTOSC WDTE_ON PWRTE_OFF MCLRE_OFF CP_OFF BOREN_OFF CLKOUTEN_OFF IESO_OFF FCMEN_OFF);
__CONFIG (WRT_OFF PLLEN_OFF STVREN_OFF BORV_LO LVP_OFF);
void usart_init (void);
void usart_putch (caracterele nesemnate);
// ------------------------------------------------ -
void usart_init (vid) SPBRG = DIVIDER;
RCSTA = (NINE_BITS | 0x90);
TXSTA = (SPEED | NINE_BITS | 0x20);
>
void putch (octetul char nesemnat) în timp ce (! TXIF)
continua;
TXREG = octet;
>
nesemnate char get () în timp ce (! RCIF)
continua;
return RCREG;
>
unsigned chargy getche (vid) nesemnate char c;
putch (c = getch ());
return c;
>
.
void principal (void) OSCTUNE = 0b00000000;
OSCCON = 0b01101010;
TRISA = 0b11001111;
TRISC = 0b11111001;
PORTA = 0b00000000;
teren = 0;
on_off = 0;
LED_RED = 1;
LED_GREN = 1;
char comand;
char addr;
octet de caractere;
în timp ce (1) // aici încerc să manipulez conținutul pachetului
octet = getch ();
addr = octet&0x0F;
dacă (addr == 1101)/проверка принадлежности посылки к sale-устройству
comanda = (byte0xF0) >> 4;
.
>
Fie poșta numărul 10, fie numărul poștal 29.
Toate acestea vor funcționa astfel:
Să presupunem că trebuie să activați canalul pe cel de-al patrulea slave (0100 - ID = 4).
Pentru aceasta, o comandă cu următorul conținut este trimisă de la dispozitivul principal:
După această premisă, există încă o sumă de control, pentru a număra suma de control, pentru a număra toate 1 în prima premisă și pentru a le multiplica cu 3, apoi numărul zecimal rezultat este codificat într-un număr zecimal.
În cazul nostru, cea de-a doua premisă are forma:
11110000
[01234567]
unde
0. 3 - 15 în sistemul binar (5 * 3)
7 - pavilion egal cu 0 (desemnarea unui octet cu o sumă de control)
Acum am două întrebări pentru dvs.:
1. Sunt eu idiot?
2. Cum să implementați acest lucru în C? În mod specific, nu înțeleg cum poate fi împărțită parcela primită în biți?
Am aici o astfel de implementare a codului, dar vă permite să trimiteți / primiți caractere și șiruri prin uart.
#include
#include
#definiti BAUD 9600
#define FOSC 4000000L
#define _XTAL_FREQ 4000000
#define NINE_BITS 0
#define SPEED 0x4
# define DIVIDER ((int) (FOSC / (16UL * BAUD) -1))
#define LED_RED RA4
#define LED_GREN RA5
#define on_off RC2
# definește solul RC1
__CONFIG (FOSC_INTOSC WDTE_ON PWRTE_OFF MCLRE_OFF CP_OFF BOREN_OFF CLKOUTEN_OFF IESO_OFF FCMEN_OFF);
__CONFIG (WRT_OFF PLLEN_OFF STVREN_OFF BORV_LO LVP_OFF);
void usart_init (void);
void usart_putch (caracterele nesemnate);
// ------------------------------------------------ -
void usart_init (vid) SPBRG = DIVIDER;
RCSTA = (NINE_BITS | 0x90);
TXSTA = (SPEED | NINE_BITS | 0x20);
>
void putch (octetul char nesemnat) în timp ce (! TXIF)
continua;
TXREG = octet;
>
nesemnate char get () în timp ce (! RCIF)
continua;
return RCREG;
>
unsigned chargy getche (vid) nesemnate char c;
putch (c = getch ());
return c;
>
.
void principal (void) OSCTUNE = 0b00000000;
OSCCON = 0b01101010;
TRISA = 0b11001111;
TRISC = 0b11111001;
PORTA = 0b00000000;
teren = 0;
on_off = 0;
LED_RED = 1;
LED_GREN = 1;
char comand;
char addr;
octet de caractere;
în timp ce (1) // aici încerc să manipulez conținutul pachetului
octet = getch ();
addr = octet&0x0F;
dacă (addr == 1101)/проверка принадлежности посылки к sale-устройству
comanda = (byte0xF0) >> 4;
.
>
RS485, pe acest hardware, într-adevăr nu este necesar. Cu un "suspendator" de 470 Ohm va funcționa ca un pistol. Un pic de echilibru în schimb este mai bine să respingi fără a stăpâni: D Vorbesc despre o lungime fixă de vorbit. Există un timer reinițializabil pentru orice octet primit (chiar în întreruperea receptorului), există un contor de octeți. Dacă contorul este docil, timerul se oprește și se efectuează verificarea CRC. Vee, totuși, se minunează cât de simplu și rapid este efectuat (dacă este făcut corect și cât de corect - pe acest forum doar exemple de mașini). Trebuie doar să ne amintim că CRC din întreaga premisă (cu CRC) ar trebui să fie zero. Dacă "0" poate parsa pachetul, dacă este scurt și acțiunile de execuție sunt scurte, atunci direct din întrerupere.
Dacă temporizatorul este mai înainte, timerul se oprește, iar contorul de octeți este resetat. ffso. În implementare - nu este deloc mai ușor.
Cerințele pentru legarea pachetului Xon / Xoff, pentru că nu, ceai, nu în Germania, trăim
Toată lumea vede ceea ce vrea să vadă.
Și nu numai ce dorește, ci și ce poate. Cu cât nivelul inteligenței este mai ridicat, cu atât invenția mai complexă poate fi.
(Nota Gravitsappa -. Dispozitiv fantastic prezentat în "Kin-za-za" Atunci când este instalat în pepelatsa motorului -. Karabl Interstellar - permite efectuarea de zboruri, practic instantanee interplanetare, interstelare și chiar intergalactice) :).
Ți-am spus că unde a trecut creasta, evreul nu are nimic de făcut.
ca această expresie este atribuită lui Marx. Adevărat, suna ca "unde a trecut comerciantul rus, acolo trei evrei nu au nimic de făcut". Cu ucrainenii - bustul.
Am uitat să vă dezabonați aici :)
În general, proiectul sa dovedit, această implementare sa dovedit a nu fi rău. Fals pozitive nu apar, datele nu se rupe.
În mod secret, un complex de 16 tablouri de sclavi și un maestru a fost deja înmatriculat în departamentul de reactoare al unei centrale nucleare timp de o jumătate de an;)
De fapt, sarcina sclavilor este pur și simplu schimbarea stării de ieșire pe jumătate de pod :)
Acum, despre implementarea software-ului:
struct nesigned char cmd. 4; // Comandă adresată dispozitivului (4 biți)
nesignificat char dev. 4; // Adresa destinatarului (4 biți)
>;
> pack_in;
struct char unsigned char. 2;
nesignificat char ground_key. 1;
nesemnate char power_key. 1;
nesignificat char dev. 4;
>;
> pack_out;
În răspuns, 2 biți sunt alocați pentru feedback-ul actual prin încărcarea consumată. Pur și simplu puneți, în cazul în care sarcina consumă mai puțin de 0,12A, apoi linia este rupt, sau dispozitivul înregistrat de card nu a reușit. Dacă consumă nu mai mult de 0.2A și nu o menaion de 0.12A - totul funcționează așa cum ar trebui. Dar dacă curentul este folosit la 200 mA (KZ), atunci ceva nu este în regulă și dispozitivul slave aici, de asemenea, oprește alimentarea cu energie din încărcătură.
Aștept critici și comentarii :)