FULL-C: serial bus functions: Porovnání verzí
(Založena nová stránka s textem „FULL-C == Funkce pro práci se sériovými sběrnicemi == __NOTOC__ Zařízení SDS mají k dispozici jednu nebo více sériových sběrnic, které lze…“) |
|||
Řádek 37: | Řádek 37: | ||
== Sběrnice RS485 na SDS-BIG == | == Sběrnice RS485 na SDS-BIG == | ||
− | Zařízení SDS-BIG má specifika pro své použití - '''musíte přesně sledovat návod''' zde: [[ | + | Zařízení SDS-BIG má specifika pro své použití - '''musíte přesně sledovat návod''' zde: [[SDS BIG: RS485]]. |
Aktuální verze z 26. 6. 2021, 12:22
FULL-C
Funkce pro práci se sériovými sběrnicemi
Zařízení SDS mají k dispozici jednu nebo více sériových sběrnic, které lze přímo ovládat z FULL-C programu.
Program může použít tyto funkce:
void SDS_serial_config(unsigned int busID, unsigned int BaudRateCfg, unsigned int DataSizeCfg, unsigned int StopBitsCfg, unsigned int ParityCfg); void SDS_serial_writeCH(unsigned int busID, unsigned char writeChar); void SDS_serial_write(unsigned int busID, void *ptr, unsigned int len); unsigned int SDS_serial_read(unsigned int busID, void *ptr, unsigned int maxlen);
Sériové sběrnice (UART)
Sériová sběrnice umožňuje připojit další prvky a zařízení ke každému SDS. Výhodou je, že data se posílají sériově, což vyžaduje "jen jeden drát" v každém směru.
Každé zařízení SDS má k dispozici následující sériové sběrnice (které jsou dostupné prostřednictvím FULL-C funkcí):
- COM1 - busID == 1
- COM3 - pouze prostřednictvím funkcí SDS_TOPB_xxxx()
- COM6 - busID == 6
Je čistě na vás, jaký HW připojíte ke COM1 a jaký ke COM6.
Výrobek SDS-BIG napevno připojuje RS485 ke sběrnici COM1, přičemž se navíc sám vnitřně stará o přepínaní směru master budiče linky RS485.
COM6 je k dispozici vždy jako nezávislá duplexní sériová linka (UART) s 3V3 CMOS logikou. COM6 je určeno pro připojení komunikačních modulů jako je GSM, LoRa, MBUS a další.
Sběrnice RS485 na SDS-BIG
Zařízení SDS-BIG má specifika pro své použití - musíte přesně sledovat návod zde: SDS BIG: RS485.
Konfigurace
Využijte funkci SDS_serial_config(). Potřebné parametry jsou následující:
- busID - viz seznam výše, určuje kterou sériovou sběrnici chcete nastavit
- BaudRateCfg - určuje rychlost sériového přenosu (např. 9600, nebo 115200 bps)
- DataSizeCfg - určuje kolik datových bitů má jedno slovo přenášené po lince, možnosti jsou 9 nebo 8 (běžně je to 8)
- StopBitsCfg - určuje kolik stop-bitů má jedno slovo přenášené po lince, možnosti jsou 0, 1 nebo 2 (běžně je to 1)
- ParityCfg - určuje jaký typ má případný paritní bit v každém slově přenášeném po lince, možnosti jsou 1=odd, 2=even, 0=none (běžně to je 0)
Pozor!
Pokud je ParityCfg nenulové, musí být DataSizeCfg napevno nastaven na 9. Nastavte to na 9 bez obav, protože data samotné zůstávají stále na osmi bitech, přičemž ten devátý je právě pro paritu. Obvyklá chyba je, že nastavíte ParitCfg nenulově (na 1 nebo 2) ale zapomenete dát DataSizeCfg na 9, a směr vysílání z SDS pak nefunguje !
Informace
Každou sériovou linku (neplatí pro COM3) musíte nejprve, jednou na začátku, před použitím (čtení či zápis) nastavit právě touto funkcí.
Zápis do sériové linky (výstup dat ze SDS)
Využijte funkci SDS_serial_writeCH() pro zápis jednoho znaku, popř. SDS_serial_write() pro zápis více (tj. 'len') znaků.
Čtení ze sériové linky (vstup dat do SDS)
SDS obsahuje vnitřní vyrovnávací buffer, pro případ že by FULL-C program nestíhal číst data tak rychle, jak do SDS po sériové lince přicházejí. Ovšem kapacita tohoto bufferu je omezená.
Využijte funkci SDS_serial_read() pro čtení jednoho nebo více znaků (čte až 'maxlen' znaků do vámi přichystané oblasti na kterou ukazuej 'ptr').
Příklad
Vzorový příklad, který komunikuje po sběrnici COM6 rychlostí 9600bps a využívá EVEN paritu. Tento příklad opakovaně odesílá pět bajtů dat (nějaký příkaz) a pak vypisuje do konzole vše co přijal
unsigned char buf[128]; void main(void) { // 6 -> SETUP COM6 // 9 -> we have 8bit data word + 1bit parity // 1 -> one stop bit // 2 -> even parity SDS_serial_config(6, 9600, 9, 1, 2); // loop for ever for (;;) { printf("TX...\n"); // send cmd to slave SDS_serial_writeCH(6, 0x10); SDS_serial_writeCH(6, 0x5b); SDS_serial_writeCH(6, 0x00); SDS_serial_writeCH(6, 0x5b); SDS_serial_writeCH(6, 0x16); // waiting for slave wait(1000); // read all from slave for (;;) { int rd, i; // try to read up to 64 bytes rd = SDS_serial_read(6, (void *) &buf[0], 64); // got anything ? if (0 == rd) break; // print all we got so far for (i = 0; i < rd; i++) { printf("%02x ", buf[i]); } printf("\n"); } // wait before repeating wait(1000); } }
Příklad
Řada příkladů je k dispozici na našem fóru, např. zde: https://forum.sds.an-d.cz//viewtopic.php?pid=6854#p6854 a další.