Bytes senden

Hardware- und Elektronikbasteleien, Ansteuerung von Schnittstellen und Peripherie.
Fragen zu "Consumer"-Problemen kommen in Offtopic.
Benutzeravatar
RAaBe
Beiträge: 64
Registriert: 07.09.2004 12:52
Wohnort: Münsterland
Kontaktdaten:

Bytes senden

Beitrag von RAaBe »

Hallo, habe ein Problem und sehe vor lauter Bäume den Wald nicht mehr.
Folgender Code:

Code: Alles auswählen

*Puffer = AllocateMemory(1024) ;
Port$                      = "COM5"

If OpenSerialPort(0, Port$, 19200, #PB_SerialPort_EvenParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
  
  Puffer.s = Chr(2) + Chr(0) + Chr(4) + Chr(0) + Chr(6) + Chr(10) + Chr(3)
  PokeA(*Puffer + 0, 2)
  PokeA(*Puffer + 1, 0)
  PokeA(*Puffer + 2, 4)
  PokeA(*Puffer + 3, 0)
  PokeA(*Puffer + 4, 6)
  PokeA(*Puffer + 5, 10)
  PokeA(*Puffer + 6, 3)
  
  WriteSerialPortData(0, @Puffer, 7)
  
Debug PeekA(*Puffer + 0)
Debug PeekA(*Puffer + 1)
Debug PeekA(*Puffer + 2)
Debug PeekA(*Puffer + 3)
Debug PeekA(*Puffer + 4)
Debug PeekA(*Puffer + 5)
Debug PeekA(*Puffer + 6)

Delay(3000)
Else
  MessageRequester("Error", "Can't open the serial port: " + Port$)
EndIf

CloseSerialPort(0)
... ergibt im Terminal:

02 00 04 00 06 00 0A

...sind auch 7 Zeichen, nur hat sich ein 00 nach dem 06 eingeschlichen un das 03 fehlt.

Ich stehe im Moment auf dem Schlauch!

Reinhard
Benutzeravatar
Mijikai
Beiträge: 704
Registriert: 25.09.2016 01:42

Re: Bytes senden

Beitrag von Mijikai »

was soll gesendet werden?
Unicode oder Ascii?

Unterschied:

Code: Alles auswählen

EnableExplicit

Global str_unicode.s
Global *str_ascii

str_unicode = Chr(2) + Chr(0) + Chr(4) + Chr(0) + Chr(6) + Chr(10) + Chr(3)
*str_ascii = Ascii(str_unicode)

ShowMemoryViewer(@str_unicode,StringByteLength(str_unicode) + 2)
;ShowMemoryViewer(*str_ascii,MemorySize(*str_ascii))
Unicode -> 2 Bytes pro Chr
Ascii -> 1 Byte pro Chr

Im Beispiel werden nur 7 Bytes gesendet was nicht zu Unicode passen würde.
Es wird auch ein 2 ter Buffer '*Puffer' erstellt welcher aber nicht zum senden genutzt wird!
Benutzeravatar
RAaBe
Beiträge: 64
Registriert: 07.09.2004 12:52
Wohnort: Münsterland
Kontaktdaten:

Re: Bytes senden

Beitrag von RAaBe »

Danke, das mit dem *Puffer war die Lösung.

Man probiert soviel aus, bis nichts mehr stimmt!

Reinhard
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8397
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 20.10
NVIDIA Quadro P2200
Wohnort: Saarbrücken
Kontaktdaten:

Re: Bytes senden

Beitrag von NicTheQuick »

Dein Code im ersten Post ist fast richtig.
Du musst nur die Zeile mit Puffer.s entfernen, weil die nicht nötig ist, und dann auch *Puffer nutzen: WriteSerialPortData(0, *Puffer, 7)

*Puffer und Puffer sind nicht die gleiche Variable!
Außerdem kann man keine Strings mit Nullzeichen erstellen. Das Nullzeichen steht immer implizit am Ende.

Hier noch zwei Alternativen für dich:
Mit einem Array

Code: Alles auswählen

Dim daten.a(7)

Port$                      = "COM5"

If OpenSerialPort(0, Port$, 19200, #PB_SerialPort_EvenParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
	
	daten(0) = 2
	daten(1) = 0
	daten(2) = 4
	daten(3) = 0
	daten(4) = 6
	daten(5) = 10
	daten(6) = 3
	
	WriteSerialPortData(0, @daten(0), 7)
	
	Delay(3000)
Else
	MessageRequester("Error", "Can't open the serial port: " + Port$)
EndIf

CloseSerialPort(0)
Mit DataSection und Structure

Code: Alles auswählen

EnableExplicit

Structure Daten
	length.i
	d.a[0]
EndStructure

Define Port$                      = "COM5"

If OpenSerialPort(0, Port$, 19200, #PB_SerialPort_EvenParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)

	Define *daten.Daten = ?daten
	
	WriteSerialPortData(0, @*daten\d, *daten\length)
	
	Delay(3000)
	
	CloseSerialPort(0)
Else
	MessageRequester("Error", "Can't open the serial port: " + Port$)
EndIf



DataSection
	daten:
		Data.i 7
		Data.a 2, 0, 4, 0, 6, 10, 3
EndDataSection
Bild
Benutzeravatar
RAaBe
Beiträge: 64
Registriert: 07.09.2004 12:52
Wohnort: Münsterland
Kontaktdaten:

Re: Bytes senden

Beitrag von RAaBe »

@NicTheQuick

Danke für die Lösungsvorschläge!
Antworten