QTシリアル通信2

3814 ワード

           ,             。  Qt            ,                ,         。        。        ,             。      , win ,           :qextserialbase.h,qextserialport.h,win_qextserialport.h,qextserialbase.cpp,qextserialport.cpp,win_qextserialport.cpp。    linux ,  win_qextserialport.h win_qextserialport.cpp   posix_qextserialport.h posix_qextserialport.cpp       。
 
        COM :        (  linux    )。
 class mainwindow : public QMainWindow,public Ui_mainwindowClass
{
	Q_OBJECT

	public:
		mainwindow();
		~mainwindow(){};

	public:
		QString getcomm(int index,QString keyorvalue); //    

	private:
		void init_com();
		Win_QextSerialPort *myCom;//    
                QTimer *timer;
		QStringList m_listCommand;	//      
		wchar_t subkey[80];
		wchar_t keyname[256]; //    
		char keyvalue[256];  //    
		int indexnum;
		DWORD keysize,type,valuesize;
		HKEY hKey;
        ......
} 
 
 void mainwindow::init_com()
{
	QString path="HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM";
	QSettings *settings=new QSettings(path,QSettings::NativeFormat);
	QStringList key=settings->allKeys();
	QStringList comlist ;
	QStringList Baudlist ;
	QStringList Paritylist ;
	QStringList DataBitslist;
	QStringList StopBitslist;
	QStringList ControlFlowlist;

	int kk = key.size();
	int i;
	comlist.clear();
	for(i=0;i<kk;i++)
	{
		comlist << getcomm(i,"value");
	}
	comboBox->addItems(comlist);

	//   
	Baudlist.clear();
	Baudlist<< "300" << "600" << "2400" << "4800" << "9600"<< "19200" << 
			 "56000" << "57600" << "115200"<<"128000"<<"256000"<< "921600";
	baudRateComboBox->addItems(Baudlist);

	......
}

QString mainwindow::getcomm(int index,QString keyorvalue)
{
	QString commresult="";
	QString strkey="HARDWARE\\DEVICEMAP\\SERIALCOMM";//    
	int a=strkey.toWCharArray(subkey);
	subkey[a]=L'\0';
	if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,subkey,0,KEY_READ|KEY_QUERY_VALUE,&hKey)!=0)
	{
		QString error="Cannot open regedit!";
	}

	QString keymessage="";//  
	QString message="";
	QString valuemessage="";//  
	indexnum=index;//         

	keysize=sizeof(keyname);
	valuesize=sizeof(keyvalue);

	if(::RegEnumValue(hKey,indexnum,keyname,&keysize,0,&type,(BYTE*)keyvalue,&valuesize)==0)
	{
		//    
		for(int i=0;i<keysize;i++)
		{
			message=QString::fromStdWString(keyname);
			keymessage.append(message);
		}
		//    
		for(int j=0;j<valuesize;j++)
		{
			if(keyvalue[j]!=0x00)
			{
				valuemessage.append(keyvalue[j]);
			}
		}

		if(keyorvalue=="key")
		{
			commresult=keymessage;
		}
		if(keyorvalue=="value")
		{
			commresult=valuemessage;
		}
	}
	else
	{
		commresult="nokey";
	}
	::RegCloseKey(hKey);//     
	return commresult;
} 
            ,  ,            ,         ,          。     ,    9   (  9)   9       。
 
 
 QString m_port = port_name.right(port_name.length()-3);
if(m_port.toInt()>9)
{
	QString xx = "\\\\.\\";
	xx.append(port_name);
	myCom->setPortName(xx);
}
else
{
	myCom->setPortName(port_name);
}

myCom->open(QIODevice::ReadWrite); 
           ,      
 
 
 connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));//      ,                   
            。
 
 
 QString str=sendEdit->toPlainText();// sendEdit     str 
str.append("\r
"); QByteArray aa=str.toAscii(); const char * strdata=aa.data(); int rec=myCom->writeData(strdata,qstrlen(strdata)); myCom->flush(); void mainwindow::readMyCom() { char buf[1024]; memset(buf, 0, sizeof(buf)); qint64 temp=myCom->readData(buf,sizeof(buf)); buf[temp+1]=0; }