OpenSerialPort() - Data: Bits or Bytes?

Für allgemeine Fragen zur Programmierung mit PureBasic.
andi256
Beiträge: 100
Registriert: 06.11.2004 11:23
Computerausstattung: PB 5.30 (x64) Win7
Wohnort: Österreich

Re: OpenSerialPort() - Data: Bits or Bytes?

Beitrag von andi256 »

Hi

probiers mal mit "WriteSerialPortData"

kenn zwar jetzt die neuen "SerialPort" Sachen nicht in PB ...

hatte jedoch in vergangener Zeit (MVCOM) immer Probleme mit Strings an die Com-Schnittstelle ...

Code: Alles auswählen

msg$ = "test123 blablaaa"

*buffer = AllocateMemory(255)
For i = 1 To Len(msg$)
 PokeB(*buffer+i-1,((Asc((Mid(msg$,i,1))))))
Next
WriteSerialPortData(#SerialPort, *buffer,Len(msg$))
mit "Data" ist man imho flexibler und kann headers etc. leichter ergänzen ... auch kann man die "Null-Teriminierung der Strings umgehen / steuern"

Hast du vom Roboter eine Software mit der der Roboter funktioniert (Hersteller demo etc....) ?
In solchen Fällen klemm ich mich immer mittels eines Loggers (zb. portmon) an die Com Schnittstelle. So kann man dann wunderbar die ganzen Comport-Einstellungen auslesen ... auch sieht man sehr gut wie der PC mit dem Roboter kommuniziert ... Diese bau ich in PB nach und ändere es auf meine Wünsche.


Andi
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: OpenSerialPort() - Data: Bits or Bytes?

Beitrag von NicTheQuick »

andi256 hat geschrieben:

Code: Alles auswählen

msg$ = "test123 blablaaa"

*buffer = AllocateMemory(255)
For i = 1 To Len(msg$)
 PokeB(*buffer+i-1,((Asc((Mid(msg$,i,1))))))
Next
WriteSerialPortData(#SerialPort, *buffer,Len(msg$))
Warum so kompliziert mit Asc, Mid und PokeB?

Wenn man das Programm ohne Unicode kompiliert, reicht auch das hier:

Code: Alles auswählen

msg$ = "test123 blablaaa"
WriteSerialPortData(#SerialPort, @msg$, Len(msg$))
Oder aber wenn man auf Nummer sicher gehen will, bastelt man sich eine eigene Procecure, die sich automatisch an Unicode oder ASCII anpasst:

Code: Alles auswählen

Procedure WriteSerialPortStringEx(SerialPort.i, Text.s) ;Schreibt einen ASCII-String ohne abschließende Null.
	Protected length.i = Len(Text)
	
	CompilerIf (#PB_Compiler_Unicode) ;Wandle zuerst den String in ASCII um
		Protected *buffer = AllocateMemory(length + 1)
		PokeS(*buffer, Text, -1, #PB_Ascii)
		WriteSerialPortData(SerialPort, *buffer, length)
		FreeMemory(*buffer)
	CompilerElse ;String ist schon ASCII, also schreibe ihn direkt raus
		WriteSerialPortData(SerialPort, @Text, length)
	CompilerEndIf
EndProcedure

msg$ = "test123 blablaaa"
WriteSerialPortStringEx(#SerialPort, msg$)
andi256
Beiträge: 100
Registriert: 06.11.2004 11:23
Computerausstattung: PB 5.30 (x64) Win7
Wohnort: Österreich

Re: OpenSerialPort() - Data: Bits or Bytes?

Beitrag von andi256 »

warum so kompliziert ...

hatte mich eigentlich auf den Code bezogen ...

Code: Alles auswählen

  For CharIndex = 0 To CharLen-1
    Char = Asc(Left(Right(Information, CharLen-CharIndex), 1))
    If Char < 0 Or Char > 127
      ProcedureReturn -1
    EndIf
  Next
und wenn eine Prüfung des inputs erfolgen soll ...dachte ich mein Code passt so gut rein ... da im Zuge der Prüfung auch gleich der sendbuffer gefüllt/erstellt werden kann...

Aber

mir war im wesentlichen nur wichtig ( aus eigener bitteren Erfahrung :-)) das bei den meisten Com-Kommunikationen (CNC- Maschinen / Handlings /Achsensteuerungen etc...) ein cmd ala "01 00 DD 'X' '=' '0' '.' '0' " (01 00 DD <- Header / Befehlssatz) + (X=0.0 <- Daten ) oder ähnlich geschickt werden muss ... und man da mit Strings (ASC 00) Probleme bekommt !

Andi256
#Ton
Beiträge: 11
Registriert: 30.03.2013 11:57

Re: OpenSerialPort() - Data: Bits or Bytes?

Beitrag von #Ton »

@Daffy0815:
Aber mal ganz prinzipiell. Stelle doch einfach die richtigen Parameter für beide Seiten ein dann bist Du immer auf der sicheren Seite.
Das kann ich nicht, da ich keinerlei Zugriff auf den BT-Dongle habe. Ich vermute ganz stark es stellt sich einfach automatisch auf mein OpenSerialPort() ein und deswegen funktionierts mit jeglichen Werten..

Und danke für diese auführlichen Infos! :)

@andi256
Hab schon auf WriteData() umgestellt, WriteString() war nur vorübergehend.
Naja nicht wirklich, nur ein tonnenschweres Packet an vorgefertigten Klassen, den Roboter muss ich blank in Java proggen.
Ich denk das geht schlecht, da ich keine direkte COM-Verbindung zum Roboter habe, sondern zum Dongle. Der Roboter empfängt und sendet alles über Bluetooth.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: OpenSerialPort() - Data: Bits or Bytes?

Beitrag von NicTheQuick »

Ich habe selbst auch schon eine serielle Verbindung über Bluetooth zu einem Atmega8 (Mikrocontroller) hergestellt. Dazu habe ich diesen Aufruf hier verwendet:

Code: Alles auswählen

OpenSerialPort(#PB_Any, "/dev/rfcomm0", 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 4096, 4096)
Man muss dazu sagen, dass das unter Linux war und die Baudrate trotzdem an die eingestellte Baudrate vom Bluetooth-Device angepasst sein muss.
#Ton
Beiträge: 11
Registriert: 30.03.2013 11:57

Re: OpenSerialPort() - Data: Bits or Bytes?

Beitrag von #Ton »

Ich verwende momentan 7 Bits & 115200 Bauds bei OpenSerialPort() und es funktioniert, obwohl beim Gerätetreiber 8 Bits & 9600 Bauds für den Dongle eingestellt sind.
Es funktionieren aber auch Bauds wie z.b 138468. :freak:

Hats bei Dir nur geklappt, nachdem du die Baudraten aufeinander abgestimmt hast?
Antworten