002
18.01.2023, 19:36 Uhr
Bert
|
Da die Datenflusssteuerung rein in Software gemacht wird, ändert sich m.E. nichts an der Initialisierung der SIO.
Solange Du nicht über die CP/M-BIOS-Funktionen LIST/PUNCH/READER gehen willst, oder CP/M anderweitig auf die SIO zugreift, brauchst Du auch auf CP/M keine Rücksicht zu nehmen.
Wenn ich mir das hier so anschaue: https://de.wikipedia.org/wiki/Datenflusssteuerung#Software-Flusssteuerung,_Software-Handshake,_Software-Protokoll_oder_X-ON/X-OFF muß ungefähr Folgendes passieren:
Initalisierung: - SIO initialisieren - Empfangspuffer löschen (E-Puffer) - Sendepuffer löschen (S-Puffer) - Senden freigeben - ggf. der Gegenstelle schon mal ein XON schicken
Transferroutine: - prüfen, ob ein Zeichen gekommen ist - wenn das Zeichen XON oder XOFF ist --> Sendefreigabe anpassen - sonst schauen, ob im E-Puffer Platz ist - wenn ja, Zeichen eintragen und prüfen, ob der Füllstand jetzt über 80% liegt, ggf. vorne in S-Puffer XOFF einfügen - wenn nein, ist Empfangspuffer voll --> Datenverlust - dann prüfen ob im S-Puffer was drin ist und gesendet werden kann (SIO frei, Sendefreigabe erteilt) - ein XOFF darf auch ohne Sendefreigabe rausgeschickt werden
Dein eigentliches Programm greift nur über die Lese- bzw. Schreibroutinen auf die Puffer zu:
Leseroutine: - ggf. Zeichen aus E-Puffer auslesen - wenn Füllstand unter 20% fällt, dann im S-Puffer XON einfügen
Schreibroutine: - wenn Platz im S-Puffer ist, Zeichen eintragen
Wenn beim Senden nix verloren gehen soll, muß das Programm ggf. warten, bis wieder Platz im S-Puffer ist. Wenn mehr ausgegeben (oder empfangen) werden soll, als die Transferrate und die Verarbeitungszeit zuläßt, kommt es irgendwann zu Datenverlust. Ein Puffer kann nur die 'Spitzen' abfangen. Die Transferroutine sollte man nicht häufiger auzurufen, als der Transfer für ein Byte dauert. Bei 9600 bps reicht ein Aufruf pro Millisekunde. Bei 2400 bps kann man die Routine alle 4 ms aufrufen. Die Steuerzeichen für XON/XOFF stehen bei Softwarehandshake natürlich nicht mehr für die Datenübertragung zur Verfügung.
Grüße, Bert
P.S.: Hier hat jemand einen Vorschlag in C vorgestellt: https://www.mikrocontroller.net/topic/67549 |