-
UID:24730
-
- 注册时间2007-05-15
- 最后登录2023-07-06
- 在线时间151小时
-
- 发帖255
- 搜Ta的帖子
- 精华0
- 金钱2570
- 威望258
- 贡献值0
- 好评度257
-
访问TA的空间加好友用道具
|
在打开串口口,直接调用write函数。给你发一个我写的简单的例子吧! - #include "qserialtool.h"
- #include <QtGui/QGroupBox>
- #include <QtGui/QGridLayout>
- #include <QtGui/QHBoxLayout>
- #include <QtGui/QVBoxLayout>
- #include <QtGui/QLabel>
- #include <QtGui/QComboBox>
- #include <QtGui/QPushButton>
- #include <QtGui/QFrame>
- #include <QtGui/QTextEdit>
- #include <QtGui/QCheckBox>
- #include <QtGui/QSpinBox>
- #include <QtGui/QMessageBox>
- #include <QTextStream>
- #include <QtGui/QFileDialog>
- #include <QFile>
- #include <QTimer>
- QSerialTool::QSerialTool( QWidget* parent )
- : QWidget( parent ), rxlen( 0 ), txlen( 0 ), bOpen( FALSE ),
- bAutoTx( FALSE )
- {
- glMain = new QGridLayout;
- gbPortPara = new QGroupBox( this );
- gbPortPara->setTitle( QString( tr("Serial Config") ) );
- glPortPara = new QGridLayout;
- lbPort = new QLabel( gbPortPara );
- lbPort->setText( QString( tr("Serial") ) );
- glPortPara->addWidget( lbPort, 0, 0, 1, 1 );
- cbPort = new QComboBox( gbPortPara );
- QStringList strlistPort;
- strlistPort << "COM1" << "COM2" << "COM3" << "COM4";
- cbPort->addItems( strlistPort );
- glPortPara->addWidget( cbPort, 0, 1, 1, 1 );
- lbBaud = new QLabel( gbPortPara );
- lbBaud->setText( QString( tr("Baud") ) );
- glPortPara->addWidget( lbBaud, 1, 0, 1, 1 );
- cbBaud = new QComboBox( gbPortPara );
- QStringList strlistBaud;
- strlistBaud << "300" << "600" << "1200" << "2400" << "4800"
- << "9600" << "19200" << "38400" << "57600" << "115200";
- cbBaud->addItems( strlistBaud );
- glPortPara->addWidget( cbBaud, 1, 1, 1, 1 );
- lbDataBit = new QLabel( this );
- lbDataBit->setText( QString( tr("DataBit") ) );
- glPortPara->addWidget( lbDataBit, 2, 0, 1, 1 );
- cbDataBit = new QComboBox( gbPortPara );
- QStringList strlistDataBit;
- strlistDataBit << "5" << "6" << "7" << "8";
- cbDataBit->addItems( strlistDataBit );
- glPortPara->addWidget( cbDataBit, 2, 1, 1, 1 );
- lbParity = new QLabel( gbPortPara );
- lbParity->setText( QString( tr("Parity") ) );
- glPortPara->addWidget( lbParity, 3, 0, 1, 1 );
- cbParity = new QComboBox( gbPortPara );
- QStringList strlistParity;
- strlistParity
- << QString( tr("None") )
- << QString( tr("Odd") )
- << QString( tr("Even") )
- << QString( tr("Mark") )
- << QString( tr("Space") );
- cbParity->addItems( strlistParity );
- glPortPara->addWidget( cbParity, 3, 1, 1, 1 );
- lbStopBit = new QLabel( gbPortPara );
- lbStopBit->setText( QString( tr("StopBit") ) );
- glPortPara->addWidget( lbStopBit, 4, 0, 1, 1 );
- cbStopBit = new QComboBox( gbPortPara );
- cbStopBit->addItem( QString("1") );
- cbStopBit->addItem( QString("1.5") );
- cbStopBit->addItem( QString("2") );
- glPortPara->addWidget( cbStopBit, 4, 1, 1, 1 );
-
- lbFlow = new QLabel( gbPortPara );
- lbFlow->setText( QString( tr("Flow Control") ) );
- glPortPara->addWidget( lbFlow, 5, 0, 1, 1 );
- cbFlow = new QComboBox( gbPortPara );
- QStringList strlistFlow;
- strlistFlow
- << QString( tr("Off") )
- << QString( tr("Hardware") )
- << QString( tr("Xon/Xoff") );
- cbFlow->addItems( strlistFlow );
-
- glPortPara->addWidget( cbFlow, 5, 1, 1, 1 );
- gbPortPara->setLayout( glPortPara );
- glMain->addWidget( gbPortPara, 0, 0, 1, 1 );
- pbOpen = new QPushButton( this );
- pbOpen->setText( QString( tr("Open") ) );
- glMain->addWidget( pbOpen, 1, 0, 1, 1 );
- glMain->setAlignment( pbOpen, Qt::AlignCenter );
-
- gbStatus = new QGroupBox( this );
- gbStatus->setTitle( QString( tr("Status") ) );
- glMain->addWidget( gbStatus, 2, 0, 1, 1 );
- glStatus = new QGridLayout;
- lbSerialStatus = new QLabel( gbStatus );
- lbSerialStatus->setText( QString( tr("Serial Status:") ) );
- glStatus->addWidget( lbSerialStatus, 0, 0, 1, 1 );
- leSerialStatus = new QLabel( gbStatus );
- leSerialStatus->setFrameStyle( QFrame::Panel|QFrame::Sunken );
- leSerialStatus->setAlignment( Qt::AlignCenter );
- leSerialStatus->setText( QString( tr("Closed") ) );
- glStatus->addWidget( leSerialStatus, 0, 1, 1, 1 );
- lbSendBytes = new QLabel( gbStatus );
- lbSendBytes->setText( QString( tr("Send Bytes:") ) );
- glStatus->addWidget( lbSendBytes, 1, 0, 1, 1 );
- leSendBytes = new QLabel( gbStatus );
- leSendBytes->setFrameStyle( QFrame::Panel|QFrame::Sunken );
- leSendBytes->setAlignment( Qt::AlignCenter );
- leSendBytes->setText( QString().setNum( txlen ) );
- glStatus->addWidget( leSendBytes, 1, 1, 1, 1 );
- lbReceiveBytes = new QLabel( gbStatus );
- lbReceiveBytes->setText( QString( tr("Receive Bytes") ) );
- glStatus->addWidget( lbReceiveBytes, 2, 0, 1, 1 );
- leReceiveBytes = new QLabel( gbStatus );
- leReceiveBytes->setFrameStyle( QFrame::Panel|QFrame::Sunken );
- leReceiveBytes->setAlignment( Qt::AlignCenter );
- leReceiveBytes->setText( QString().setNum( rxlen ) );
- glStatus->addWidget( leReceiveBytes, 2, 1, 1, 1 );
- pbClearCnt = new QPushButton( gbStatus );
- pbClearCnt->setText( QString( tr("Clear Counter") ) );
- glStatus->addWidget( pbClearCnt, 3, 0, 1, 2 );
- glStatus->setAlignment( pbClearCnt, Qt::AlignCenter );
- glStatus->setRowStretch( 4, 10 );
- gbStatus->setLayout( glStatus );
- fmVLine = new QFrame( this );
- fmVLine->setFrameStyle( QFrame::VLine|QFrame::Sunken );
- glMain->addWidget( fmVLine, 0, 1, 3, 1 );
- vblTxRx = new QVBoxLayout;
- gbSendItem = new QGroupBox( this );
- gbSendItem->setTitle( QString( tr("Send Tips:") ) );
- vblTxRx->addWidget( gbSendItem );
- vblSend = new QVBoxLayout;
- hblSend1 = new QHBoxLayout;
- ckbAutoCR = new QCheckBox( gbSendItem );
- ckbAutoCR->setText( QString( tr("Auto CR") ) );
- hblSend1->addWidget( ckbAutoCR );
- ckbAutoSend = new QCheckBox( gbSendItem );
- ckbAutoSend->setText( QString( tr("Auto Send") ) );
- hblSend1->addWidget( ckbAutoSend );
- lbCycle = new QLabel( gbSendItem );
- lbCycle->setAlignment( Qt::AlignRight|Qt::AlignVCenter );
- lbCycle->setText( QString( tr("Send Cycle") ) );
- hblSend1->addWidget( lbCycle );
- spCycle = new QSpinBox( gbSendItem );
- spCycle->setMaximum( 100000 );
- spCycle->setMinimum( 10 );
- spCycle->setSuffix( QString( tr("ms") ) );
- spCycle->setSingleStep( 1 );
- spCycle->setEnabled( FALSE );
- hblSend1->addWidget( spCycle );
- vblSend->addLayout( hblSend1 );
- teSend = new QTextEdit( gbSendItem );
- vblSend->addWidget( teSend );
- hblSend2 = new QHBoxLayout;
- pbSendFile = new QPushButton( gbSendItem );
- pbSendFile->setText( QString( tr("Send File") ) );
- pbSendFile->setEnabled( FALSE );
- hblSend2->addWidget( pbSendFile );
- pbClearSend = new QPushButton( gbSendItem );
- pbClearSend->setText( QString( tr("Clear Send") ) );
- hblSend2->addWidget( pbClearSend );
- pbHandSend = new QPushButton( gbSendItem );
- pbHandSend->setText( QString( tr("Send") ) );
- pbHandSend->setEnabled( FALSE );
- hblSend2->addWidget( pbHandSend );
- vblSend->addLayout( hblSend2 );
- gbSendItem->setLayout( vblSend );
- gbReceiveItem = new QGroupBox( this );
- gbReceiveItem->setTitle( QString( tr("Receive Tips:") ) );
- vblTxRx->addWidget( gbReceiveItem );
- vblReceive = new QVBoxLayout;
-
- teReceive = new QTextEdit( gbReceiveItem );
- vblReceive->addWidget( teReceive );
- hblReceive = new QHBoxLayout;
- ckbRcvHex = new QCheckBox( gbReceiveItem );
- ckbRcvHex->setText( QString( tr("Hex") ) );
- hblReceive->addWidget( ckbRcvHex );
- ckbAutoEnter = new QCheckBox( gbReceiveItem );
- ckbAutoEnter->setText( QString( tr("Auto Enter") ) );
- hblReceive->addWidget( ckbAutoEnter );
- pbClearRcv = new QPushButton( gbReceiveItem );
- pbClearRcv->setText( QString( tr("Clear Display") ) );
- hblReceive->addWidget( pbClearRcv );
- pbSaveRcv = new QPushButton( gbReceiveItem );
- pbSaveRcv->setText( QString( tr("Save Receive") ) );
- hblReceive->addWidget( pbSaveRcv );
- vblReceive->addLayout( hblReceive );
- gbReceiveItem->setLayout( vblReceive );
- glMain->addLayout( vblTxRx, 0, 2, 3, 3 );
- setLayout( glMain );
-
- cbPort->setCurrentIndex( 0 );
- cbBaud->setCurrentIndex( 8 );
- cbDataBit->setCurrentIndex( 3 );
- cbParity->setCurrentIndex( 0 );
- cbStopBit->setCurrentIndex( 0 );
- cbFlow->setCurrentIndex( 0 );
- port = new QextSerialPort( );
- port->setQueryMode( QextSerialPort::EventDriven );
- txCycle = spCycle->value();
- tmAutoTx = new QTimer( this );
- tmAutoTx->setSingleShot( TRUE );
- connect( pbOpen, SIGNAL( clicked() ), this, SLOT( slotOpenPort() ) );
- connect( cbPort, SIGNAL( activated(int) ), this, SLOT( slotPortChange(int) ) );
- connect( cbBaud, SIGNAL( activated(int) ), this, SLOT( slotBaudChange(int) ) );
- connect( cbDataBit, SIGNAL( activated(int) ), this, SLOT( slotDataBitChange(int) ) );
- connect( cbParity, SIGNAL( activated(int) ), this, SLOT( slotParityBitChange(int) ) );
- connect( cbStopBit, SIGNAL( activated(int) ), this, SLOT( slotStopBitChange(int) ) );
- connect( cbFlow, SIGNAL( activated(int) ), this, SLOT( slotFlowChange(int) ) );
- connect( pbHandSend, SIGNAL( clicked() ), this, SLOT( slotWrite() ) );
- connect( port, SIGNAL( readyRead() ), this, SLOT( slotRead() ) );
- connect( pbClearCnt, SIGNAL( clicked() ), this, SLOT( slotClearCnt() ) );
- connect( pbClearSend, SIGNAL( clicked() ), this, SLOT( slotClearTx() ) );
- connect( pbClearRcv, SIGNAL( clicked() ), this, SLOT( slotClearRcv() ) );
- connect( ckbAutoSend, SIGNAL( stateChanged(int) ), this, SLOT( slotAutoTx(int) ) );
- connect( spCycle, SIGNAL( valueChanged(int) ), this, SLOT( slotCycleChange(int) ) );
- connect( tmAutoTx, SIGNAL( timeout() ), this, SLOT( slotTimerAutoTx() ) );
- connect( pbSendFile, SIGNAL( clicked() ), this, SLOT( slotTxFile() ) );
- }
- QSerialTool::~QSerialTool()
- {
- ;
- }
- void QSerialTool::slotOpenPort()
- {
- if ( !bOpen )
- {
- if ( port->isOpen() )
- {
- port->close();
- }
- bOpen = port->open( QIODevice::ReadWrite );
- port->setPortName( cbPort->currentText() );
- port->setBaudRate( getBaudRate() );
- port->setDataBits( (DataBitsType)cbDataBit->currentIndex() );
- port->setParity( (ParityType)cbParity->currentIndex() );
- port->setStopBits( (StopBitsType)cbStopBit->currentIndex() );
- port->setTimeout( 1000 );
- if ( !bOpen )
- {
- QMessageBox::critical( this,
- QString( tr("Open %1 failed") ).arg( port->portName() ),
- QString( tr("Can not open %1 failed!") ).arg( port->portName() ) );
- return;
- }
- leSerialStatus->setText( QString( tr("Opened") ) );
- pbOpen->setText( QString( tr("Close") ) );
- pbHandSend->setEnabled( TRUE );
- ckbAutoCR->setEnabled( TRUE );
- pbSendFile->setEnabled( TRUE );
- }
- else
- {
- port->close();
- bOpen = FALSE;
- leSerialStatus->setText( QString( tr("Closed") ) );
- pbOpen->setText( QString( tr("Open") ) );
- pbHandSend->setEnabled( FALSE );
- ckbAutoCR->setEnabled( FALSE );
- pbSendFile->setEnabled( FALSE );
- spCycle->setEnabled( FALSE );
- }
- }
- void QSerialTool::slotPortChange( int id )
- {
- port->setPortName( cbPort->itemText( id ) );
- }
- void QSerialTool::slotBaudChange( int /*id*/ )
- {
- port->setBaudRate( getBaudRate() );
- }
- void QSerialTool::slotDataBitChange( int id )
- {
- port->setDataBits( (DataBitsType)id );
- }
- void QSerialTool::slotParityBitChange( int id )
- {
- port->setParity( (ParityType)id );
- }
- void QSerialTool::slotStopBitChange( int id )
- {
- port->setStopBits( (StopBitsType)id );
- }
- void QSerialTool::slotFlowChange( int id )
- {
- port->setFlowControl( (FlowType)id );
- }
- void QSerialTool::slotWrite()
- {
- if ( !port->isOpen() )
- {
- return;
- }
- QString strWrite = teSend->toPlainText();
- if ( ckbAutoCR->isChecked() )
- {
- strWrite.append( "\x0D" );
- }
- else
- {
- if ( strWrite.isNull() )
- {
- return;
- }
- }
- port->write( strWrite.toAscii().constData(), strWrite.length() );
- txlen += strWrite.length();
- leSendBytes->setText( QString().setNum( txlen ) );
- }
- void QSerialTool::slotRead()
- {
- char buff[1024];
- int readlen = port->read( buff, 1024 );
- buff[readlen] = '\0';
- teReceive->append( QString().fromAscii( buff ) );
- rxlen += readlen;
- leReceiveBytes->setText( QString().setNum( rxlen ) );
- }
- void QSerialTool::slotClearTx()
- {
- teSend->setText( QString("") );
- }
- void QSerialTool::slotClearRcv()
- {
- teReceive->setText( QString("") );
- }
- void QSerialTool::slotClearCnt()
- {
- rxlen = 0;
- txlen = 0;
- leReceiveBytes->setText( QString().setNum( rxlen ) );
- leSendBytes->setText( QString().setNum( txlen ) );
- }
- void QSerialTool::slotAutoTx( int state )
- {
- if ( state )
- {
- bAutoTx = TRUE;
- pbHandSend->setEnabled( FALSE );
- pbSendFile->setEnabled( FALSE );
- spCycle->setEnabled( TRUE );
- tmAutoTx->start( txCycle );
- }
- else
- {
- bAutoTx = FALSE;
- pbHandSend->setEnabled( TRUE );
- pbSendFile->setEnabled( TRUE );
- spCycle->setEnabled( FALSE );
- }
- }
- void QSerialTool::slotCycleChange( int id )
- {
- txCycle = id;
- }
- BaudRateType QSerialTool::getBaudRate()
- {
- BaudRateType baud;
- switch ( cbBaud->currentIndex() )
- {
- case 0:
- baud = BAUD300;
- break;
- case 1:
- baud = BAUD600;
- break;
- case 2:
- baud = BAUD1200;
- break;
- case 3:
- baud = BAUD2400;
- break;
- case 4:
- baud = BAUD4800;
- break;
- case 5:
- baud = BAUD9600;
- break;
- case 6:
- baud = BAUD19200;
- break;
- case 7:
- baud = BAUD38400;
- break;
- case 8:
- baud = BAUD57600;
- break;
- case 9:
- baud = BAUD115200;
- break;
- default:
- baud = BAUD56000;
- cbBaud->setCurrentIndex( 8 );
- break;
- }
-
- return baud;
- }
- void QSerialTool::slotTimerAutoTx()
- {
- slotWrite();
- if ( bAutoTx )
- {
- tmAutoTx->start( txCycle );
- }
- }
- void QSerialTool::slotTxFile()
- {
- pbHandSend->setEnabled( FALSE );
- ckbAutoSend->setEnabled( FALSE );
- ckbAutoCR->setEnabled( FALSE );
- spCycle->setEnabled( FALSE );
-
- QString strFileName;
-
- strFileName = QFileDialog::getOpenFileName( this,
- QString( tr("Please select the file to send") ),
- QString( "./" ), QString( "*.*" ) );
- if ( strFileName.isNull() )
- {
- pbHandSend->setEnabled( TRUE );
- ckbAutoSend->setEnabled( TRUE );
- ckbAutoCR->setEnabled( TRUE );
- spCycle->setEnabled( TRUE );
- return;
- }
- QFile* fileTx = new QFile( this );
- fileTx->setFileName( strFileName );
- if( !fileTx->open( QIODevice::ReadOnly ) )
- {
- QMessageBox::critical( this, QString( tr("Open file failed") ),
- QString( tr("Cannot open %1.") ).arg( strFileName ) );
- delete fileTx;
- pbHandSend->setEnabled( TRUE );
- ckbAutoSend->setEnabled( TRUE );
- ckbAutoCR->setEnabled( TRUE );
- spCycle->setEnabled( TRUE );
- return;
- }
- QString strTx;
- QTextStream tsfile( fileTx );
- while ( !tsfile.atEnd() )
- {
- strTx = tsfile.readLine();
- port->write( strTx.toAscii().constData() );
- txlen += strTx.length();
- leSendBytes->setText( QString().setNum( txlen ) );
- }
- delete fileTx;
- pbHandSend->setEnabled( TRUE );
- ckbAutoSend->setEnabled( TRUE );
- ckbAutoCR->setEnabled( TRUE );
- spCycle->setEnabled( TRUE );
- }
|