Seriell

Viper2009

Erfahrenes Mitglied
Hallo ich bin’s mal wieder :D.

Meine frage ist wie folgt.

Ich lese über eine Serielle Schnittstelle was ein.

C:
#define BufferSize 25

ReadFile(m_hComm,&Buffer,BufferSize,&BytesRead,0);

Bsp. "34fd4qas3"
Die Größe müsste 9 sein, ist sie aber nicht, sie wird als 11 angezeigt.
Problem dabei ist doch das er nach der 3, immer Müll mit sendet? Wenn ich falsch liege bitte Koregieren.
Also muss ich ihn sagen, dass nach der 3 Schluss ist, mit "\0" oder?

Manchmal bekomme ich auch merkwürdige Zeichen hinter den Buffer obwohl ich dies nicht gesendet habe

MFG Viper
 
Hallo Viper,

Die Größe müsste 9 sein, ist sie aber nicht, sie wird als 11 angezeigt.
Die serielle Kommunikation verwendet in der Regel ein bestimmtes Protokoll. Das heisst, neben den Nutzdaten hast noch weitere Daten für die Kommunikationssteuerung. Du solltest dir dazu mal die Schnittstellenbeschreibung (falls es sowas gibt) zu dem Gerät anschauen, welches du über den seriellen Port ansprechen willst.

Manchmal bekomme ich auch merkwürdige Zeichen hinter den Buffer obwohl ich dies nicht gesendet habe
Was bedeutet "hinter dem Buffer"? Bekommst du die Daten wieder zurück, die du sendest oder was ist mit "obwohl ich dies nicht gesendet habe" gemeint?

Gruß
MCoder
 
Hi danke für die schnelle antwort.

Was ich damit meine, sind manchmal solche "" Zeichen. Was das auch sein soll.
Falls du dies nicht richtig sehen kannst es sieht so aus [] nur zusammen.

Hier ist mal meine log die das Protokolliert

TAG: Z94C8100000000200

[][]
Gekürzt: 0200

[][]
Size: 21

Bei gekürzt will ich eigentlich nur die letzten acht Zeichen haben bekomme sie auch aber leider mit den [] davor.
 
Mein Code dazu.

C:
#define BufferSize 25

void ComRead (void)
{
	char Buffer[BufferSize];
	DWORD BytesRead;

	ReadFile(m_hComm,&Buffer,BufferSize,&BytesRead,0);
	{
		if(BytesRead > 0)
		{
			ToLog(TAG, "TAG: %s", Buffer);
			ToLog(TAG, "Gekürzt: %s", Buffer+strlen(Buffer)-8);
			ToLog(TAG, "Size: %i",strlen(Buffer));
		}
	}
}
 
Hi

is denn das letzte Byte vom Buffer ein 0-Byte beziehungsweise, das Byte nach den empfangenen Daten (Buffer[BytesRead] = 0)

Sonst weiß printf nicht wann der String zuende ist und gib die Bytes, die danach im Speicher liegen aus.


mfg higret
 
Da kann ich higret nur zustimmen, das letzte Byte der Nutzdaten ist sehr wahrscheinlich kein '\0'.
Das kannst du ja dann selbst setzen:
C++:
if(BytesRead > 0)
{
    Buffer[BytesRead] = 0;  // 0 für Stringende

    ToLog(TAG, "TAG: %s", Buffer);
    ToLog(TAG, "Gekürzt: %s", Buffer+strlen(Buffer)-8);
    ToLog(TAG, "Size: %i",strlen(Buffer));
}
Gruß
MCoder
 
Ja das letzte Zeichen vom Buffer ist eine Null da ich ein RFID TAG einlese, der so programmiert worden das er dieses Zeichen "Z94C8100000000200" immer senden soll. Der Tag ist 16 Bytes lang, nur er sagt zu mir, da er dies [] mit liest das es 20 Bytes sind. Und ich benötige nur die letzten Acht Bytes also "00000200", bekommen tue ich aber nur das 0200[][].

Ahh schön jetzt ist schon mal der ganze Müll weg. Nur er trennt die Bytes nicht richtig er liest die Null mit also ich erhalte "000200" Das sind nur 6 Bytes brauchen tue ich aber 8.

//edit: Er liest 18 Bytes, Tag ist aber nur 16 Bytes groß :D

MFG Viper

Mhh ... habe so versucht:
C:
ToLog(TAG, "Gekürzt: %s", (Buffer-2)+strlen(Buffer)-8);

Nun habe ich ein weiteres problem und zwar muss ich den Buffer, der in Hex ist nun in int wieder geben. Problem dabei ist nur das ich den Buffer schon mit ein string wiedergebe. :)

Mal schnell googlen. :D

MFG Viper
 
Hi

hmm was mich stutzig macht, du sagst der Tag soll nur 16 Bytes lang sein

aber der String "Z94C8100000000200" sind 18 Bytes (nach "...200" kommt ja noch das \0-Byte)
 
Mhh auch ne möglichkeit :D dachte nur was man sehen kann ist ein byte :confused: :D
Dafür hat man ja internet und Forum :D

Bin grade am überlegen wie ich den Buffer in hex wiedergebe und das dann in dez umwandele.
 
Zurück