Hallo,
ich habe ein kleines Problem mit dieser RS232-Lib:
http://www.teuniz.net/RS-232/index.html
Ich sende mit einem RS232-USB-Dongle zum Arduino Uno und von dort geht
es parallel in einen Homecomputer (Commodore Plus/4). Das funktioniert
einwandfrei mit Linux "cat".
Das zu sendende Programm wird in ein Array geladen und dieses dann um
einige Parameter für den Empfänger erweitert. Danach wird gesendet:
filename ="sendarray.prg";
datei = fopen(filename, "wb");
fwrite(buffer2, sendsize+1, 1, datei);
fclose(datei);
system ("cat sendarray.prg >/dev/ttyUSB0");
system ("rm sendarray.prg");
Das funktioniert soweit einwandfrei. Ich hätte aber gern die
RS232-Funktionen im Programm integriert. Also hatte ich die oben
genannte RS232-Lib verwendet und dieser Code macht Probleme:
/* Transfer */
RS232_OpenComport(xport,baudrate,mode);
RS232_SendBuf(xport,buffer2,sendsize+1);
RS232_CloseComport(xport);
Da stirbt die Verbindung immer wieder nach genau 4608 Bytes ab. Davor
wird immer alles einwandfrei übertragen.
Gibt es vielleicht irgendeine Kleinigkeit, die ich übersehen habe ?
Gruß
Michael
michael schrieb:> RS232_OpenComport(xport,baudrate,mode);> RS232_SendBuf(xport,buffer2,sendsize+1);> RS232_CloseComport(xport);>> Da stirbt die Verbindung immer wieder nach genau 4608 Bytes ab. Davor> wird immer alles einwandfrei übertragen.>> Gibt es vielleicht irgendeine Kleinigkeit, die ich übersehen habe ?
ich kenne die Lib nicht, ich würde mal vor dem Close warten, denn
RS232_SendBuf wird nicht so lange warten bis alles übertragen wurde.
Man braucht für RS232 eigentlich gar keine lib, ich würde es ohne machen
dann kannst du die lib als Fehlerquelle ausschließen.
Dank für den Hinweis, es brachte aber leider keine Besserung. Ich habe
jetzt einen kleinen Workaround:
RS232_OpenComport(xport,baudrate,mode);
for(i=0; i<=sendsize+1; i++)
{
RS232_SendByte (xport,buffer2[i]);
usleep(1);
}
RS232_CloseComport(xport);
Das Senden einzelner Bytes funktioniert so.
Ich vermute einen Rückstau im USB-RS232-Dongle, der dann beim
Pufferüberlauf das Senden einstellt.
michael schrieb:> Ich vermute einen Rückstau im USB-RS232-Dongle, der dann beim> Pufferüberlauf das Senden einstellt.
nein, das funktioniert eigentlich ordentlich. Sonst würde es mit dem cat
auch nicht funktionieren.
Der fehler ist entweder ein der Lib oder bei der Verwendung der Lib.
Warum eigentlich einmal sendsize plus eins und nun plus zwei?
Wieviel Bytes fehlen am Ende?
Zur Probe nur z.b. 3000bytes in Blöcken versenden und mit dem nächsten
erstmal warten?
Ist eigentlich immer sendsize+1. Das Programm im Array wird auf volle
Blocks (256 Bytes bei Commodore) aufgefüllt, damit die Empfangsroutine
kurz gehalten werden kann.
Auf der Seite des alten Homecomputers mit 6502-Assembler:
loadprg: lda porta ; get byte
sta (t_lo),y ; save
lda #$40
sta portc ; set ack (pc6)
asl
sta portc ; and delete ack
- lda portc
cmp #$80 ; wait for dav (pc7)
bne -
iny
bne loadprg ; get 256 bytes
inx
cpx blocks ; blocks reached
beq eot
inc t_hi ; inc hi-addr
bne loadprg
Wenn die vollen Blocks empfangen wurden, braucht es einen Schubs (1
Byte), damit das Y-Register auf 1 springt und das Programm verlassen
wird. Zwischen PC und Homecomputer ist dann ein Arduino-Klon, der RS232
empfängt, um dann parallel mit zwei Steuerleitungen durchzureichen.
Kommt dann hier an:
http://www.zimmers.net/anonftp/pub/cbm/schematics/drives/new/1551/paddle-251925.png
. Ist das Interface der alten Floppy 1551, eigentlich nur eine
Adresskodierung mit I/O-Chip.
Ich habe es jetzt so erst mal gelöst:
RS232_OpenComport(xport,baudrate,mode);
for(i=0; i<=sendsize+1; i++)
{
RS232_SendByte (xport,buffer2[i]);
if (i <= sendsize+1) {
printf("\r# Progress: %i", i);
printf(" Bytes");
fflush(stdout);
}
usleep(1);
}
RS232_CloseComport(xport);
printf("\n");
Wenn man "usleep(1)" herausnimmt, springt die Progress-Anzeige sofort
auf die zu erreichende Byte-Anzahl. Mit der Verzögerung werden dem
USB-Dongle alle Bytes passend verbimmelt.
Hier ist auch der ganze Source:
http://www.cbmhardware.de/show.php?r=10&id=16 Geht sicher eleganter,
aber ich programmiere recht selten mit C(++).
Aber Dank für die Hilfe ! - Ich trage mal alles auf meiner Website
zusammen. Da wird es in Zukunft sicher noch Änderungen geben, wenn die
Retro-Computing Szene sich damit auch beschäftigt.
Achim S. schrieb:> Wieviel Bytes fehlen am Ende?>
Gesamt waren es 6361 Byte von denen 4608 ankamen. Es fehlten also 1753.
Bei anderen Werten kamen aber auch immer wieder 4608 Bytes an.
> Zur Probe nur z.b. 3000bytes in Blöcken versenden und mit dem nächsten> erstmal warten?
Ich belasse es erst mal so wie vorher beschrieben. Das läuft stabil und
flott. Auf feste Baudraten bin ich eigentlich nicht angewiesen.
michael schrieb:> Ist eigentlich immer sendsize+1.
nur zur Info, falls es irgendwann damit ein Problem gibt: hier sind es +
2 Durchläufe.
michael schrieb:> for(i=0; i<=sendsize+1; i++)