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++)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.