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:

Stromzählermodul PZEM-004T auslesen
Gehe zu Seite Zurück  1, 2, 3, 4  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
eeg-grimm



Anmeldungsdatum: 19.04.2006
Beiträge: 46
Wohnort: Herzogenaurach

BeitragVerfasst am: 23.12.2017, 00:45    Titel: Antworten mit Zitat

Im Verzeichnis "FBIde"
http://up.picr.de/31308837gq.jpg

Verzeichnis IDE und die Datei fdid.exe ist drin.

Muss ich das Verzeichnis IDE auch ins Verzeichnis FreeBASIC verschieben ?

Gruß
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 925
Wohnort: Austria

BeitragVerfasst am: 23.12.2017, 02:01    Titel: Antworten mit Zitat

Wenn du etwas verschiebst, dann alles miteinander. Allerdings kann ich den Rat meiner Mitposter nicht ganz nachvollziehen, wieso FBIde im gleichen Verzeichnis wie der FBC liegen sollte. Funktionieren sollte es anders auch, du musst vermutlich den Compilerpfad anpassen in diesem Fall. Möglicherweise musst du das anderfalls nicht?
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5900
Wohnort: Deutschland

BeitragVerfasst am: 23.12.2017, 02:20    Titel: Antworten mit Zitat

@eeg: Ja, alles aus dem Verzeichnis eine Ebene höher verschieben. Der Ordner "FBIde" ist dann anschließend leer.

@St_W: Ich meine, default-mäßig sucht FBIde relativ im gleichen Verzeichnis nach dem fbc.exe. Wenn man beides zusammen im gleichen Verzeichnis hat, müsste das Zusammenspiel zwischen beidem "out of the box" funktionieren. Wenn man es getrennt installiert, muss man in der FBIde-Konfiguration doch zuerst den Pfad zum fbc eintragen. (Oder vermutlich alternativ das fbc.exe-Verzeichnis in der PATH-Variable hinterlegen.) Also eine vermeidbare Einstiegshürde mehr, wenn man es nicht zusammen ablegt.
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
eeg-grimm



Anmeldungsdatum: 19.04.2006
Beiträge: 46
Wohnort: Herzogenaurach

BeitragVerfasst am: 24.12.2017, 00:58    Titel: Antworten mit Zitat

Hallo Sebastian,

da sage ich mal das dein Programmvorschlag, eine Punktlandung ist, ohne das zu testen.

Da kann ich nur vor Neid erblassen.

http://up.picr.de/31319402av.jpg


Ich hab das mit RS232 und PZEM004T (FreeBasic) gemacht und die Übertragung läuft geschmeidig.

Wie man das mit USB macht muss ich erst noch testen.
Da hat ja volta am 19.12.2017, 16:39 eine Vorschlag gemacht für USB, hab ich aber noch nicht alles verstanden.

#

Bin ja noch auf der Suche wie ich die Stromrichtung abfrage.
Mit B2 C0 A8 01 01 00 1C bekommt man ja die Watt, nur ob das Lieferung (Netzeinspeisung) oder Netzbezug ist wird am PIN 51 vom IC SD3004 ausgegeben und soll über einen Optokoppler an den PC übergeben werden.

Hat jemand ein Idee wie ich das machen könnte, mit RS232 oder auch USB.


Noch einen Weihnachtsgruß an alle im Forum.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1855
Wohnort: D59192

BeitragVerfasst am: 24.12.2017, 11:38    Titel: Antworten mit Zitat

@eeg-grimm
Mein kleines Prog hat nichts mit USB zu tun.
Ich hatte nur ausprobiert wie sich die (Hex)Empfangswerte als
Prüfsumme und als Klarwerte berechnen lassen.

Code:
z.B.
A0 00 E7 01 00 00 88
(A0+00+E7+01+00+00) And FF = 88 Prüfsumme

Str((00*256)+E7)+"."+Str(01) = "230.1" Volt


EDIT so sollte es gehen
Code:
' Code-Schnipsel ohne Funktionsgarantie. Verwendung nur auf eigene Gefahr!

Declare Function getHexString( Daten As String ) As String
Declare Function wandle (D As String) As Single

