Opět si hraju s RS232 (kvůli SIFTermu), opět jsem v něm opravil pár drobností a jednu větší chybu - měl jsem tam špatně nastavení softwarového řízení toku dat. Zkorigoval jsem podle datasheetu a teď se zdá, že to na straně 16C650 v ZX Spectru funguje správně.
Ale Linux na Xon/Xoff nechce reagovat. Co dělám špatně?
Sériák na Linuxu nastavuju takto:
Kód:
stty -F /dev/ttyS1 9600 cs8 clocal cread cstopb parenb -parodd -crtscts ixon ixoff -echo -drain raw
Tzn. pomocí -crtscts vypnu hardwarové řízení toku pomocí signálů CTS a RTS, přesto PC CTS směrem ven nastavuje, ale na RTS do PC nereaguje, vysílá bez ohledu na stav, potud asi ok. Pomocí ixon zapínám řízení toku dat řídícími znaky a pomocí ixoff zapínám posílání xoff/xon znaků, když se zaplní buffer na straně PC (někde mezi 4 - 5kB, zkoušel jsem dřív).
Cituji z manuálu
Kód:
[-]ixoff enable sending of start/stop characters
[-]ixon enable XON/XOFF flow control
S pomlčkou se parametr vypíná, bez pomlčky zapíná, proto mi kombinace -crtscts ixon ixoff připadá správná. Na osciloskopu vidím, že z 16C650 v ZX do PC přichází znak 0x13 (CTRL+S) , když pozastavím příjem a zaplní se FIFO v UARTu. A naopak, když opět začnu na ZX data přijímat a FIFO se vyprázdní, tak pošle 0x11 (CTRL+Q), to by mělo být dle Wikipedie správně
https://en.wikipedia.org/wiki/Software_flow_control Stejně to funguje v linuxovém terminálu, CTRL+S odpovídá klávese Scroll Lock.
Viz obrázek z osciloskopu - žlutá jsou data ze ZXS/16C650, purpurová z Linuxu, znak 0x13 je vyslán, ale PC nereaguje a vysílá dál (a mnohem déle než je na screenshotu).
V PC mám RS232 kartu do PCI s čipem Moschip MCS9835CV.
Zkusil jsem i USB redukci s čipem PL2303. (dvě různé od různých výrobců)
Zkusil jsem i USB redukci s čipem ch341.
Zkusil jsem notebook Dell D630 s interní RS232 - hlásí se jako 8250/16550 bez dalších detailů.
Ani na jednom počítači to nefunguje. Teoreticky na tom notebooku mám kromě Debianu 10 i WXP a mohl bych to zkusit pro zajímavost i tam.
Co dělám špatně?
Nastavuju špatně sériák pomocí stty?
Přehlídnul jsem důležitý parametr?
Používám špatné řídící znaky?
Je potřeba ty znaky Linuxu explicitně určit, jako je zapisuju do registrů 16C650?
_________________
https://cygnus.speccy.cz ZX Spectrum 128k, Betadisk, DivIDE, ESXDOS