A protokoll megvalósítása az uart (4 bites cím, 3 bites adat) archívum - mikro-chip fórumon

A nap kedves ideje!

Olyan adatátviteli protokollt akarok végrehajtani, amelyen az adatokat egy uberen keresztül egyetlen 9 bites csomaggal továbbítják.

A csomag szerkezete a következő legyen:







0 - start bit

5. 7 - három bit adat
8 - stop bit

Hogyan lehet a legjobban megvalósítani?

Aztán nem lesz olyan téma, mint "miért nem teszem azt, amit küldök"

Nos, az emberek azt mondják, hogy ilyen dolgok nem teljesülnek. Szóval most összezavarodtam :)

Természetesen kipróbálhatja az adatokat a buszon stb. és valójában 1 bájtban tudom tartani. A hibakereséshez "nem szabványos megoldás" van egy naplóelemző.

Kezdetben tényleg lépkedtem, gondoltam, hogy az indítási és leállítási biteket a csomag belsejében kell tárolni (adatok): rolleyes:

Ez lehetővé teszi a jövőben (és valószínűleg ez bekövetkezik), hogy megváltoztassa a csapatok számát a rabszolgáknak, és át kívánja adni a választ a rabszolgából.
Miért 8bit, de nem 9? Könnyebb megfogni a hagyományos számítógépes számítógépet, és valószínűleg felmerül a szükség.

Teljes protokoll:
átadás mesterről rabszolgára
1. bájt -
2. byte -
.
Nth byte -
A slave-master-válasz pontosan ugyanaz (ha van rá szükség)
1. bájt -
2. byte -
.
Nth byte -
ebben a struktúrában a "normál" (rövid, hosszú) adatokat át lehet adni - többféle bájt tömörítésével (változatok is vannak, adatokat váltogathatsz, a nagybetűs biteket az adatok utolsó bájtjába csomagolhatod).

Az adatokon, adatválasztásokon és bájtokon a si:
van egy olyan szerkezet, mint egy unió.
Az Ön esetében az alábbiak szerint írható:
struct
használt char Addr. 4;
bevett adatok. 4;
> Pac;


// hozzáférés a mezőkhöz:
Pac.Addr = 0;
Pac.Data = 5;
Az én esetemben:

#define DATA_LEN 1
struct
unsiged char Addr;
unsiged char adatok [DATA_LEN];
unsiged char DataLen; // a beérkezett adatok száma
> Pac;
Változatos fogadásom és feldolgozásom bonyolultabbá válik. ha nincs rá szüksége - hagyja abba az eredeti változatát.

PS A diáknak nem minden diplomás hallgató (kezdő mérnök) kap ilyen problémát.

Jó, hogy minden véletlenül egybeesett, csak a TS igényeihez. A megbízhatóságot több millió példányban tesztelik, és a galaxis császárja is igazolta az egészet. És kész megoldást is vásárolhat;) És mi feszítjük agyunkat. Mondtam, hogy ha a csúcspont elhaladt, a zsidónak semmi köze. És az oldal ukrán volt. ) Jól van.

Jó, hogy minden véletlenül egybeesett, csak a TS igényeihez. A megbízhatóságot több millió példányban tesztelik, és a galaxis császárja is igazolta az egészet. És kész megoldást is vásárolhat;) És mi feszítjük agyunkat. Mondtam, hogy ha a csúcspont elhaladt, a zsidónak semmi köze. És az oldal ukrán volt. ) Jól van.
Nem értem, miért tartozik semmilyen nemzetiséghez. Az idézett webhely, mivel a leírás elérhető, könnyen érthető nyelven. Gondolat nélkül, ahol van, van egy hely és jó.
A tanúsításnak hozzá kell járnia. Hogy érinti a témát.
Ki beszélt az eladásról vagy a vásárlásról?
És az a tény, hogy sok berendezés dolgozik ezen a protokollon, tehát igen, így van.
Senki nem kényszeríti a TS-t arra, hogy "rendezze" a protokollt, vagy alkalmazzon, de lehet, hogy kölcsönösen felveszi az ötletet. "2. Minden már elvált / megvásárolt."

1. Az összes eszköz egy táblán.
2. Minden már tenyésztett / vásárolt.
3. Megerősítés nélkül

Ez lehetővé teszi a jövőben (és valószínűleg ez bekövetkezik), hogy megváltoztassa a csapatok számát a rabszolgáknak, és át kívánja adni a választ a rabszolgából.
Miért 8bit, de nem 9? Könnyebb megfogni a hagyományos számítógépes számítógépet, és valószínűleg felmerül a szükség.


A 8 bites átvitelről egyetért, bár ha nem változtatom meg a memóriát, a 9 bites vétel / átvitel módja ugyanabban az FT232 (usb-uart) paraméterben is szerepelhet. Nem volt szükségem 9 bites módra :) Csak nem értettem a csomag struktúrát az elején, és úgy gondoltam, hogy a start és a stop bitek a 8-9 bitet tartalmazzák a csomagban lévő információkkal (byte-ban): o

