| |
|
|
 Member 4968348 | Hallo zusammen,
bin neu hier im Forum und habe mal 'ne Frage zum o.g. Thema Ich versuche über den virt. Port meine vom Arduino gesendete Zeichenkette zu lesen. Mit dem "hauseigenen" seriellen Monitor der IDE und auch einem anderen Termialprogramm (RS232 Terminal) klappt das wunderbar. Leider macht das XProfan Prog etwas Probleme. Bei dem 1. Durchlauf wird die empfangende Zeichenkette nicht angezeigt. Bei den folgenden Durchläufen wird jeweils die empf. Zeichenkette vom vorherigen (!) Durchlauf korrekt angezeigt usw.
Was läuft da falsch ?
Hier mal der Quelltext: ( XProfan11 , teilweise aus der Hilfe-Datei entnommen)
'============================================================================ ' COM Empfang '============================================================================
Declare a$, f%, ende% , Sendestring$ , Empfangstring$ , Durchlauf%
Proc GetComInput Parameters id% Declare x$ , Empf$ x$ = @ReadCom$(id%, 1) @ComError(id%) Print x$;
WhileNot x$ = "" x$=@ReadCom$(id%,1) @ComError(id%) print x$; EndWhile
EndProc
Window 0, 0 - 600, 600
f% = @OpenCom("COM5", 100, 100)
ende% = 0 Durchlauf% = 1
GetComInput f% WhileNot ende%
a$ = @Input$("Zeichen 's' für senden", "", "s")
If a$ = "" ' Ende mit Abbruch ende%=1
ElseIf a$ = "s" ' Zeichen senden print @Format$("Duchlauf 00 : ",Durchlauf%); print @Format$("Wert gesendet 00 : ",Durchlauf%); Sendestring$ = @Format$("00000",Durchlauf%)
@WriteCom(f%,Sendestring$)
sleep 100 print "empfangen = "; GetComInput f% ' empfangene Zeichen lesen
INC Durchlauf% a$ = "" print Endif EndWhile
@CloseCom(f%) End
Nachtrag: Arduino UNO bei mir am COM 5 (USB) angeschlossen Das Verhalten zeigt sich im BS Win XP Im BS Win11 funkt es garnicht mit dem Profan-Prog.
Mit dem hauseigenen ser. Monitor der Arduino IDE sehr gut Der Arduino Sketch dürft also funktionieren |
|
|
| |
|
|
|
 E.T. | Kanns nicht testen, aber mal drüber geschaut:
Der erste Aufruf von "GetComInput" erfolgt ohne das "@WriteCom(f%,Sendestring$)" vor der Hauptschleife.
Erst im 2. Aufruf in der Hauptschleife ist das "@WriteCom(f%..." dabei, da ist f% allerdings noch 1 vom 1. Durchlauf, weil erst später in der Schleife erhöht wird.
So probiert: ... ' GetComInput f% WhileNot ende% ...
Da beginnt die "Anzeige" mit Durchlauf 1
(getestet ohne Fehlermeldungen unter Win10, allerdings auch kein "Gerät" angeschlossen) |
|
|
| Grüße aus Sachsen... Mario WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte... | vor 5 Tagen ▲ |
|
|
|
|
 Member 4968348 | Hallo Mario,
[
E.T. (01.06.2025)
Kanns nicht testen, aber mal drüber geschaut:
Der erste Aufruf von "GetComInput" erfolgt ohne das "@WriteCom(f%,Sendestring$)" vor der Hauptschleife.
So probiert: ... ' GetComInput f% WhileNot ende% ...
... hat keinen Erfolg gebracht
E.T. (01.06.2025)
Erst im 2. Aufruf in der Hauptschleife ist das "@WriteCom(f%..." dabei, da ist f% allerdings noch 1 vom 1. Durchlauf, weil erst später in der Schleife erhöht wird.
'f%' ist der Rückgabewert von @openCom, also das Port-Handle ! und wird in der Schleife auch nicht erhöht
Ich habe das Problem mitlerweile bis auf einige Schönheitsfehler gelöst, siehe Quelltext weiter unten. Du schriebst: du hast kein "Gerät" zum testen. Du benötigst nicht unbedingt ein Arduino Board mit entsprechenden Prog, um das Ganze zu testen. Wenn du ein " USB to Serial Adapter with CH340" hast ....so etwas...)

einfach am Adapter Pin TxD mit Pin RxD verbinden und über den Gerätemanager den Port herausfinden. Leider funktioniert nur Port 1 - 9, warum ??? Getestet mit Win10
Ich benutze das Prog dazu, um über ein Arduino einen Schrittmotor zu steuern. Ich sende ein 'Befehl' und das Board sendet dann den Status zurück .
Hier der überarbeitete Quelltext: |
 |
|
| |
|
|
|
 Member 4968348 | ... achso,
So ist der Quelltext besser lesbar 
'====================
' COM Empfang
'====================
Declare Eingabe$, Port$ , Port_Hnd%, ende% , Sendestring$ , Empfangstring$
Proc GetComString
Parameters id%
Declare Zeichen$ , Empf$
While 1
Zeichen$ = @ReadCom$(id%, 1)
sleep 100'notwendig, warum ???
@ComError(id%)
casenot Zeichen$ = "" : break'Schleife erst verlassen, wenn Zeichen anliegt
endwhile
@Set("Decimals",0)
Whilenot Zeichen$ = ""'Schleife solange Zeichen vorhanden sind
Empf$ = Empf$ + Zeichen$
Zeichen$=@ReadCom$(id%,1)'Zeichen einlesen
@ComError(id%)
EndWhile
return Empf$
EndProc
Window 0, 0 - 800, 600
Def $Port "COM5"'an / von diesen Port wird gesendet / empfangen
Def $Port_Parameter ":9600,N,8,1"'Port Settings
print " Zeichen senden und empfangen auf Port: " + $Port + ":\n"
Port_Hnd% = @OpenCom($Port, 100, 100)
ifnot Port_Hnd% = -1' Port ist verfügbar
@setCom(Port_Hnd%, $Port + $Port_Parameter)
ende% = 0
WhileNot ende%
Eingabe$ = @Input$("beliebige (Alpha)Zeichenkette eingeben", "", "beliebige Zeichen")
If Eingabe$ = ""' Ende mit <Abbruch>
ende%=1
else
Sendestring$ = Eingabe$
@WriteCom(Port_Hnd%,Sendestring$)'Zeichenkette senden
print " gesendet wurde : "; Sendestring$
Empfangstring$ = GetComString(Port_Hnd%)'empfangene Zeichenkette
print "empfangen wurde : "; Empfangstring$
clear Empfangstring$
print
Endif
EndWhile
else
print "Port " + $Port + " nicht verfügbar"
waitinput
endif
@CloseCom(Port_Hnd%)
End
|
|
|
| |
|
|