Seite 1 von 1

qextserialport probleme beim öffnen

Verfasst: 8. März 2007 15:54
von gyrosundmaronen
Moin Moin

Ich benutze die Klasse qextserialport(version1.0,freundlicherweise gesponsort von dvdjimmy) und hab probleme beim öffen eines Ports. Ich benutze qt4 und hab mir mit dem qtdesigner eine gui erstellt. Jetzt möchte ich gerne einmalig Daten senden und über einen bestimmten Zeitpunkt ständig Daten empfangen. Diese Empfangszeit kann mit einem Button abgebrochen werden. Die Daten die empf. und gesend. werden sollen, sind in einem Protokoll vorhanden das aus einem struct besteht. Das Protokoll schreib ich in einen String und der wird dann komplett an die RS232 schnittstelle gesendet. Geht das so??? Oder kann man einfach das so basteln, dass der charpointer der für die Fkt. writeData benötigt wird, einfach auf das struct zeigt. Aber mein Hauptproblem ist das er den Port nicht öffnet. Allerdings konnte ich nur virtuell den Port ansprechen mit der Software: SerialTestW32.
Danke schon mal im voraus....

gyros

Code: Alles auswählen


writeData((char*)protocol,protocol)==0 KANN MAN DAS MACHEN???

typedef struct frame
{
	int flag;
	int eingang[8];
	bool MFC_freigabe[8];
	int sollwert[8];
	int ausgang[8];
};
#include "MyDialog.h"

MyDialog::MyDialog()
	:QDialog()
{
 senden = new QextSerialPort();
_ui.setupUi(this);
initialUi();
	
}

void MyDialog::send_RS232(void)
{
for(int i = 0; i < 8; i = i++)
{
			

			 
string2 = QString::number(protocol.MFC_freigabe[i],16);
string1 =  string1 + "MFC_freigabe:"  +string2;
string2 = QString::number(protocol.eingang[i],16);
string1 =  string1 + "eingang:" + string2;
string2 = QString::number(protocol.ausgang[i],16);
string1 = string1+ "ausgang:" + string2;
string2 = QString::number(protocol.sollwert[i],16);
string1 = string1 + "sollwert:" +string2;

} 

_ui.lineEdit->setText(string1);
		
senden->setPortName(ui1.comboBox->currentText());
senden->setDataBits(DATA_8);
senden->setFlowControl(FLOW_OFF);
senden->setStopBits(STOP_1);
senden->setParity(PAR_NONE);
senden->setTimeout ( 0,3);


if(senden->open())
{
senden->flush();
QMessageBox::information(this, "Message", QString("PORT %1 IS OPEN  ").arg(senden->portName()));
}
else
_ui.lineEdit->setText("ERROR!!! PORT NOT OPEN: " + senden->portName()); 

/*for(int i = 0; i < 8; i = i++)
{
			
if (write_data((char*)protocol.MFC_freigabe[i],protocol.MFC_freigabe[i])==0)
_ui.lineEdit->setText("TRANSMIT ERROR ON: " + ui1.comboBox->currentText() );
if (write_data((char*)protocol.eingang[i],protocol.eingang[i])==0)
_ui.lineEdit->setText("TRANSMIT ERROR ON: " + ui1.comboBox->currentText() );
if (write_data((char*)protocol.ausgang[i],protocol.ausgang[i])==0)
_ui.lineEdit->setText("TRANSMIT ERROR ON: " + ui1.comboBox->currentText() );
if (write_data((char*)protocol.sollwert[i],protocol.sollwert[i])==0)
_ui.lineEdit->setText("TRANSMIT ERROR ON: " + ui1.comboBox->currentText() );
//write_data(string1.toLatin1(),string1.length());
}*/
		
if(senden->isOpen())
{
senden->writeData((char*)string1.data(),string1.length()QMessageBox::information(this, "Message", QString("WRITE ON %1 WAS SUCCESSFULL").arg(senden->portName()));
		   
}
else
QMessageBox::warning(this, "Message", QString("WRITE ERROR ON PORT: %1 ").arg(senden->portName()));
senden->close();

}

Verfasst: 8. März 2007 16:18
von Christian81
writeData((char*)protocol,protocol)==0 KANN MAN DAS MACHEN???
Doppelt nein

1. writeData() ist eine interne Funktion die nicht für den Nutzer von QIODEvice da ist. Man sollte write() benutzen.

2. was soll das zweite 'protocol' da? Da muss doch die Grösse der zu sendenden Daten hin...

Verfasst: 8. März 2007 16:24
von gyrosundmaronen
writeData() ist auch eine Funktionvorgabe von qextserialport!!!
Wie kann man denn die länge eines dieses Protokolls rauskriegen???
Aber das Hauptproblem ist das ich den COMPORT noch nicht mal öffnen kann.

Verfasst: 8. März 2007 16:41
von Christian81
gyrosundmaronen hat geschrieben:writeData() ist auch eine Funktionvorgabe von qextserialport!!!
Vielen Dank für die vielen !!! Lies die Doku, schau von was QExtSerial abgeleitet ist und ich habe Recht.
Wie kann man denn die länge eines dieses Protokolls rauskriegen???
C für Anfänger - was macht sizeof()
Aber das Hauptproblem ist das ich den COMPORT noch nicht mal öffnen kann.
Passt der Portname? Gibt es irgend eine Fehlerfunktion die man abrufen könnte um nähere Infos zu bekommen?

Verfasst: 8. März 2007 18:50
von gyrosundmaronen
ooh Entschuldige bitte meine Dreistigkeit :wink:

"C für Anfänger" ist aber auch nicht gerade dezent

Bin noch nicht lange mit c und c++ vertraut.
Habs hinbekommen!!! Man muß explizit angeben ob man schreiben oder lesen will von oder auf dem COMPORT.
Du kannst mich jetzt für ne'Vollplinse halten aber warum ich writeData nicht nehmen darf versteh ich immer noch nicht, da sie als Funktion in qextserialdoku als Funktion zum senden von Daten an den COMPORT, angegeben wurde!?

Mit freundlichen Grüssen

gyros

Verfasst: 8. März 2007 19:00
von Christian81
Lies doch bitte die Doku zu QIODevice!
Dort siehst du dass writeData() virtual protected ist und demnach von allen Klassen, die QIODevice verwenden, reimplementiert werden muss. QIODevice ist also ein Interface.
Und da sie protected ist kann man auch von außen nicht drauf zugreifen. bei Dir ist das nur weil Du den 'Fehler' gemacht hast von QExtSerial abzuleiten anstatt (wie normalerweise bei QIODevice üblich) eine Instanz davon zu benutzen-

Verfasst: 9. März 2007 13:16
von gyrosundmaronen
Moin

Hab jetzt die Funktion read() genommen aber irgendwie empfängt er keine Daten. Wenn ich den String "ausgabe" ausgeben will, wird nichts angezeigt. Kannst du mir helfen???

Code: Alles auswählen

while(bytesWaiting)
{
senden->read(buffer,bytesWaiting);
buffer[bytesWaiting] = '\0';
QString msg = buffer;
ausgabe.append(msg);
}