De két vagy több bájt szükségességében még mindig nem vagyok biztos. Először is, a buszon lévő eszközök száma nem lesz több 16-nál, és a második 16 csapatnál elég lesz egy ilyen nem triviális feladathoz.

Tény, hogy a parancsnoktól el kell küldenie az alábbi parancsokat:

1 [111] - az RC2 magas szintre van állítva, azaz. engedélyezze a csatornát
2 [000] - Állítsa az RC2-t alacsony szintre. kapcsolja ki a csatornát
3 [001] - 10 ms-os impulzust küld az RC1-nek
4 [011] - 50ms hosszúságú impulzust alkalmazzon az RC1-re
5 [100] - az RC1 kérelem állapota
6 [101] - kéri az RC2 állapotát
7 [110] - állítsa le a készüléket alvó állapotba, mielőtt újraindulna, azaz kapcsolja ki a csatornát, és ne fogadjon parancsokat.


A slave viszont elküldi a válaszok következő sorát a masternek;

I [111] - a csatorna sikeresen bekapcsolt (pozitív válasz az 1. parancsra)
II [000] - a csatorna sikeresen kikapcsolt (pozitív válasz a 2. parancsra)
III - a sugárzó impulzust alkalmazzák (pozitív válasz a 3, 4 parancsokra)
IV [011] - túláram! (negatív válasz az 1., 2., 3., 4. parancsra)






V [100] - be (válasz az 5, 6 parancsokra)
VI [101] - kikapcsolva (válasz az 5, 6 parancsokra)


Valójában nem látom az értelemben 2 és több bájtban, a rendszer algoritmusa egyszerű, és nem igényli a nehéz információk átadását.

Ilyen redundanciával, nincs értelme az ellenőrzőösszegben, csak megismételheti az üzenetet. Nos, persze, a csomagolás helyességének ellenőrzése a vevő oldaláról nagyon jó.

Mindez így fog működni:

Tegyük fel, hogy engedélyeznie kell a csatorna a negyedik slave-ben (0100 - ID = 4).
Ehhez a következő tartalommal rendelkező előfeltétel kerül elküldésre az eszköz masterjéből:


Ezen előfeltétel után további egy ellenőrzőösszeggel, az ellenőrzőösszeg megszámlálásával, az első számlán 1-ben számolunk és 3-mal szorozzuk meg őket, majd a kapott decimális számot decimális számra kódoljuk.
A mi esetünkben a második előfeltétel a következő:

11110000
[01234567]
ahol
0. 3 - 15 a bináris rendszerben (5 * 3)
7 - 0-as flag (egy bájt kijelölése checksummal)


Most 2 kérdésed van neked:
1. Idióta vagyok?
2. Hogyan kell megvalósítani ezt a C-ben? Pontosabban, nem értem, hogy a beérkezett csomagot bitekké bontsák?
Itt van egy ilyen kódvégrehajtás, de lehetővé teszi karakterek és karakterláncok küldését / fogadását az uarton keresztül.
#include
#include
#define 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 földi 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 (üres);
void usart_putch (unsigned char c);
// ------------------------------------------------ -
void usart_init (void) SPBRG = DIVIDER;
RCSTA = (NINE_BITS | 0x90);
TXSTA = (SPEED | NINE_BITS | 0x20);
>

void pipch (unsigned char byte), miközben (! TXIF)
tovább;
TXREG = byte;
>

jel nélküli char getch (), míg (! RCIF)
tovább;
visszatérés RCREG;
>

aláíratlan chargy getche (üres) unsigned char c;
cső (c = getch ());
visszatérés c;
>
.
void main (üres) OSCTUNE = 0b00000000;
OSCCON = 0b01101010;
TRISA = 0b11001111;
TRISC = 0b11111001;
PORTA = 0b00000000;
föld = 0;
on_off = 0;
LED_RED = 1;
LED_GREN = 1;
char komand;
char addr;
char byte;
míg (1) // itt próbáltam manipulálni a csomag tartalmát
byte = getch ();
addr = byte&0x0F;
ha (addr == 1101) comand = (byte0xF0) >> 4;
.
>

Vagy a 10-es vagy a 29-es postszámot.

Mindez így fog működni:

Tegyük fel, hogy engedélyeznie kell a csatorna a negyedik slave-ben (0100 - ID = 4).
Ehhez a következő tartalommal rendelkező előfeltétel kerül elküldésre az eszközmesterből:


Ezen előfeltétel után további egy ellenőrzőösszeggel, az ellenőrzőösszeg számlálásához, az első helyre számoljuk az 1-et, és 3-mal szorozzuk meg, majd a kapott decimális számot decimális számmal kódoljuk.
A mi esetünkben a második előfeltétel a következő:

11110000
[01234567]
ahol
0. 3 - 15 a bináris rendszerben (5 * 3)
7 - 0-as flag (egy bájt kijelölése checksummal)


