Forum: Mikrocontroller und Digitale Elektronik VB MScomm Controll Event wird nur einmal ausgelöst


von Manfred H. (protolus)


Lesenswert?

Möchte Daten von einem ESP32 via RS 232 in ein VB-Programm übertragen.

Ich benutze einen Akozon PL2303HX RS-232 zu USB Adapter.
Der Driver für den Adapter ist installiert und stellt brav Port 5 zur 
Verfügung. Der Adapter wandelt auf 5 Volt Level um und hat nur 4 
Anschlüsse:

+5 Volt, Gnd, Tx, Rx

Ich habe Rx des Adapters mit Tx der seriellen Schnittstelle des ESP und 
natürlich Gnd mit Gnd verbunden.

Ein Sketch sendet jede Sekunde einen String an die Serielle 
Schnittstelle.
In VB nutze ich das Microsoft Comm Control.
Ich initialisiere das Control mit "9600,N,8,1"

Die Serielle Schnittstelle im Sketch enthält natürlich auch: 
Serial.begin(9600);

Angeblich soll das MSComm-Controll auf input "lauschen" und wenn daten 
eintrudeln den Event "MSComm1_OnComm()" auslösen.

Tut es auch aber nur einmal und zwar wenn ich den ESP resete.
Der Comm-Event wird also nur einmal ausgelöst und dann nicht mehr.
Er sollte aber jedesmal wenn Daten kommen, ausgelöst werden.

Ich bekomme auch eben ein einziges mal Daten und die sind identisch mit 
der ersten Zeile, die das Arduino-Terminal ausgibt (werden also richtig 
übertragen).
Die Daten erscheinen definitiv am Tx-Pin (geprüft mit Oszillograph).

Liegt es an der Einstellung des COmm-COntroll?
Welche Eingriffsmöglichkeiten habe ich da überhaupt?
Hat Jemand Erfahrung mit dem MSComm-Controll?
Probier schon eine Weile rum aber mir sind die Ideen ausgegangen.

: Bearbeitet durch User
von Klaus R. (klara)


Lesenswert?

Manfred H. schrieb:
> In VB nutze ich das Microsoft Comm Control.
> Ich initialisiere das Control mit "9600,N,8,1"

Was für ein VB benutzt Du? Unter VS2017, VB.NET, sieht es so aus.
1
Imports System.IO.Ports
2
...
3
...
4
Protected COM As SerialPort
5
...
6
...
7
8
' Create the serial port
9
COM = New SerialPort(strRegComPortName, iBaudrate, FT_Parity_Str2Parity(strParity), iDatenBits, FT_StopBit_Int2StopBit(iStoppBits))

So wie es aussieht verwendest Du VB 6.0. Etwas aus der Steinzeit. Dafür 
habe ich so eben noch nicht einmal ein Beispiel gefunden. Unter Win10 
dürftest Du da ein paar Probleme haben, so könnte ich mir das 
vorstellen.

Hier ein aktuelleres Beispiel, ein Link zum heutigen VB.NET
https://www.vb-paradise.de/index.php/Thread/124371-Serial-Port/

Was Du brauchst ist Visual Studio Community. Da ist VB.NET dabei. Es ist 
kostenlos. Es braucht aber schon mehr als 1 GB Platz auf der Festplatte.
https://visualstudio.microsoft.com/de/downloads/
mfg klaus

von Manfred H. (protolus)


Lesenswert?

Vielen Dank für die Antwort.
Mit der "Steinzeit" hast Du leider schon recht. Aber genau das ist mein 
Problem. Ich habe hunderte Programme in VB6 geschrieben von denen ich 
noch viele benutze. Einen Versuch die alle nach .net zu portieren habe 
ich gleich wieder aufgegeben. Da kann ich sie auch gleich neu schreiben. 
Ich möchte auch nicht zwischen zwei Entwicklungsebenen ständig hin und 
her springen.

