Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

serielle schnittstelle läuft beim 2.mal nicht

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
pebisoft
gesperrt


Anmeldungsdatum: 28.11.2004
Beiträge: 131

BeitragVerfasst am: 07.10.2006, 12:18    Titel: serielle schnittstelle läuft beim 2.mal nicht Antworten mit Zitat

diese programm liest daten aus der gameboycamera heraus(128*128 byte). mit "los" wird der avr mit der cam gestartet.
die daten werden auch alle in den buffer eingelesen.
zur kontrolle lasse ich mir dann 100 bytes ausgeben.
wenn das programm beendet ist möchte ich es ein 2.mal starten,geht nicht, es bleibt hängen. erst wenn ich mit dem terminal probehalber auf com1 daten verschicke usw. dann kann ich mein freebasicprogramm wieder starten.
woran liegt das?
im terminal sehe ich , das die comschnittstelle richtig geschlossen wurde.

Code:

screen 19,16

DIM test1 AS STRING * 10
dim test as ubyte
dim zaehler as integer

open com "COM1: 19200, N, 8, 1,CS0,DS0,TB17000,RB17000" As #1

sleep 500

test1="los"+chr(13)
print #1,test1

sleep 8000

for zaehler=0 to 100
    test1=INPUT(1, #1)
    PRINT ASC(test1)
next zaehler

close #1
sleep


Zuletzt bearbeitet von pebisoft am 07.10.2006, 16:39, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 07.10.2006, 15:44    Titel: Antworten mit Zitat

Ich kenn jetzt das Protokoll dieser Cam nicht. Vielleicht muß man alle Daten entgegennehmen (also das komplette Bild). Will sagen womöglich hat es etwas mit dem Protokoll zu tun.

Andererseits könnte es sein das das Terminalprogramm den COM Port vor Benutzung, also bei Programmstart, resetiert und das es dadurch geht.

Jedoch wüsste ich jetzt nicht wie man von Basic aus dem COM resetieren könnte.

Sind jetzt nur Ideen. Hast du keine Protokolle von der Cam bzw. andere Sourcecodes aus denen man was erfahren könnte?
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
pebisoft
gesperrt


Anmeldungsdatum: 28.11.2004
Beiträge: 131

BeitragVerfasst am: 07.10.2006, 16:35    Titel: Antworten mit Zitat

die cam schickt innerhalb von 8sec (128*128byte, ist die bildgrösse) 16384 byte.
ich warte mit sleep 8sec. die cam ist also schon fertig und sendet nicht mehr. es sind reine byte-daten mit einem wert von 0 bis 255. mit dem printbefehl werden die auch ausgegeben, bloss wenn ich noch einmal neu starte, läuft sich das programm tot.
der buffer ist 17000byte gross, wie du oben in der open siehst.

wenn ich mit dem tastkmanager das sich totlaufende programm herausnehme, dann läuft es beim wiederholten start wieder.

irgendwie muss die com noch resettet werden, wie du gesagt hast.

in purebasic läuft es, programmiert ist es dort nicht anders.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 07.10.2006, 17:04    Titel: Antworten mit Zitat

Tja, dann liegts wohl doch am Reset...

Probehalber könnte man mal die COM öffnen und im Anschluß gleich wieder schließen, vielleicht löst das ja nen Reset aus.

Ansonsten (denke ich) gibts vielleicht nen Interrupt o.ä. was einen Reset herbeiführt.
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
pebisoft
gesperrt


Anmeldungsdatum: 28.11.2004
Beiträge: 131

BeitragVerfasst am: 07.10.2006, 17:12    Titel: Antworten mit Zitat

habe ich gemacht, open und close ,das gleiche spielchen, nützt nichts

dsa totlaufende programm herausnehmen mit dem taskmanager und es läuft wieder.

ich habe freebasic 0.16
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael Frey



Anmeldungsdatum: 18.12.2004
Beiträge: 2577
Wohnort: Schweiz

BeitragVerfasst am: 07.10.2006, 17:59    Titel: Antworten mit Zitat

Wieso
Code:
Sleep 8000

Und nicht
Code:
Sleep 8000,1
?

Ersteres kannst du mit einem Tastendruck abbrechen, das zweite wartet wirklich (rund) 8 Sekunden.

Ist zwar nur ein Detail aber vielleicht hilft es.
_________________
http://de.wikibooks.org/wiki/FreeBasic Jede Hilfe für dieses Buch ist Willkommen!
http://de.wikibooks.org/wiki/FreeBasic:_FAQ FAQ zu Freebasic (im Aufbau, hilfe Willkommen)
Neu mit Syntax Highlight
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 07.10.2006, 18:29    Titel: Antworten mit Zitat

Hallo

Ich habe mir einfach mal mit folgendem QB-Programm den Status der COM-Register anzeigen lassen.

Code:
CLS
DO
FOR a = &H3F8 TO &H3FF
 PRINT USING "####"; INP(a);
NEXT
PRINT

OPEN "COM1: 19200, N, 8, 1,CS0,DS0,TB17000,RB17000" FOR RANDOM AS #1
CLOSE #1

DO
t$ = INKEY$
LOOP WHILE t$ = ""

LOOP UNTIL t$ = CHR$(27)   'Ende mit ESC


Da kommen beim ersten Durchlauf im Modem-Steuer- und Statusregister andere Werte heraus, als bei den folgenden. Nach einem Neustart des Editors bzw. der .exe passiert wieder das gleiche. Vielleicht hilft es was, wenn du die Startwerte vom ersten Mal vor jedem Durchgang wieder in diese beiden Register schreibst.

Gruss
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
pebisoft
gesperrt


Anmeldungsdatum: 28.11.2004
Beiträge: 131

BeitragVerfasst am: 07.10.2006, 19:05    Titel: Antworten mit Zitat

geht auch nicht.
irgend etwas wird nicht zurückgesetzt bei "close". aber was???

die sleep 8000 brauche ich, weil mit 19200baud ein bild etwas über 6sec dauert. werde später mal ein endestring senden zum pc, damit man weiss , das die übertragung zu ende ist.

vorerst muss ich dieses desaster der verschiedenen startwerte bei open com mal aus der welt schaffen.

vielen dank für eure forschungsarbeit.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
pebisoft
gesperrt


Anmeldungsdatum: 28.11.2004
Beiträge: 131

BeitragVerfasst am: 07.10.2006, 20:07    Titel: Antworten mit Zitat

jetzt habe ich deinen vorschlag noch einmal aufgegriffen und habe mal ein leeres print #1 ,"" dazwischen gesetzt und es funktioniert. warum, weiss ich nicht????

Code:

close #1
open com "COM1: 19200, N, 8, 1,CS0,DS0"  As #1
print #1,""
close #1
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 07.10.2006, 20:38    Titel: Antworten mit Zitat

Seis drum, das Resultat heiligt die Mittel...

meinen Glückwunsch.
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
pebisoft
gesperrt


Anmeldungsdatum: 28.11.2004
Beiträge: 131

BeitragVerfasst am: 07.10.2006, 21:32    Titel: Antworten mit Zitat

jetzt brauche ich in einem schwung 16384byte von der com-schnittstelle in den buffer.
wie ich jetzt raus gefunden habe, geht die höchste einstellung bei open com 4096byte. wenn ich mehr eingebe gibt es nur 4096byte und nicht die 17000, die ich vorher eingegeben habe.

wer weiss hier eine lösung.

die camera sendet die daten (16384byte) ohne unterbrechung.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 07.10.2006, 21:46    Titel: Antworten mit Zitat

Leider hab ich von FB jetzt nicht die Ahnung, aber:

in QB hätte ich das gar nicht über einen Buffer gemacht.

Ich hätte einfach String Variable mit der Länge definiert und die gelesen:

Pseudocode:
Code:
DIM test AS STRING * 16384
open com .....
input #1, test


Danach kann man den String ja Zeichen für Zeichen in Bytes umwandeln.

In FB ist es vielleicht möglich direkt ein Array mit 16384 Bytes zu erzeugen und das per Input zu lesen (K.A.).

Vielleicht ein paar Denkansätze, aber nicht hauen wenns nicht geht, ich progge wie gesagt nicht in FB.
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
pebisoft
gesperrt


Anmeldungsdatum: 28.11.2004
Beiträge: 131

BeitragVerfasst am: 07.10.2006, 23:18    Titel: Antworten mit Zitat

in was für einer sprache proggst du denn?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Kai Bareis



Anmeldungsdatum: 10.09.2004
Beiträge: 545
Wohnort: Baden Würtemberg

BeitragVerfasst am: 07.10.2006, 23:22    Titel: Antworten mit Zitat

Oder per GET die einzelnen Bytes empfangen und diese immer an einen String anfügen.
Inetwa so:
Code:

DIm as string a, b
...opencom dingens...
Do until eof(1)
get #1,,a
b=b+a
loop
Print b

Das einzige was dann sein könnte das du am schlos das EOF senden muss damit die Schleife weiß wann schluss ist.
_________________
MfG Kai Bareis
Es ist noch kein Meister vom Himmel gefallen! Warum einfach wens auch umständlich geht!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
E-P-S



Anmeldungsdatum: 16.09.2004
Beiträge: 500
Wohnort: Neuruppin

BeitragVerfasst am: 07.10.2006, 23:50    Titel: Antworten mit Zitat

Hauptsächlich in BlitzBasic (alle Dialekte), nur noch sehr selten in QB, ansonsten noch PureBasic, Delphi, PHP und JavaScript.
_________________
Man kann sich öfter als zweimal im Leben halb tot lachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 08.10.2006, 11:51    Titel: Antworten mit Zitat

Hi,
evtl lieg ich ganz falsch... ich kenn mich mit der COM-Programmierung nicht so gut aus...
aber warum 8sek auf das Bild warten?
Die CAM sendet doch auf Anforderung durchgehend die 16384 Byte,
also warum nicht (wie E-P-S schon schrieb) häppchenweise (zB. je 1024 Byte) lesen und in ein Array packen, bis alle Daten da sind?

Gruß Volta
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
pebisoft
gesperrt


Anmeldungsdatum: 28.11.2004
Beiträge: 131

BeitragVerfasst am: 08.10.2006, 14:55    Titel: Antworten mit Zitat

die cam sendet die sogenannten spannungswerte pro pixel zum avr.
der adc-port vom avr wandelt die spannungswerte in werte zwischen 0 und 255.

wenn ich 16000byte(pro bild habe) das mal 8 nehme und wieder durch 19200baud teile, bekomme ich pro bild ungefähr auf 6,7sec und ich warte halt 8sec, damit ich die gewißheit habe das es komplett übertragen ist.

da es keine timingabstimmung zwischen übertagen und empfangen gibt, werden die daten nie genau zur abholzeit bereitstehen, darum abwarten bis eben halt die 16384byte im seriellen buffer liegen, wo ich eigentlich nur eine wirkung in der größeneinstellung habe und die ist eben nur 4096byte gross.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 08.10.2006, 15:38    Titel: Antworten mit Zitat

speichert der AVR denn alle 16384Byte intern, und sendet erst dann?
Ich vermute er wandelt 8bit und sendet dann 1Byte über die RS232 zum PC..
Dies dauert doch nicht so lange?
Testweise probier mal:
Code:
Dim As Integer zeile, spalte
Dim As Byte Ptr img
Dim a As Byte

Screen 15,8
img = Imagecreate(128,128,1)
open com "COM1: 19200, N, 8, 1,CS0,DS0" As #1

Sleep 500
print #1,"los"+Chr(13)

For Zeile= 0 To 127
  For spalte=0 To 127
    a = INPUT(1, #1)
    img[4+(zeile*128)+spalte] = a
  Next
  Put (10,10),img,Pset
Next
close #1
Sleep
kann aber als Falschfarbenbild ausgegeben werden...
zumindest siehst du ob überhaupt etwas ankommt.
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 08.10.2006, 15:41    Titel: Antworten mit Zitat

Hallo

Wenn ich das richtig verstanden habe, geht es darum, einen Roboter mit einer Bilderkennung auszustatten. Ich weiss nicht, wie der Controller mit der Kamera kommuniziert, aber besteht nicht die Möglichkeit, die Datenmenge vom AVR reduzieren zu lassen z.B. auf eine Auflösung von 64*64 indem nur jedes zweite Pixel in x- und y-Richtung ausgewertet wird? Für eine Hindernisserkennung sollte das immer noch ausreichen, die 4096 Byte des Puffers würden passen und die Übertragung zum Rechner ginge schneller. Acht Sekunden pro Bild finde ich für diese Anwendung sowieso etwas lang.

Gruss
Skilltronic
_________________
Elektronik und QB? www.skilltronics.de !
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
pebisoft
gesperrt


Anmeldungsdatum: 28.11.2004
Beiträge: 131

BeitragVerfasst am: 08.10.2006, 15:59    Titel: Antworten mit Zitat

ist nur zum test, werde später sowieso mit 115000baud arbeiten.
es soll halt erst einmal funktionieren.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz