hex Steuerbefehle an serielle Schnittstelle senden

Hier ist das Datenblatt zu finden. Da steht alles drin.
Link hat nicht funktioniert.
such mal unter Google nach "LMS%20Communication%20Manual" dann findest Du das Quick Datenblatt.
 
Zuletzt bearbeitet:
moin


Versuch doch mal folgendes:
Code:
#include <windows.h>
#include <iostream>

using namespace std;

int i=0;

int main()
{
	DCB           dcb;
	HANDLE hCom = CreateFile ("COM1", GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
	dcb.DCBlength = sizeof(DCB);
	GetCommState (hCom, &dcb); 
	dcb.BaudRate  = 9600;
	dcb.ByteSize  = 8;   
	dcb.Parity    = NOPARITY;    
	dcb.StopBits  = ONESTOPBIT;  
	SetCommState (hCom, &dcb);


	DWORD iBytesWritten;
	unsigned char ucMsg[5];

	ucMsg[0] = (char) 0x02;
	ucMsg[1] = (char) 0x00;
	ucMsg[2] = (char) 0x01;
	ucMsg[3] = (char) 0x00;
	ucMsg[4] = (char) 0x31;
	ucMsg[5] = (char) 0x15;
	ucMsg[6] = (char) 0x12;

	WriteFile (hCom, ucMsg, 7, &iBytesWritten, NULL);
		
	cin.get();
	
        CloseHandle (hCom);

	return 0;
}

Vielleicht musst du die Parity und StopBit noch anpassen.


mfg
umbrasaxum
 
Das funktioniert auch, wichtig schien hier wohl das cast auf char zu sein. Wie schon bei der Lösung von Dir weiter oben.
Ich bekomme mittlerweile eine Antwort. Die sieht nur ziemlich kryptisch aus.
Sind Steuerzeichen, wie DC2 (0x12), etc. eigentlich irgendwie darstellbar, vielleicht z.B. als 0x12?
 
moin


Eigentlich schon, z.B. mit cout<< ios_base::hex << atoi(var);
Vielleicht musst du statt ios_base::hex auch ios::hex nehmen.


mfg
umbrasaxum
 
moin


Dem Manual nach solltest du als Antowrt eine Zeichen kette halten deren erste drei Zeichen 0x06 0x02 0x81 erhalten.


mfg
umbrasaxum
 
strlen() kann auch nicht funktionieren, weil es nach nach dem ersten Byte mit dem wert 0 abbricht, da ein string in c/c++ mit 0 terminiert wird. Es arbeitet also wahrscheinlich völlig korrekt, dein 2. byte ist 0 und somit liefert strlen() nur die Länge 1 zurück. Nach deinem Quellcode weiter oben sendet er wahrscheinlich nur ein Byte (eventuell mal mit den Anzahl der geschriebenen Bytes vergleichen.) Wenn du also binäre Daten versenden willst, musst du die Länge mit übergeben. Ein beenden des Buffers mit '\0' ist überflüssig. Das heist deine Funktionskopf müsste in etwa so aussehen.

Code:
unsigned long ComPort::Send(const char *buffer,const DWORD size)

und weiter unten dann:

Code:
if (WriteFile(hCom, text, size, &sent, NULL))

Da dein externes Gerät ja wahrscheinlich immer bestimmte Kommandosequenzen benötigt z.B zur Initialisierung, sind die dir ja bekannt und somit auch die Länge.

Wenn du unterschiedliche Länge der Sequenzen hast, erweitere die Sequenzen und schreibe in das erste Byte die Länge die du dann auslesen kannst und hinten dran die eigentliche Sequenz (ab 2. Byte) und sende dann den Buffer ab den 2. Byte an des externe Gerät. (vergleiche mit: Strings in Pascal)

oder pack sie in eine Struktur:

Code:
struct befehl
{
  DWORD size;
  char* buffer;
};


Ich hoffe es hilft weiter.

Gruß Byteblaster
 
Danke für den Vorschlag mit den struct. Scheint das sinnvollste zu sein, da ich mit teilweise bis zu 720 Werten zu rechnen habe und mir jetzt auch nicht im Klaren darüber bin inwieweit sich jeder Meßwert über ein Byte darstellt.

cout<< ios_base::hex << atoi(var);
Vielleicht musst du statt ios_base::hex auch ios::hex nehmen.
funktioniert nur insoweit, dass bspw. DC2 (0x12) als 20480 ausgegeben wird. weiss auch nicht wieso
 
probier doch mal:

Code:
itoa(buffer[i],text,16);

Um bei meiner Struktur zu bleiben ;-), i entspricht hier dem entsprechenden Byte innerhalb des Buffers.

Beispiel
Code:
cout << "0x" << itoa(buffer[i],string,16) << " ";

Gruß Byteblaster
 
Danke, das war´s. Mit
Code:
cout << " 0x" << itoa(data_status_req[6],data_status_req,16) << " ";
bekomm ich als Ausgabe für DC2 auch 0x12.
Dann werde ich mich mal an die Arbeit machen und versuchen, Daten vom Gerät auch zu verstehen. Dafür werde ich dann eine neue Klasse aufsetzen.
Gruß Jower
 
Zurück