Ich habe inzwischen das MSComm Problem ein wenig eingekreist.
Die Daten werden richtig übertragen. Es wird aber eben nur einmal nach 
der ersten Übertragung ein Event ausgelöst. Es kommen aber immer weiter 
daten an. Da beim lesen des Inputs der Inputbuffer geleert wird, kann 
ich erkennen, wann neue daten angekommen sind.  Das Problem ist nur, das 
Ende der Übertragung zu erkennen. Das heisst, ich muss am Ende der Daten 
irgend einen Character (am besten 0x04 = EOT) anfügen und die inputs 
solange zusammenpuzzeln bis EOT kommt.
Das geht zur Not, ist aber aufwändig.
Ich habe den Eindruck, dass für das Comm Modul die allererste 
Übertragung nicht abgeschlossen wird und deshalb kein neuer Event 
ausgelöst wird. Habe probiert mit EOT (0x04) am Ende der Daten aber das 
juckt das Comm nicht.
Gibt es möglicherweise noch andere Terminierungs Characters?
Oder hast Du eine Idee?

von FS (Gast)


Lesenswert?

Versuch mal Folgendes, nachdem du PortOpen auf True festgelegt hast:
1
MSComm1.RThreshold = 1
2
MSComm1.SThreshold = 1
3
MSComm1.InputLen = 0

Soweit ich gelesen habe, sind RThreshold und SThreshold standardmäßig 0 
und unterbinden so das OnComm-Ereignis.

von Klaus R. (klara)


Lesenswert?

Manfred H. schrieb:
> Ich habe hunderte Programme in VB6 geschrieben von denen ich
> noch viele benutze.

Ich hatte zur Jahrtausendwende auch manches in VB 6 geschrieben. Aber 
mehr Spass kam dann mit VB.Net auf. Wenn ich jetzt lese, man braucht 
unter VB 6 u.U. OCXe, kommt das Grauen mir wieder leicht hoch. Unter VB 
6 war die serielle Schnittstelle schon vollausgereift und machte 
eigentlich keine Probleme. Aber, konnte man damals nicht sogar noch 
unter VB 6 mit Peek und Poke arbeiten? Heute ist vieles strukurierter 
und gekapselt, man wird sogar dazu gezwungen so zu arbeiten. Und ob VB 6 
unter WIN10 noch in allem kompatibel ist bezweifle ich, bestenfalls 
läuft noch so manches, aber nicht alles.

Meine VB 6 Literatur habe ich mit der letzten Papiersammlung entsorgt.
Du findest ja auch keinen Support mehr.
mfg Klaus

von Klaus R. (klara)


Lesenswert?

Manfred H. schrieb:
> Das heisst, ich muss am Ende der Daten
> irgend einen Character (am besten 0x04 = EOT) anfügen und die inputs
> solange zusammenpuzzeln bis EOT kommt.

Etwas fällt mit in der Tat noch ein. Ich habe aktuell einen Aussensensor 
der mir über einen ESP8266 D1 Mini über eine serielle Verbindung Daten 
liefert. Das Protokoll nutzt nur GND, RXD und TXD. Also echt rudimentär. 
Eine ähnliche Verbindung nutze ich schon seit 2012 zum Auslesen von 
Stromzählern. Es traten bisher keine Störungen auf. Ziel ist ein Win8.1 
Rechner. Entwickelt habe ich auf WIN7 und jetzt auf WIN10.

Selbst der WIN8.1 Rechner hat keine serielle Schnittstelle mehr. Es geht 
alles über einen USB Serial Adapter. Ich habe mich für einen Digitus 
Adapter entschieden, vor allem weil dort ein FTDI / FT232RL Chipsatz zum 
Einsatz kommt. Reichelt bietet den Adapter für ca. 11 € an.

https://www.digitus.info/de/produkte/computer-und-office-zubehoer/computer-zubehoer/usb-komponenten-und-zubehoer/schnittstellen-adapter/da-70156/
1
Der Seriell-Adapter mit einem 9-poligen D-SUB Stecker verfügt über einen FTDI / FT232RL Chipsatz für eine individuelle Konfiguration und Full-Duplex Daten-Übertragung mit bis zu 128 Mbit/s.

