Portál AbcLinuxu, 3. května 2025 02:05
RS232 podle specifikace do vzdálenosti 15 metrů při přenosové rychlosti do 20kb/s, což vyplývá z povolené kapacity kabelu 2500pF. V praxi jsou dosahovány výsledky mnohem lepší (115200kb/s při vzdálenosti až 50 metrů), díky použití kabelů s kapacitou pod 1000 pF. Rozhraní RS232 je relativně málo odolné proti rušení...
http://www.hw.cz/docs/rs485/rs485.htmlRS422/RS485 do 1200 metru, pricemz na RS485 lze povesit vice zarizeni. Komunikacni linky jsou galvanicky oddelene, takze vam toho pri nejakych problemech moc neshori.
Prevodnik RS232<->RS485 lze vyrobit i podstatne levneji, ovsem nutnosti byva ovladani vysilace signalem RTS, ale s tim pod linuxem nemam zkusenost a zajimalo by mne, s jakou odezvou je mozne ho ovladat, nebot pod nejmenovanym operacnim systemem se chova dost nevypocitatelne.
while(1) { /*Wait for TSR*/ if(ioctl(fd, TIOCSERGETLSR, &lsr) == -1) { printf("ioctl() error %d occured (%s)\n", errno, strerror(errno)); return -1; } if(lsr & TIOCSER_TEMT) break; }Pak teprve je možné změnit stav RTS a tím přepnout modem z vysílání na příjem.
int iFlags = TIOCM_RTS; ioctl(fd, TIOCMBIS, &iFlags);a deaktivuje takto:
int iFlags = TIOCM_RTS; ioctl(fd, TIOCMBIC, &iFlags);kde
fd
je file descriptor daného otevřeného portu.
root# setserial /dev/ttyS0
/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4
Nastavení parity explicitně na 1 lze chápat jako přidání jednoho stopbitu navíc, nicméně dva stopbity by měly stačit, takže snad ani není potřeba to dělat. Nastavit ji na 0 by teoreticky šlo softwarově, kdyby počet bitů ve slovu byl nižší než 8. Paritu lze také při příjmu ignorovat. Ale netuším, v jaké aplikaci je nutné nastavovat paritu na fixní hodnotu.
include/linux/serial_reg.h
Takže test na chybu parity by se dal udělat jako#include<linux/serial_reg.h> int lsr; ioctl(fd, TIOCSERGETLSR, &lsr); if (lsr & UART_LSR_PE) parity_error();
#define UART_LCR_SPAR 0x20 /* Stick parity (?) */Nevíte někdo, proč je v tom komentáři otazník?
#!/usr/bin/env python import base64, MySQLdb, os, sys from MySQLdb.cursors import Cursor,BaseCursor,DictCursor password_base64 = 'aowfowefwe=\n' # plaintext heslo nechci ukazovat password_plain = base64.decodestring(password_base64) db = MySQLdb.connect(db='moje_db', passwd=password_plain ) c = DictCursor(db) db_command = 'select * from tabulka' c.execute(db_command) while True: answer = c.fetchone() if not answer: break print answer #Udelej neco s temi daty c.close() db.close()Takže když už jsou data k dispozici, je potřeba je nasypat do otevřeného a patřičně nastaveného sériového portu. Ukázka pro inspiraci může vypadat následovně:
#!/usr/bin/env python import tty, os fd = os.open('/dev/ttyS0', os.O_RDWR | os.O_SYNC) attr = tty.tcgetattr(fd) attr[tty.IFLAG] = tty.IGNPAR | tty.IGNBRK | tty.INPCK | tty.IMAXBEL | tty.IXOFF attr[tty.LFLAG] = tty.ECHOKE attr[tty.OFLAG] = tty.ONOCR attr[tty.CC][tty.VMIN] = 0 attr[tty.CC][tty.VTIME] = 5 attr[tty.ISPEED] = tty.B19200 attr[tty.OSPEED] = tty.B19200 attr[tty.CFLAG] = tty.B19200 | tty.PARENB | tty.PARODD | tty.CSTOPB | tty.CS8 attr[tty.CFLAG] |= tty.CLOCAL | tty.CREAD | tty.HUPCL tty.tcflush(fd, tty.TCIOFLUSH) tty.tcsetattr(fd, tty.TCSANOW, attr) # Ted se neco zapise do portu ... # a pak se port zavre os.close(fd)Podotýkám, že jsem neměl možnost nic vyzkoušet, takže nevím, jestli to funguje.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.