Most 2 kérdésed van neked:
1. Idióta vagyok?
2. Hogyan kell megvalósítani ezt a C-ben? Pontosabban, nem értem, hogy a beérkezett csomagot bitekké bontsák?
Itt van egy ilyen kódvégrehajtás, de lehetővé teszi karakterek és karakterláncok küldését / fogadását az uarton keresztül.
#include
#include
#define 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 földi 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 (üres);
void usart_putch (unsigned char c);
// ------------------------------------------------ -
void usart_init (void) SPBRG = DIVIDER;
RCSTA = (NINE_BITS | 0x90);
TXSTA = (SPEED | NINE_BITS | 0x20);
>

void pipch (unsigned char byte), miközben (! TXIF)
tovább;
TXREG = byte;
>

jel nélküli char getch (), míg (! RCIF)
tovább;
visszatérés RCREG;
>

aláíratlan chargy getche (üres) unsigned char c;
cső (c = getch ());
visszatérés c;
>
.
void main (üres) OSCTUNE = 0b00000000;
OSCCON = 0b01101010;
TRISA = 0b11001111;
TRISC = 0b11111001;
PORTA = 0b00000000;
föld = 0;
on_off = 0;
LED_RED = 1;
LED_GREN = 1;
char komand;
char addr;
char byte;
míg (1) // itt próbáltam manipulálni a csomag tartalmát
byte = getch ();
addr = byte&0x0F;
ha (addr == 1101) comand = (byte0xF0) >> 4;
.
>


Az RS485 ezen a hardveren valóban nem szükséges. A 470 Ohm "felfüggesztése" fegyverként fog működni. Egy kicsit kiegyenlítő cserét jobb elutasítani anélkül, hogy elsajátítaná: D Én egy fix beszélgetésről beszélek. Van egy időzítő újraindítható a beérkezett bármely bájt (közvetlenül a vevő megszakításakor), van egy byte számláló. Ha a számláló hallgatólagos, az időzítő leáll, és a CRC ellenőrzés végrehajtásra kerül. Vee azonban csodálkozik azon, hogy milyen egyszerű és gyors (ha helyesen és helyesen történik - ezen a fórumon csak autós példák). Csak emlékeztetni kell arra, hogy a CRC-t az egész premisszától (CRC-vel) nullának kell lennie. Ha a "0" elemzi a csomagot, ha rövid, és a végrehajtási műveletek rövidek, akkor közvetlenül a megszakításból.
Ha az időzítő előtte doktikai, az időzítő leáll és a byte számláló nullázódik. ffso. A megvalósítás - ez semmi könnyebb.
Követelmények a Xon / Xoff csomag kötelező megkötésére, mert nem tea, nem Németországban élünk

Mindenki látja, mit akar látni.

És nem csak azt, amit akar, hanem azt is, amit tud. Minél magasabb az intelligencia szintje, annál összetettebb értelmetlen találmány lehet.

(Megj. Gravitsappa - fantasztikus látható eszköz „Kin-za-za” beépítve a motor pepelatsa -. Interstellar karabl - lehetővé teszi, hogy végre gyakorlatilag azonnal bolygóközi, csillagközi és intergalaktikus még járat) :).

Mondtam, hogy ha a csúcspont elhaladt, a zsidónak semmi köze.
mint ez a kifejezés Marxnak tulajdonítható. Igaz, ez úgy hangzott, mint "ahol az orosz kereskedő telt el, három zsidónak nincs mit tenni". Ukránokkal - mellszobor.

Elfelejtettem leiratkozni itt :)

Általában a projekt kiderült, ez a megvalósítás nem bizonyult eléggé rossznak. Hamis pozitívumok nem fordulnak elő, az adatok nem szűnnek meg.
Szó szerint elmondható, hogy egy 16 atomerőmű reaktor részlegében 16 rabszolgamű és egy mester alkotóeleme már fél éve beleesik;)

Valójában a rabszolgák feladata egyszerűen megváltoztatni a kimenő félhíd állapotát :)

Most a szoftverek megvalósításáról:

struktur unsigned char cmd. 4; // A készülékhez címzett parancs (4 bites)
aláíratlan char dev. 4; // A címzett címe (4 bites)
>;
> pack_in;

struktur unsigned char current. 2;
aláírás nélküli char ground_key. 1;
aláírás nélküli char power_key. 1;
aláíratlan char dev. 4;
>;
> pack_out;

A válaszban 2 beteget osztanak ki az aktuális visszacsatolásra az elfogyasztott terhelés miatt. Egyszerűen fogalmazva, ha a terhelés kevesebb, mint 0,12 A, akkor a vonal meghibásodott, vagy a kártyával rögzített eszköz sikertelen. Ha nem több mint 0,2A-t fogyaszt, és nem 0,12A-os menetet, akkor minden működik, ahogy kellene. De ha az áramot 200 mA-re (KZ) használják, akkor valami nincs rendben, és a rabszolga eszköz itt is kikapcsolja a terhelés erejét.

Várakozás a kritikára és a megjegyzésekre :)