ich habe mir vor circa 11 Jahren ein kleines Programm geschrieben.
Das Programm ist ein serieller Monitor. Das ich seiner Zeit zu einer
EXE-Datei kompiliert hatte. Mein damaliger Computer war ein mit Windows XP
Betriebssystem Laptop mit 32 Bit. Das Programm läuft bis heute einwandfrei.
Auch auf meinem neuen Rechner Windows 10 mit 64 Bit System.
Jetzt wollte ich mein Programm auf meine neuen Bedürfnisse anpassen.
Ich sende einen String vom Arduino an den Computer.
Mit dem alten Programm funktioniert alles einwandfrei.
Das selbige Programm, wenn ich es neu kompiliere, funktioniert nicht mehr
und empfängt nur noch chinesische Schriftzeichen. Auch mit dem unveränderten
Quellcode von damals die gleichen wirren Zeichen.
Also mit der Arduino IDE und dem seriellen Monitor funktioniert die
Übertragung einwandfrei, auch mit meinem älteren Programm.
Ich sende folgenden String: " Taster-gedrueckt " als Ergebnis kommt das
zurück " 慔瑳牥朠摥畲捥瑫 ".
Vieleicht kann mir jemand einen Tip geben.
Hier noch mein Code:
Code: Alles auswählen
;**************************
;* *
;* Kleines Com-Port *
;* Version 1.4 *
;* vom 05.10.2011 *
;* Wolfgang D. *
;**************************
Dim Messages.s(14)
Messages(0) = "50"
Messages(1) = "75"
Messages(2) = "110"
Messages(3) = "150"
Messages(4) = "300"
Messages(5) = "600"
Messages(6) = "1200"
Messages(7) = "1800"
Messages(8) = "2400"
Messages(9) = "4800"
Messages(10) = "9600"
Messages(11) = "19200"
Messages(12) = "38400"
Messages(13) = "57600"
Messages(14) = "115200"
Global Dim verfuegbar(30) ; kann bei bedarf noch erweitert werden
Global Dim verfuegbaralt(30)
Declare startwerte()
Declare port()
Declare schreibe()
Declare prefs()
Declare cls()
Declare speichern()
Declare senden()
Declare GetAvailableComPorts()
Declare vergleichePorts()
Global NewList AvailableComs()
Structure kc ;kleines comport
baud.l ;50, 75, 110, 150, 300, 600, 1200, 1800, 2400
;4800, 9600, 19200, 38400, 57600 oder 115200
com.b
comport.s
datei.s
file.s
StandardFile.s
windowbr.l
windowh.l
gadgetbr.l
gadgeth.l
ver.s
text.s
er.b
open.b
speicher.b
set.l
send.s
datenstring.s[1000]
zaehler.l
x.b
xneu.b
xalt.b
w.b
aktiv.b
gleich.b
EndStructure
Global wd.kc
LoadFont(0,"Arial black",10)
LoadFont(1,"Arial",20)
LoadFont(2,"Arial black",8)
startwerte()
SetGadgetFont(#PB_Default, FontID(2)) ; geladenen Arial 20 Zeichensatz als neuen Standard festlegen
wd\text="Kleines Comport V"+ wd\ver
OpenWindow(0, 0, 0, wd\windowbr, wd\windowh, wd\text, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget)
ComboBoxGadget(0, 2, 2, 70, 23)
wd\w=0
;-------
GetAvailableComPorts()
vergleichePorts()
For a = 1 To wd\x+1
AddGadgetItem(0, -1,"Com " + Str(verfuegbar(a)))
Next
If wd\gleich = 1
SetGadgetState(0,0)
Else
SetGadgetState(0,wd\aktiv)
EndIf
ComboBoxGadget(1, 72, 2, 100, 23)
For a=0 To 14
AddGadgetItem(1, -1,Messages(a))
Next
SetGadgetState(1, wd\set)
ButtonGadget(2, 175, 2, 78, 26, "Verbinden" , #PB_Button_Toggle)
ButtonGadget(3, 175,210,78,26, "Löschen")
ButtonGadget(4, 175, 58, 78, 26, "Senden" )
ButtonGadget(5, 175, 30, 78, 26, "Speichern" )
EditorGadget(50, 10, 58, 150, 26 )
;TextGadget(100, 10, 100, wd\gadgetbr, wd\gadgeth )
EditorGadget(100, 10, 100, wd\gadgetbr, wd\gadgeth, #PB_Editor_ReadOnly )
wd\text="Version "+ wd\ver
SetGadgetText(100, wd\text)
Repeat
With wd.kc
EventID = WindowEvent()
;If EventID = #PB_Event_Gadget
If eventid = #PB_Event_CloseWindow
prefs()
Delay(20)
End
ElseIf EventID = #PB_Event_Gadget
Select EventGadget()
Case 2 :If GetGadgetState(2):\er=1:SetGadgetText(2,"Trennen"):
Else: SetGadgetText(2,"Verbinden"): \er=0: EndIf
Case 3 : cls()
Case 4 : senden()
Case 5 : speichern()
EndSelect
port()
EndIf
If \open=1
schreibe()
Delay(10)
EndIf
EndWith
;Until EventID = #PB_Event_CloseWindow
ForEver
Procedure startwerte()
With wd.kc
\ver="1.4"
\StandardFile="standart"
\windowbr = 260
\windowh = 250
\gadgetbr = 240
\gadgeth = 100
\baud = 2400
\com = 1
\comport = "COM1"
\datei="init.dat"
\text="Version 1.0"
\er=0
\open=0
\speicher=0
\set=6
\zaehler=1
\x=0
\xneu=0
\xalt=0
prefs()
EndWith
EndProcedure
Procedure GetAvailableComPorts()
Protected hKey, lpcbName, lpName.s, a$, lType, i
If RegOpenKeyEx_(#HKEY_LOCAL_MACHINE, "HARDWARE\DEVICEMAP\SERIALCOMM", 0, #KEY_QUERY_VALUE, @hKey) = #ERROR_SUCCESS
lpName = Space(255)
Repeat
lpcbName = 255
If RegEnumValue_(hKey, i, @lpName, @lpcbName, 0, 0, 0, 0) = #ERROR_SUCCESS
a$ = Left(lpName, lpcbName)
If a$ = ""
Break
EndIf
lpcbName = 255
lType = 0
If RegQueryValueEx_(hKey, a$, 0, @lType, @lpName, @lpcbName) = #ERROR_SUCCESS
a$ = Left(lpName, lpcbName - 1)
If LCase(Left(a$, 3)) = "com"
AddElement(AvailableComs())
AvailableComs() = Val(RemoveString(a$, "COM", 1))
verfuegbar(i+1) = Val(RemoveString(a$, "COM", 1))
wd\xneu=i
EndIf
EndIf
i + 1
Else
Break
EndIf
ForEver
RegCloseKey_(hKey)
EndIf
EndProcedure
Procedure vergleichePorts()
With wd.kc
\gleich=0
If \xalt=\xneu
\x=\xalt
Else
\x=\xneu
\gleich=1
EndIf
For a=1 To \xalt+1
If verfuegbaralt(a)=verfuegbar(a)
Else
\gleich=1
Break
EndIf
Next a
If \gleich=1
MessageRequester(" COMPORT veränderung!", "Comport neu auswählen", #PB_MessageRequester_Ok)
EndIf
EndWith
EndProcedure
Procedure port()
With wd.kc
\comport=GetGadgetText(0)
\comport=RemoveString(\comport, " ") ;Leerzeichen aus dem COM-String entfernen
If GetGadgetState(1)=0
\baud=50
EndIf
If GetGadgetState(1)=1
\baud=75
EndIf
If GetGadgetState(1)=2
\baud=110
EndIf
If GetGadgetState(1)=3
\baud=150
EndIf
If GetGadgetState(1)=4
\baud=300
EndIf
If GetGadgetState(1)=5
\baud=600
EndIf
If GetGadgetState(1)=6
\baud=1200
EndIf
If GetGadgetState(1)=7
\baud=1800
EndIf
If GetGadgetState(1)=8
\baud=2400
EndIf
If GetGadgetState(1)=9
\baud=4800
EndIf
If GetGadgetState(1)=10
\baud=9600
EndIf
If GetGadgetState(1)=11
\baud=19200
EndIf
If GetGadgetState(1)=12
\baud=38400
EndIf
If GetGadgetState(1)=13
\baud=57600
EndIf
If GetGadgetState(1)=14
\baud=115200
EndIf
If \er=1
If \open=0
If OpenSerialPort(0,\comport, \baud,#PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 256,256)
\open=1
Else
\text="Nix open "+\comport
MessageRequester("Hilfe", \text, #PB_MessageRequester_Ok) ;Kann Com x nicht öffnen
SetGadgetState(2, 0) ;Gatget wieder zurücksetzten
SetGadgetText(2,"Verbinden")
\er=0
EndIf
EndIf
EndIf
If \er=0
If \open=1
CloseSerialPort(0)
\open=0
EndIf
EndIf
If \open=1
schreibe()
EndIf
EndWith
EndProcedure
Procedure schreibe()
With wd.kc
If IsSerialPort(0)
input=AvailableSerialPortInput(0)
If input
a$=Space(input)
ReadSerialPortData(0,@a$,input)
Delay(4)
a$=Trim(a$)
\text=GetGadgetText(100)+a$ + Chr(13)
\datenstring[\zaehler]=a$
SetGadgetText(100, \text)
\zaehler+1
EndIf
EndIf
EndWith
EndProcedure
Procedure prefs()
With wd.kc
If \speicher=0
If ReadFile(0, \datei)
\text= ReadString(0) ;Kleines Comport
\comport=ReadString(0) ; COM9
\text=ReadString(0) ; 6
\set=Val(\text) ;set ist zuständig für BAUD
\text=ReadString(0) ;9 Anzahl der zuletzt verwendeten Aktiven Comports
\xalt=Val(\text)
\text=ReadString(0)
\aktiv=Val(\text) ;aktiv ist zuständig zuletzt verwendeten Comport
For a=1 To \xalt + 1
verfuegbaralt(a)=Val(ReadString(0)) ;Comports mit Nummern
Next a
CloseFile(0)
Else
\baud = 2400
\set=8
\com = 1
\comport = "COM1"
\datei="init.dat"
\text="Version 1.0 keine Daten geladen."
EndIf
EndIf
\com=Val(Mid(\comport,4,2))
If \speicher=1
DeleteFile(\datei)
If CreateFile(0, \datei)
WriteStringN(0, "Kleines Comport")
WriteStringN(0, \comport)
\text=Str(GetGadgetState(1))
WriteString(0, \text)
WriteStringN(0, " ")
WriteStringN(0, Str(\xneu))
\aktiv=GetGadgetState(0)
WriteStringN(0, Str(\aktiv))
For a=1 To \x + 1
WriteStringN(0, Str(verfuegbar(a)))
Next a
CloseFile(0)
EndIf
EndIf
\speicher=1
EndWith
EndProcedure
Procedure cls()
With wd.kc
\text=""
SetGadgetText(100, \text)
\zaehler=0
EndWith
EndProcedure
Procedure speichern()
With wd.kc
Pattern$ = "Text (*.txt)|*.txt;*.dat|Alle Dateien (*.*)|*.*"
Pattern = 0 ; wir verwenden den ersten von drei möglichen Pattern als Standard
\file = SaveFileRequester("Bitte Datei zum Laden auswählen", \StandardFile, Pattern$, Pattern)
;\file=\file + Pattern$
OpenFile(0, \file)
WriteStringN(0, "")
WriteStringN(0, "")
For x=0 To \zaehler
If \datenstring[x]=""
Goto nichtschreib
EndIf
WriteStringN(0,\datenstring[x])
nichtschreib:
Next x
CloseFile(0)
EndWith
EndProcedure
Procedure senden()
With wd.kc
If \open=0
\text= "Erst Comport öffnen!"
MessageRequester("Hilfe", \text, #PB_MessageRequester_Ok)
EndIf
If \open=1
a$=GetGadgetText(50)
If Len(a$)=1
WriteSerialPortData(0,@a$,1)
Else
a$=Chr(Val(a$))
WriteSerialPortData(0,@a$,1)
EndIf
EndIf
EndWith
EndProcedure