Problem mit serieller Port Erkennung Win / Linux

Alles rund um die Programmierung mit Qt
Antworten
topo
Beiträge: 24
Registriert: 3. Dezember 2009 16:58

Problem mit serieller Port Erkennung Win / Linux

Beitrag von topo »

Hallo Qt-Programmierer,

ich greife mit der externen Lib QextSerialPort auf meine seriellen Schnittstellen zu, um mit verschiedenen Geräten zu kommunizieren. Nun möchte ich aber nur die Schnittstellen in meiner Verbindungsliste haben, die im System auch wirklich zur Verfügung stehen. Dazu brauche ich also sowas wie einen kleinen seriellen Portscanner. Damit habe ich begonnen, aber leider funktioniert er noch nicht so ganz. Hier mein bisheriger Code für Windows:

Code: Alles auswählen

// setup windows handle
HANDLE comH  = INVALID_HANDLE_VALUE;

QString port = "COM";
// the range for port access limited to 256
int	portRange = 0x0100;

// check the full range (1..256)for the com ports
for(int i = 1 ; i < portRange ; ++i)
{
	// build COM port name with number
	QString fullPortName = port + QString::number(i,10);

  // reset handle variable again
	comH = INVALID_HANDLE_VALUE;

  // Opening serial port with the port name
	comH = CreateFileA ( fullPortName.toLocal8Bit().data(),					
							GENERIC_READ | GENERIC_WRITE,   				// Read/Write-Access
							0,                              				// do not share
							NULL,                           				// default security
							OPEN_EXISTING,
							FILE_ATTRIBUTE_NORMAL,         					// synchronous I/O
							NULL  );                        				// no attr. templat

  // if a com port could be opened, store the port in the list
	if( comH != INVALID_HANDLE_VALUE )
	{
		portList << fullPortName;
	}
	// close the com port handle again
	CloseHandle(comH); 
}
Leider bekomme ich aber immer eine leere Liste, obwohl freie serielle Ports zur Verfügung stehen :cry:. Hat jemend von Euch eine Idee, woran es liegen könnte?

Das gleiche würde ich noch für Linux benötigen. Hat jemand eine kleine, schnelle und einfache Lösung, wie eine solche Porterkennung unter Linux aussehen könnte?

Danke schon im Voraus für Eure Hilfe!

Viele Grüße,
Thomas
RavenIV
Beiträge: 267
Registriert: 21. Januar 2009 14:24
Wohnort: Waldshut

Beitrag von RavenIV »

Hast Du mal geschaut, was fullPortName.toLocal8Bit().data() liefert?

Versuch mal QString::toAscii () oder QString::toStdString ()

Was passiert, wenn Du QextSerialPort::open(...) für einen ungültigen Port anwendest?
Linux, das längste Text-Adventure aller Zeiten
topo
Beiträge: 24
Registriert: 3. Dezember 2009 16:58

Beitrag von topo »

Hallo RavenIV,

QextSerialPort::open() hat das Problem, dass es sich bei Windows und Linux recht unterschiedlich verhält. Daher bin ich von diesem Weg abgekommen!

fullPortName.toLocal8Bit().data() sieht wie folgt aus:

Code: Alles auswählen

Debug: Port Name:  "COM1"    / toLocal8Bit:  COM1 
Debug: Valid File Handle 
Debug: Port Name:  "COM2"    / toLocal8Bit:  COM2 
Debug: Invalid File Handle 
Debug: Port Name:  "COM3"    / toLocal8Bit:  COM3 
Debug: Invalid File Handle 
Der oben angezeigte Code scheint jetzt zu funktionieren, habe etwas herumprobiert und anscheinend hatte ich ein Problem mit Defines in meinen Precompiled Headers. Ist jetzt aber behoben :D !

Hast Du eine Idee, wie es unter Linux gut klappen könnte? Evtl. analog zu der Windows Variante?

Danke für Deine Hilfe.

Viele Grüße,
Thomas
RavenIV
Beiträge: 267
Registriert: 21. Januar 2009 14:24
Wohnort: Waldshut

Beitrag von RavenIV »

Der Gedanke hinter Qt und den externen Libraries ist es ja, bei allesn Betriebssystemen den selben Code zu verwenden.

Es gibt auch noch QSerialDevice, das verwende ich.
Link hab ich grad nicht, einfach Foren-Suche.
Linux, das längste Text-Adventure aller Zeiten
topo
Beiträge: 24
Registriert: 3. Dezember 2009 16:58

Beitrag von topo »

QSerialDevice ist eine interessante Lib, die schöne Funktionen bietet. Leider steht sie unter GPL und ist daher für mich nicht zu verwenden. LGPL ist zwar angedacht und kommt wohl auch mit der nächsten oder übernächsten version, aber so lange kann ich nicht warten ;-). Ich muss wohl eine Alternative suchen.
Antworten