hex Steuerbefehle an serielle Schnittstelle senden

jower

Mitglied
Hallo,
ich würde gerne über die API Funktion WriteFile einen hexadezimalen Steuerbefehl über die serielle Schnittstelle an ein Gerät senden. Es handelt sich dabei um einen Statusrequest.Den hab ich in der Form "02 00 01 00 31 15 12" vorliegen. Mein Problem besteht nun darin, dass ich nicht weiss, wie ich das verschicken soll. Ich habe versucht, dass in einen 7 Felder großen Array zu schreiben (nach dem Motto:
Code:
char data_status_req[7]; data_status_req[0] = 0x02;...
), funktioniert aber nicht. Kann mir da vielleicht jemand den entscheidenden Tipp geben?
Danke
 
moin


Ein bscihen wenig INformationen die du da gibst, besonders in Hinsicht zu den Fehlern.

Aber hier ein Beispiel wie ich das mal gemacht hab:
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  = 2400;
	dcb.ByteSize  = 8;   
	dcb.Parity    = NOPARITY;    
	dcb.StopBits  = ONESTOPBIT;  
	SetCommState (hCom, &dcb);


	DWORD iBytesWritten;
	unsigned char ucMsg[5];

	for(int i=0; i < 8; i++)
	{
		ucMsg[0] = (char)13;
		ucMsg[1] = (char)1;
		ucMsg[2] = 'S';
		ucMsg[3] = (char)49 + i;
		ucMsg[4] = ucMsg[0] ^ ucMsg[1] ^ ucMsg[2] ^ ucMsg[3];

		WriteFile (hCom, ucMsg, 5, &iBytesWritten, NULL);
		//WriteFile (hCom, ucMsg, 5, &iBytesWritten, NULL);
		
		Sleep(350);
		//cin.get();
	}

	CloseHandle (hCom);

	return 0;
}


mfg
umbrasaxum
 
Danke erstmal, hätte das gerne auch ein wenig genauer beschreiben wollen, aber ich weiss nicht so ganz, wie sich dem Problem nähern kann. Das einzige, was ich feststellen konnte, ist, dass ich von dem Gerät keine Antwort erhalte.
Wenn ich das richtig verstehe, sendest Du die Befehle dezimal. Mein versuch war es das hexadezimal zu machen. Sieht doch eigentlich ähnlich aus, oder? Nur bei mir funktioniert´s nicht.
Code:
char data_status_req[7];
data_status_req[0] = 0x02;
data_status_req[1] = 0x00;
data_status_req[2] = 0x01; 
data_status_req[3] = 0x00;
data_status_req[4] = 0x31; 
data_status_req[5] = 0x15;
data_status_req[6] = 0x12;
std::cout << "Status Request Daten: " << std::showbase << std::hex << data_status_req << Bytes: " << std::showbase << std::dec << (DWORD) strlen(data_status_req) << std::endl;
Die Ausgabe gibt dann das hier aus:
Status Request Daten: :) Bytes: 1
kannst Du da was mit anfangen , bzw. was mach ich falsch?

das Ganze schicke ich dann so
Code:
DWORD dwBytesWRITE = 0;
dwBytesWRITE = comport.Send(data_status_req);
Code:
unsigned long ComPort::Send(const char *text) 
{ 
   if(hCom!=INVALID_HANDLE_VALUE) 
   { 
      unsigned long sent; 
      DWORD l = (DWORD) strlen(text);
      if (WriteFile(hCom, text, (DWORD) strlen(text), &sent, NULL))   
	  return(sent);
      else
	  return(0);
   } 
   else 
      return(0); 
}
Hast Du eine Ahnung wo das Problem liegen könnte.
 
Zuletzt bearbeitet:
moin


Das Problem könnte sein das data_status_req keinen "Abschluss" bekommt.
Füge mal noch einen data_status_req[7] = '\0'; hinzu.

Und vielleicht musst du dann strlen(text) noch minus 1 rechnen.

Ich sende übrigens keine ints sondern chars.


mfg
umbrasaxum
 
hab ihc gemacht, nur funktioniert´s nicht.
Code:
	char data_status_req[8];
	data_status_req[0] = (char) 2;
	data_status_req[1] = (char) 0;
	data_status_req[2] = (char) 1; 
	data_status_req[3] = (char) 0;
	data_status_req[4] = (char) 49; 
	data_status_req[5] = (char) 21;
	data_status_req[6] = (char) 18;
	data_status_req[7] = '\0';
	std::cout << "Status Request Daten: "  << data_status_req << " Bytes: " << std::showbase << std::dec << (DWORD) (strlen(data_status_req)-1) << std::endl;

Das gibt mir als Ausgabe:
Status Request Daten: :) Bytes: 0

Aber warum hat er 0 Byte? Sollten es nicht 7 sein? irgendwie scheinen die Daten nicht richtig zu sein, oder?
Und den Smile versteh ich auch nicht, scheint mich wohl zu mögen :)
 
ich glaube ich habe den Fehler ziemlich stark eingegrenzt.
strlen scheint nicht ganz zu funktionieren, warum weiß ich auch nicht.
wenn ich eine Methode Send schreibe, der die Länge der zu sendenden Daten zu übergeben ist, funktioniert´s. Ist nur leider nicht so elegant.
Wenn also jemand eine Idee haben könnte, wie ich etwas Senden könnte, ohne zu wissen, wie lang das Ganze ist, wäre ich sehr dankbar.
Gruß jower
 
Was meinst du eigentlich mit 'hexadezimal senden'. Willst Du nur die Werte 2, 0, 1, 0, 31, 15 und 12 (also 7 Bytes) nacheinander verschicken, oder willst Du die Zeichenkette "02 00 01 00 31 15 12" (also 20 Bytes) verschicken?
 
Zurück