Eigentlich braucht eine klassische serielle Schnittelle RS232 neben TXD 
und RXD, noch Signalleitungen zur Flusssteuerung, wie RTS, CTS oder DTR. 
Die heutigen Chipsätze sind inteligenter und erkennen die Statie auch 
ohne diese speziellen Steuerleitungen, zumindest im Regelfall.

Vielleicht liegt es ja an Deinem Akozon PL2303HX RS-232 zu USB Adapter.
Der Digitus Hersteller kommt aus Lüdenscheid.
mfg Klaus

: Bearbeitet durch User
von S. R. (svenska)


Lesenswert?

Klaus R. schrieb:
> Aber, konnte man damals nicht sogar noch
> unter VB 6 mit Peek und Poke arbeiten?

Um die serielle Schnittstelle anzusteuern?
Ich fürchte, da bist du selbst mit der Jahrtausendwende ein paar 
Jahrzehnte zu spät dran...

von Manfred H. (protolus)


Lesenswert?

So, das Problem ist gelöst.
Dein Tip mit dem Inputbuffer Threshold war der Durchbruch.
Der Event kommt jetzt und die Daten werden korrekt übertragen.
Danke nochmal.

Ich habe eine "Null-Modem" Verbindung und im Comm-Controll die 
Einstellung "No Protokoll".
Damit sind allen anderen Signal (DTS, RTS usw) obsolet.

ZU VB6:

Wer VB6 belächelt, hat noch nie richtig damit gearbeitet. Man kann damit 
richtig giftige Sachen machen, speziell wenn man das API nutzt. Und wenn 
man richtig programmiert und compiliert, steht eine VB6-Anwendung in 
Sachen Performance einer C-Anwendung in nichts nach.
Ich kann auch C, aber VB6 ist unschlagbar in Sachen "rapid prototyping".

Ich betreibe intensive Forschung im Bereich KI. Ich habe ein neues 
Neuronales Netz entwickelt das quasi "omnipotent" ist.
Die heute so existierenden Neuronalen Netze und speziell die CNN's 
(Convolutional Neural Nets) sind nur zum zuordnen ähnlicher Formen zu 
gebrauchen.
Mein Netz kann Daten assoziativ speichern, Aussagen in der Prädikaten 
und Aussagelogik machen, iterative Prozesse abbliden usw. Und das alles 
ohne das Netz auf eine bestimmte Funktion extra einstellen zu müssen. Es 
kann alles gleichzeitig.
Ich habe (bevor es .net gab) in VB6 Mein Netz implementiert und dazu 
jede Menge graphischer Analyse-Tools.
Wie gesagt, den Versuch, dieses riesen Projekt nach .net zu potieren 
habe ich gleich wieder aufgegeben.

Zum Abschluss eine ganz andere Frage:
Ich noch mehrere Sachen gepostet, die sind bis jetzt noch nicht in einer 
Forenlist aufgetaucht. Gibt es dafür einen speziellen Grund oder mache 
ich was falsch?
Wie kontaktiere ich einen Admin?

Ich habe nämlich noch ein dringendes Problem:
Da mein Neuronales Netz natürlich auch ähnliche Formen zuordnen kann, 
möchte ich eine neue Art der Spracherkennung implementieren.
Wenn man Alexa bittet, ein Wort zu buchstabieren, dann kann sie das 
auch. Aber nur, wenn das Wort als Text hinterlegt ist. Gibt man ihr ein 
Fantasiewort, streckt Alexa die Waffen. Alexa kann also nicht einzelne 
Buchstaben erkennen. Die Spracherkennung von Alexa ist zwar gut genug 
für eine Breitenanwendung aber noch lange nicht perfekt. Sie hat immer 
noch Probleme mit Hintergrundgeräuschen.
Ich entwickle gerade eine mobile off-line Spracherkennung, die auf 
meinem Neuronalen Netz basiert. Ich habe dafür den ESP32 vorgesehen. 
Rechenleistung und Speicher sollten genügen.
Zum "aufdröseln" des Audiosignals benutze ich die Bibliothek: "fix_fft".
Zur Analyse und Auswertun schicke ich Daten an meine VB-Software.
Das funktioniert auch alles, aber nur auf dem Arduino Uno und noch nicht 
auf dem ESP32.
Wenn ich den Sketch für den ESP32 compiliere, kommt die Fehlermeldung:
fatal error: avr/pgmspace.h: No such file or directory
Ich habe das Problem gepostet, aber der post erscheint nicht.