' TODO: Hier Parameter einstellen:
Const COMPortParameter = "COM1:9600,N,8,1,ME,CS0,DS0,RS"
' Kommandos hinterlegen:
Dim KommandoA As String = Chr( &HB0, &HC0, &HA8, &H01, &H01, &H00 )

' COM-Port oeffnen:
Print "Versuche COM-Port zu oeffnen: "; COMPortParameter
If ( Open Com ( COMPortParameter For Binary As #1 ) <> 0 ) Then
  Print "Der COM-Port konnte leider nicht geoeffnet werden."
  GetKey
  End 1
End If

Print
Print "COM-Port geoeffnet."
Print "Bitte [Leertaste] druecken zum Senden des Befehls und [Esc] zum Beenden."
Print

Dim As String Tastatur="", Datenpuffer=""
Do
  ' Hat das angeschlossene Geraet inzwischen Daten gesendet?
  If Loc( 1 ) > 0 Then
    Datenpuffer = Space( Loc( 1 ) )
    Get #1, , Datenpuffer
    Print "Daten empfangen! Hex-Ansicht: ";
    Color 10
    Print getHexString( Datenpuffer )
    Color 7
  End If
  Print wandle (Datenpuffer)
  ' Hat der Benutzer eine Taste gedrueckt?
  Tastatur = InKey
  If( Tastatur = Chr(32) ) Then 'Leertaste
    Print "Sende Daten! Hex-Ansicht: ";
    Color 12
    Print getHexString( KommandoA )
    Color 7
    Put #1, , KommandoA
  End If
  Sleep 1
Loop Until Tastatur = Chr(27) 'Escape

Print
Print "Schliesse Schnittstelle..."

' Schnittstelle schliessen:
Close #1

Print "Programm beendet."

GetKey
End 0

' String mit irgendwelchen Daten in Hex-Form ausgeben, um auch nicht-druckbare
' Zeichen einfach lesen zu koennen.
Function getHexString( Daten As String ) As String
  Dim Laenge As Integer = Len( Daten )
  If( Laenge < 1 ) Then
    Return ""
  End If
  Dim HexAusgabe As String = ""
  For i As Integer = 1 To Laenge
    HexAusgabe &= Hex( Asc( Mid( Daten, i, 1 ) ), 2 ) & " "
  Next i
  Return HexAusgabe
End Function

'Prüfsumme bilden, Wert berechnen
Function wandle (D As String) As Single
  If D[5]<> ((D[0]+D[1]+D[2]+D[3]+D[4]) And 255) Then
    ?"Fehler";
    Exit Function
  EndIf

  Select Case D[0]
    Case &HA0 To &HA2
      Function = Val(Str((D[1]*256)+D[2])+"."+Str(D[3]))
    Case &HA3
      Function = Val(Str((D[1]*65536)+(D[2]*256)+D[3])+"."+Str(D[4]))
    Case Else
      Function = 0
  End Select
End Function

_________________
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
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 925
Wohnort: Austria

BeitragVerfasst am: 24.12.2017, 16:16    Titel: Antworten mit Zitat

eeg-grimm hat Folgendes geschrieben:
Wie man das mit USB macht muss ich erst noch testen.

Direkt kannst du das Gerät nicht via USB anschließen, da brauchst du ohnehin die nötige Hardware, also in diesem Fall einen USB-Seriell(RS232) Umwandler. Aus Softwaresicht wird dabei dann ein virtueller COM-Port bereitgestellt, der sich genau so verhält wie dein physischer RS232 Anschluss. Du musst also für diese Variante nichts anderes ändern als die entsprechende Nummer des COM-Ports. Welche Portnummer die virtuelle (oder auch der physische) serielle Schnittstelle zugewiesen bekommen haben kannst du im Windows Geräte-Manager sehen.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 860
Wohnort: Ruhrpott

BeitragVerfasst am: 24.12.2017, 20:54    Titel: Antworten mit Zitat

eeg-grimm hat Folgendes geschrieben:
die Messung zeigt die Wirkleistung an...
Stimmt, in der Beschreibung steht "Active power" (wer lesen kann, ist klar im Vorteil grinsen ). Damit wäre das Modul auch für mich interessant (in 3-phasiger Ausführung, für eines meiner... nun ja... nennen wir es einmal "ruhenden" Projekte).

Die Sache einmal weitergedacht: Für ein 3-phasiges Messgerät wäre ein PC mit 3 RS232-Ports erforderlich, das scheint mir ziemlich unpraktikabel. Wenn außerdem noch weitere Signale des SD3004 ausgewertet werden sollen, wäre es sinnvoller, einen Mikrocontroller (z.B. AT90USBxx von Atmel) als Interface zu benutzen. Damit könnten dann auch die Pegelwandler entfallen, und das Messgerät wäre mit einem (einzelnen) USB - Anschluss auch einigermaßen zukunftssicher.

Was sich mir vom Sinn her nicht ganz erschliesst, ist die Möglichkeit, dem Modul eine IP - Adresse zuzuweisen.

Und wenn jemand einen Link zu einer ausführlichen Beschreibung des SD3004 hat: Ich habe da bisher nichts gefunden. traurig

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
eeg-grimm



Anmeldungsdatum: 19.04.2006
Beiträge: 46
Wohnort: Herzogenaurach

BeitragVerfasst am: 24.12.2017, 23:04    Titel: Antworten mit Zitat

So die Geschenke sind verteilt und ausgepackt.


Hallo volta,
Hallo St_W,

das man auch zwischen USB und dem PZEM004T eine Pegelanpassung braucht ist klar.

Ich hab aber noch nichts mit USB bei eigenen Programmen gemacht das muss ich erst mal verstehen.

Bin mal froh das ich das Programm von Sebastian in den Eckpunkten verstanden habe.

################

Hallo grindstone,

das 3-phasiges messen möchte ich auch nicht an PC mit 3 RS232-Ports machen, ich möchte erst mal verstehen was man mit den PZEM004T genau machen kann und auch wie.
Bei Qbasic hab ich eben noch Grundkenntnisse und verstehe erst mal was da genau ab geht beim Messmodul.

Du schreibst ja was von einem
Zitat:
"ruhenden" Projekt
.

Bei mein Projekt soll der Überschussstrom von einer PV-Anlage „vernichten“ werden.

Ich möchte das ESP8266 mit drei Strommesser PZEM-004T zusammen schalten und die Messwerte abfragen und Verbraucher EIN und AUS schalten und am besten noch speichern eine Übertragung würde das Ganze noch abrunden z.B. zu einer Anzeige, PC usw.
https://github.com/apreb/eNode

.
Der Endausbau soll so wie in der Systemübersicht aussehen.
http://up.picr.de/31327145vi.jpg

.
Es soll die Leistung in drei Wechselstromleitungen gemessen werden L1,L2 und L3 und auch die Energierichtung berücksichtigt werden.
Das soll bei einer PV-Anlage am Netzübergabepunkt festgestellt werden ob Strom in das Haus geht oder vom Haus ins Netz und auch die Energiemenge W.
.
Geht Strom ins Netz sollen zusätzliche Verbraucher eingeschaltet werden (3 bis 4 Stück) um die Netzlieferung zu minimieren.
.
Hier ist was mit 3 X PZEM-004T gemacht aber nur am ersten PZEM-004T wird die Energierichtung abgefragt und geht zum Pin 5 (GPIO14 vom ESP-12-E)
.
https://github.com/apreb/eNode

.
Das ESP8266 (ESP-12-E) soll man ja mit der Arduino Software ansprechen können.

Die Regelung muss ja nicht unbedingt das ESP-12-E sein, nur ist da gleich eine Funkübertragung mit dabei, da vermeidet man Kabel durchs Haus zu ziehen.

####

Das mit der IP – Adresse beim PZEM004T hab ich auch nicht so richtig verstanden, dachte eigentlich das die 192,168,1,1 fest ist.


Gruß
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5900
Wohnort: Deutschland

BeitragVerfasst am: 25.12.2017, 00:57    Titel: Antworten mit Zitat

Bei USB ist es mit einer Pegelanpassung nicht getan. Der normale COM-Port (RS232) ist ja auch nur für Point-to-Point gedacht, Peripherie zu Computer. USB ist ein Bussystem, also eher wie RS485, nur viel komplexer bzw. zusätzlich auch noch mind. eine logische Schicht oben drauf (Adressierung der Bus-Teilnehmer usw.). Die Geräte-/Teilnehmer-IDs werden bei USB auch irgendwie zentral von einem Konsortium oder sowas verwaltet. (Ist ne Weile her, dass ich mich da mal eingelesen hatte.) Bei so einem Bus hängen wie an einer Wäscheleine (von der Idee her) beliebig viele Teilnehmer, also nicht nur 2 Kommunikationspartner. Um an einem USB-Bus teilnehmen zu können, muss dein Controller das Protokoll beherrschen. Da reicht es nicht, einfach Daten drauf los zu senden. lächeln Deshalb verwendet man dafür häufig spezialisierte, fertige ICs, die die ganze Komplexität des Bussystems verbergen und für den Entwickler so tun, als handele es sich um einen banalen COM-Port. Dann hast du applikationsseitig gar nichts mehr mit USB zu tun, sondern nutzt es genauso wie ein Gerät an COM1 oder COM2. Nur dass der "simulierte" COM-Port dann eben COM8 oder sowas ist.
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
eeg-grimm



Anmeldungsdatum: 19.04.2006
Beiträge: 46
Wohnort: Herzogenaurach

BeitragVerfasst am: 25.12.2017, 10:52    Titel: Antworten mit Zitat

Hallo Sebastian,

hab jetzt mal mit deinem Programm COM2, 4, 5, 6, 7, 8 und COM9 getestet, kommt immer die Fehlermeldung.
„Der COM-Port konnte leider nicht geoeffnet werden.“

USB spricht irgend wie als COM3, siehe Foto.

COM1 ist ja die tatsächlich vorhandene RS232 am PC und da ist ja kein Pegelumsetzer vorhanden und auch kein Messmodul.
Deshalb kommt auch keine Antwort vom COM1, siehe Foto.

http://up.picr.de/31329613vb.jpg


#

Zitat:
„Deshalb verwendet man dafür häufig spezialisierte, fertige ICs, die die ganze Komplexität des Bussystems verbergen und für den Entwickler so tun, als handele es sich um einen banalen COM-Port.“


Mit Bussystems habe ich auch bereits einiges gemacht mit Basic, aber nur mit I2C-Bus.

IP – Adresse beim PZEM004T ist ja 192.168.1.1 so sehe ich das erst mal und im IC SD3004 ist das mit den COM-Port Sachen bereits drinnen.
Im Netz sind ja einige Beispiele das über USB das PZEM004T mit dem PC spricht.

Die Rückmeldungen vom USB-COM3 sind ja nicht schlüssig und immer die selben.
Egal ob man die USB-Pegelumsetzer eingesteckt ist oder nicht, ob die 230V AC anliegen oder nicht.
Zumindest ist klar das da jetzt USB zu COM3 spricht.

Da ist eine Beschreibung auf Deutsch, aber auch nicht sehr aufschlussreich.

https://de.aliexpress.com/item/1-Set-AC-80-260V-100A-Electric-Monitoring-Module-Power-Voltage-Current-Tester-With-Split-Core/32805420539.html

Gruß
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
eeg-grimm



Anmeldungsdatum: 19.04.2006
Beiträge: 46
Wohnort: Herzogenaurach

BeitragVerfasst am: 25.12.2017, 23:58    Titel: Antworten mit Zitat

USB = COM4

http://up.picr.de/31338630lb.jpg
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
eeg-grimm



Anmeldungsdatum: 19.04.2006
Beiträge: 46
Wohnort: Herzogenaurach

BeitragVerfasst am: 29.12.2017, 00:06    Titel: Antworten mit Zitat

Hallo Jungs,

hab jetzt mal versucht vom COM1 RTS zu schalten (LED zu GND, EIN-AUS)

Mit dem eingebaute COM1 am PC geht das, mit FreeBASIC und Pegelanpassung an TTL.

Zitat:

' Schaltet RTS (Pin7) am COM1 EIN AUS ( nur am COM1 )
' 27.12.2017 EEG

OPEN COM "COM1:9600,N,8,1,ME,CS0,DS0,RS" AS #1

DIM AS INTEGER i


FOR i = 1 TO 10

OUT 1020,0
PRINT "RTS = LED EIN (+5V)";i
SLEEP 2000

OUT 1020,3
PRINT "RTS = LED AUS (-5V)"
SLEEP 2000

SLEEP 500

NEXT

end



###############

Nun mach ich das mit dem USB Pegelanpassung und auch nach TTL.
Versucht vom COM4, RTS anzuschalten (LED zu GND, EIN-AUS) das geht aber nicht.

Zitat:
' Schaltet RTS (Pin7) am COM4 EIN AUS ( USB = COM4 )
' 27.12.2017 EEG

OPEN COM "COM4:9600,N,8,1,ME,CS0,DS0,RS" AS #3

DIM AS INTEGER i


FOR i = 1 TO 10

OUT 748,0
PRINT "RTS = LED EIN (+5V)";i
SLEEP 2000

OUT 748,3
PRINT "RTS = LED AUS (-5V)"
SLEEP 2000

SLEEP 500

NEXT


end



Wo hab ich da den Fehler, oder geht COM4 nicht mit FreeBASIC.

########################

Verwende ich das keine Programm (COM-Tester 1.0), so kann ich auch RTS EIN und AUS schalten am USB (COM4)
http://elektronik-kompendium.de/public/arnerossius/programme/windows/porttest.htm

Gruß
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5900
Wohnort: Deutschland

BeitragVerfasst am: 29.12.2017, 04:23    Titel: Antworten mit Zitat

Hallo,

ich könnte mir gut vorstellen, dass die USB-Lösungen standardmäßig nur RXD und TXD bieten, ohne eine ("manuelle" Pin-Toggle-) Hardware-Flusssteuerung zu ermöglichen. Ich hab schon öfters mitbekommen, dass man bei den simulierten COM-Ports via USB die Statusleitungen nicht manuell setzen könne. Vielleicht geht das, wenn man direkt irgendwelche C-APIs des USB-Adapter-/IC-Anbieters verwendet. Also in der Anwendung nicht so tut, als arbeite man mit einem normalen COM-Port, sondern wirklich ein proprietäres API bzw. eine Bibliothek des USB-Converter-Herstellers nutzt.

Ich glaube, ich würde diese USB-Adapter-Lösungen vermeiden und lieber für 20...50 Euro eine PCI(-Express)-Steckkarte mit "normalen" RS232-Schnittstellen einbauen, sofern der PC keine mehr on-board hat. Bei ebay findet man solche Karten auch gebraucht recht günstig, teilweise mit extrem vielen COM-Ports, z. B. 8 Stück an einer Kabelpeitsche. durchgeknallt Das sind dann "echte, normale" COM-Ports. Dann spart man sich den Umweg über USB. Ich glaube, im professionellen Industrie-Elektronik-Bereich verwendet man entweder Systeme, die RS232- und/oder RS485-Ports "selbstverständlich" haben (irgendwelche Embedded-Industrie-PCs, Hutschienen-PCs usw.), oder nutzt eben solche PCI(Express)-Steckkarten.
Solche Port-Karten gibt es zum Beispiel von EXSYS, Delock und anderen Anbietern.

Link-Beispiele:


Die Konvertierung von USB nach RS232 oder TTL würde ich nämlich nicht vergleichen mit der Konvertierung von TTL nach RS232, sondern eher mit der Konvertierung von analogem Fax zu PDF-Dokument in einer E-Mail. USB ist eine recht komplexe Busschnittstelle, die vom Protokoll, von den Treibern usw. her komplett anders funktioniert, als einfach einen Point-to-Point-COM-Port zu öffnen. Von daher birgt das recht viel Komplexität und Problempotenzial.

Viele Grüße!
Sebastian
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
eeg-grimm



Anmeldungsdatum: 19.04.2006
Beiträge: 46
Wohnort: Herzogenaurach

BeitragVerfasst am: 29.12.2017, 11:52    Titel: Antworten mit Zitat

Zitat:

Sebastian schreibt:
ich könnte mir gut vorstellen, dass die USB-Lösungen standardmäßig nur RXD und TXD bieten, ohne eine ("manuelle" Pin-Toggle-) Hardware-Flusssteuerung zu ermöglichen. Ich hab schon öfters mitbekommen, dass man bei den simulierten COM-Ports via USB die Sta-tusleitungen nicht manuell setzen könne.


Hallo Sebastian,
Das RTS Signal lässt die USB Pegelanpassung (COM4) und nach TTL durch, mit dem kleine Testprogramm * geht das ja auch.

Nur mit FreeBASIC und USB Pegelanpassung nach TTL nicht .
Mit dem Testprogramm * geht das EIN und AUS schalten der LED an RTS.

Das Auslesen der Messwerte mit TXD geht ja mit FreeBASIC und USB (COM4)
Beim Testprogramm * geht auch TXD-LED wunderbar EIN AUS.

Das sind die Pegelwandler.
https://www.shotroom.com/i/1447/oYW1K

Gruß


*
http://elektronik-kompendium.de/public/arnerossius/programme/windows/porttest.htm
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5900
Wohnort: Deutschland

BeitragVerfasst am: 29.12.2017, 13:23    Titel: Antworten mit Zitat

Ah, OK, wenn es mit dem Testprogramm funktioniert, die RS232-Statusleitungen auch über den USB-Adapter zu setzen, dann müsste es wahrscheinlich hiermit auch in FreeBASIC gehen:
https://www.freebasic-portal.de/code-beispiele/elektronikansteuerung/statusleitungen-comport-winapi-78.html

Das Code-Beispiel verwendet WinAPI-Funktionen, die das Betriebssystem bereitstellt. Kleiner Nachteil: Wenn du die in deinem Programm benutzt, kannst du es nicht mehr plattformübergreifend auch unter Linux laufen lassen.

Mit dem verlinkten Code-Beispiel von Steini hab ich selber schon gearbeitet. Hat auf jeden Fall unter Windows 2000, ich meine auch unter XP, damals einwandfrei funktioniert.

Der OUT-Befehl in FreeBASIC ist so eine Sache. "Eigentlich" kann man unter modernen Windows-Versionen überhaupt nicht mehr direkt über irgendwelche Port-Adressen direkt auf die Schnittstellen-Hardware zugreifen. FreeBASIC tut an dieser Stelle nur so, als würde das noch so wie unter DOS/Win3x/Win9x funktionieren, um halbwegs Kompatibilität zu den alten QBasic-DOS-Programmen zu bieten. Im Hintergrund wird dafür meines Wissens ein spezieller Treiber benutzt. Das kann gut sein, dass diese Legacy-Emulation bei USB-Adaptern und COM4 an ihre Grenzen stößt. Bzw. dass der verwendete Treiber nur mit "echten" COM-Ports zusammenarbeiten kann und nicht den Umweg über einen USB-Port beherrscht.
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 860
Wohnort: Ruhrpott

BeitragVerfasst am: 29.12.2017, 14:33    Titel: Antworten mit Zitat

Ich fürchte, irgendwie ist der ganze Ansatz falsch: Das erste Beispiel funktioniert auch (zumindest bei mir), wenn man OPEN COM "COM1:... auskommentiert.

Und
Code:
Open Com ("COMx:9600,N,8,1,ME,CS0,DS0,RS" For Binary As #3)
ist nur dann erfolgreich (Rückgabewert = 0), wenn x die Nummer eines existierenden Ports ist.

Code:
'test for comm ports, Windows only, WIN2k+
#Include Once "windows.bi"
'
Dim As Integer c,werr,vl(255)
Dim As String  s
Dim As HANDLE  hPort
'
For c=1 To 255
   s="\\.\COM" & Str(c)
   SetLastError(0)
   hPort=CreateFile(StrPtr(s),GENERIC_READ Or GENERIC_WRITE,0,0,OPEN_EXISTING,0,0)
   If hPort=INVALID_HANDLE_VALUE Then
      werr=GetLastError()
      If werr=ERROR_ACCESS_DENIED   Then
         vl(c)=1
      Else
         vl(c)=0
      End If
   Else
      vl(c)=1
   End If
   CloseHandle(hPort)
Next
'
For c=1 To 255
   If vl(c) Then Print "COM" & Str(c)
Next
'
Print
Print "Sleeping to Exit"
Sleep


Ich verstehe sowieso nicht, wie der Zugriff über den virtuellen COM - Port funktionieren soll. Schließlich lassen sich über einen Hub etliche Geräte an einen einzigen USB - Port anschliessen. Wie will man da ein bestimmtes Gerät ansprechen?

Gruß
grindstone

EDIT: Ich sehe gerade: Der Versuch, COM1 zu öffnen, gibt ebenfalls eine Fehlermeldung.
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 860
Wohnort: Ruhrpott

BeitragVerfasst am: 29.12.2017, 15:24    Titel: Antworten mit Zitat

Hier ein kleines Programm, das alle im System vorhandenen USB - Geräte auflistet.

@eeg-grimm: Sieh mal nach, ob es deinen USB - Pegelwandler erkennt (als Konsolenprogramm compilieren und laufen lassen).
Code:
'enumerate USB devices?, Windows only, WINNT forward
#Include Once "windows.bi"
#Include Once "win\setupapi.bi"
 
Dim As HDEVINFO hDevInfo
Dim As SP_DEVINFO_DATA DeviceInfoData
Dim As Integer buffersize, c, DataT, i
Dim As String buffer, buffer1, k
 
hDevInfo=SetupDiGetClassDevs(NULL, "USB", 0, DIGCF_PRESENT Or DIGCF_ALLCLASSES)
 
If hDevInfo = INVALID_HANDLE_VALUE Then
   Print "SetupDiGet failed, sleeping to exit.."
   Sleep
   End
End If
 
i = 0
DeviceInfoData.cbSize = SizeOf(SP_DEVINFO_DATA)
SetupDiEnumDeviceInfo(hDevInfo, i, @DeviceInfoData)

Do
   i += 1
   SetLastError(0)
   SetupDiEnumDeviceInfo(hDevInfo, i, @DeviceInfoData)
   If GetLastError() = ERROR_NO_MORE_ITEMS Then Exit Do
   
   buffer = Space(1024)
   buffersize = 1024
   
   SetupDiGetDeviceRegistryProperty(hDevInfo, @DeviceInfoData, SPDRP_DEVICEDESC, _
                                    @DataT, StrPtr(buffer), buffersize, @buffersize)
   
   buffer = Trim(buffer)
   If buffer > "" Then
      
      Print buffer;
      c += 1
      
      buffer = Space(1024)
      buffersize = 1024
      
      SetupDiGetDeviceRegistryProperty(hDevInfo, @DeviceInfoData, SPDRP_FRIENDLYNAME,_
                                       @DataT, StrPtr(buffer), buffersize, @buffersize)
      
      buffer = Trim(buffer)
      If buffer > "" Then
         Print "  ";buffer
      Else
         Print "   (No friendly name)"
      End If
      If c = 20 Then
         c = 0
         Input "::::Paused::::                          Press Enter ",k
      EndIf
   End If
Loop

Print
Print "Done, Sleeping to Exit.."
Sleep


Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
eeg-grimm



Anmeldungsdatum: 19.04.2006
Beiträge: 46
Wohnort: Herzogenaurach

BeitragVerfasst am: 29.12.2017, 16:14    Titel: Antworten mit Zitat

Hallo grindstone,

der COM4 (USB zu TTL) ist im Geräte-Manager vorhanden und dein FreeBASIC Programm, das alle im System vorhandenen USB - Geräte auflistet, hat diese Ausgabe, siehe Foto.

Mit USB-Com4 und daneben ohne USB-Com
http://up.picr.de/31369279xa.jpg


Ich hab jetzt noch so die Vermutung das beim USB=COM4 die „Basisadresse“ für RTS nicht 744+4 ist (748).
Bei COM1 ist die ja 1020.

Am besten wäre es wenn man ein Programm hat, so wie bei den Testprogramm* das auch funktioniert und man sieht wie das in dem Programm gelöst wurde.

##########

Hallo Sebastian,
bei deinem Programm:
https://www.freebasic-portal.de/code-beispiele/elektronikansteuerung/statusleitungen-comport-winapi-78.html

Wenn man auf COM4 Umstellt in der Zeile 4 geht mach dem Start erst mal die LED am RTS aus, Spannung fällt auf 0 V gemessen zu GND.

Das ist mal nicht schlecht, erste Reaktion vom LED auf FreeBASIC am USB-COM4.

Nach Programm STOP mit „ESC“ Taste, wieder LED EIN (+5V zu GND an RTS).

Was noch geschmeidig ist da werden gleich noch die Eingänge DSR, CTS usw. abgefragt und als 0 oder 1 am Bildschirm ausgegeben.

Gruß

P.S.
Ich hab's verstanden, FreeBASIC hat doch einige Vorzüge zu QBasic.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 860
Wohnort: Ruhrpott

BeitragVerfasst am: 29.12.2017, 19:02    Titel: Antworten mit Zitat

eeg-grimm hat Folgendes geschrieben:
Ich hab jetzt noch so die Vermutung das beim USB=COM4 die „Basisadresse“ für RTS nicht 744+4 ist (748).
Das lässt sich ganz einfach feststellen: Im Gerätemanager auf 'USB Serial Port' doppelklicken. Es öffnet sich das "Eigenschaften" - Fenster. Falls vorhanden, den Tab "Ressourcen" wählen, dort ist unter "E/A Bereich" die Portadresse angegeben. Falls der Tab nicht vorhanden ist, lässt sich der Adapter nicht über die Portadresse ansprechen.

Frage 1: Gibt es zu dem Adapter irgendeine Dokumentation, wo solche Details beschrieben sind?

Frage 2: Gehört zu dem Adapter ein Treiber, den du zusätzlich installieren musstest?

Gruß
grindstone

EDIT:
Hast du den Link von Sebastian schon ausprobiert?
https://www.freebasic-portal.de/code-beispiele/elektronikansteuerung/statusleitungen-comport-winapi-78.html
Der Code sieht recht vielversprechend aus, du müsstest nur
Code:
Dim PortNr As String = "COM1"
in
Code:
Dim PortNr As String = "COM4"
ändern (3. Zeile von oben).

EDIT 2:
Bei mir schlägt das Öffnen der COM - Schnittstelle fehl, wenn ich vorher das Testprogramm gestartet habe. Offensichtlich vertragen sich die beiden nicht.
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!


Zuletzt bearbeitet von grindstone am 29.12.2017, 20:00, insgesamt 3-mal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2459
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 29.12.2017, 19:09    Titel: Antworten mit Zitat

eeg-grimm hat Folgendes geschrieben:
USB = COM4

http://up.picr.de/31338630lb.jpg

Tipp von mir, da ich beruflich aktuell auch viel mit Modems/CPEs im Profibereich zu tun habe, wo es überall einen seriellen Konsolenport gibt, um Dinge wie die IP-Adressen einstellen zu können, ich inzwischen ebenfalls fürs Notebook immer so ein USB-Seriell-Adapter dabei habe: Grundsätzlich immer erst im Windows-Gerätemanager unter "Anschlüsse" schauen, welcher virtuelle COM-Port verwendet wird (mache ich immer so, weil dieser bei USB-Geräte grundsätzlich immer dynamisch ist). Erst dann PuTTY in meinem Fall entsprechend einstellen.

Der Tipp an den FreeBasic-Programmierer: Am besten eine .ini-Datei implementieren, wo sich der Endbenutzer solche Sachen wie der COM-Port selber einstellen kann, d.h. grundsätzlich nie ins fertige .EXE-Programm hartcodieren.

Die Win32-API-Profis unter Euch können sich natürlich damit beschäftigen, wie sich die im Gerätemanager gezeigte Anschluss-Liste als Enumaration auslesen lässt -> passendes Konfigurationsmenü ins FB-Programm implementieren, wo der Benutzer beim Start bequem mit den Cursortasten und [Enter] den gewünschten COM-Port auswählen kann.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite Zurück  1, 2, 3, 4  Weiter
Seite 3 von 4

 
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