: Bearbeitet durch User
von MCUA (Gast)


Lesenswert?

> Wer VB6 belächelt, hat noch nie richtig damit gearbeitet.
Stimmt.
VB6 hat auch NativeCompiler, und sogar (man glaubt es nicht) Pointer, 
und auch ASM kann man reinbauen (ups, wer weiss das schon?) und kann 
immerhin das ganze WIN32API und viele Libs einbinden.
Menus sind ruckzuck zusammen geklickt.

> Ich kann auch C, aber VB6 ist unschlagbar in Sachen "rapid prototyping".
Viele sag(t)en, sie programmieren in C, machen das aber in VB (!) und 
tun es dann nach C konvertieren um das dann vorzustellen.

von MCUA (Gast)


Lesenswert?

> Heute ist vieles strukurierter und gekapselt,
Unter .Net ist quasi der ganze Sourcecode offen gelegt

von S. R. (svenska)


Lesenswert?

MCUA schrieb:
> VB6 hat auch NativeCompiler, und sogar (man glaubt es nicht) Pointer,
> und auch ASM kann man reinbauen (ups, wer weiss das schon?) und kann
> immerhin das ganze WIN32API und viele Libs einbinden.

Naja, von VB6 aus kann man DLLs benutzen, ich nenne die mal 
API-Funktionen. Das ist schon sehr mächtig.

Ich weiß, dass man mit VB6 und VarPtr einen Pointer auf ein Objekt 
bekommen kann, aber innerhalb der Sprache kann man damit nicht viel 
anfangen (man kann sie an eine API-Funktion übergeben, logisch). Gibt es 
da sonst noch was?

Wie man ASM ohne API-Funktionen reinbauen will, ist mir auch nicht ganz 
klar. Man könnte ein Array mit dem Binärcode bauen und dann an eine DLL 
übergeben, oder gibt es da bessere Wege?

Was den Compiler angeht, habe ich im Hinterkopf, dass VB3 schlicht den 
Quelltext plus einen Interpreter in die EXE packt, und spätere Versionen 
zu "p-Code" kompilieren, der dann in einer VM ausgeführt wird. So 
richtig "native Code" ist das nicht.

Ich habe mit VB6 angefangen, daher interessiert mich das wirklich. So 
eine Umgebung hätte ich unter Linux schon gerne wieder, denn die 
Entwicklung damit hat wirklich Spaß gemacht. Eins meiner ersten 
Programme in VB6 wird immernoch täglich benutzt. :-)

von MCUA (Gast)


Lesenswert?

Nein, Pointer u ASM nur über Umwege. (Visual)Basic ist schliesslich kein 
Assembler (damit hätte MS ja Leute vergrault (die noch nie eine CPU von 
innen gesehen haben). VB6 kann nativ die .Exe erzeugen (was allerdings 
nicht heissen muss dass es deswegen sehr effizient sein muss; wohl aber 
meist ausreichend fürn PC-Programm)

von S. R. (svenska)


Lesenswert?

Also sind alle deine Aussagen von weiter oben mit Sternchen und 
kleingedruckter Fußnote zu verstehen. Deckt sich mit meinem Verständnis.

von Michael U. (amiga)


Angehängte Dateien:

Lesenswert?

Hallo,

hilft vermitlich nicht weiter, aber:
meine alte LogicAnalyzer Software ist in VB6 geschrieben und redet mit 
einem AVR. VB6 läuft verblüffenderweise auch noch problemlos unter Win10 
Pro/64 im XP Kompatibilitätsmode.
Das Schlimme ist, daß ich mich da nach Jahren erstmal selber 
durchwühlenb müßte...

Ich habe Open_Com() und MSComm_OnComm() mal in eine Textdatei kopiert 
und hier angehängt, vielleicht hilft es Dir ja etwas weiter.

Gruß aus Berlin
Michael

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
Noch kein Account? Hier anmelden.