文章目录
效果![在这里插入图片描述](https://img-blog.csdnimg.cn/77ab9856af714b06b69f2ca959dc8ea3.png) 源码
效果
源码
widget.cpp
# include "widget.h"
# include "ui_widget.h"
Widget :: Widget ( QWidget * parent) :
QWidget ( parent) ,
ui ( new Ui:: Widget)
{
ui-> setupUi ( this ) ;
Init ( ) ;
tableWidgetInit ( ) ;
listWidgetInit ( ) ;
}
Widget :: ~ Widget ( )
{
delete ui;
}
void Widget :: Init ( void ) {
resize ( 1130 , 660 ) ;
setWindowTitle ( "serial_port" ) ;
SendByte= 0 ; ReceByte= 0 ;
serial = new QSerialPort ( this ) ;
connect ( serial, SIGNAL ( readyRead ( ) ) , this , SLOT ( serialPort_readyRead ( ) ) ) ;
connect ( ui-> btn_serial_scan, SIGNAL ( clicked ( bool ) ) , this , SLOT ( btn_serial_scan_clicked ( ) ) ) ;
connect ( ui-> btn_serial_send, SIGNAL ( clicked ( bool ) ) , this , SLOT ( btn_serial_send_clicked ( ) ) ) ;
connect ( ui-> btn_serial_open, SIGNAL ( clicked ( bool ) ) , this , SLOT ( btn_serial_open_clicked ( ) ) ) ;
connect ( ui-> btn_tx_clear, SIGNAL ( clicked ( bool ) ) , this , SLOT ( btn_tx_clear_clicked ( ) ) ) ;
connect ( ui-> btn_rx_clear, SIGNAL ( clicked ( bool ) ) , this , SLOT ( btn_rx_clear_clicked ( ) ) ) ;
connect ( ui-> btn_file_save, SIGNAL ( clicked ( bool ) ) , this , SLOT ( btn_file_save_clicked ( ) ) ) ;
connect ( ui-> btn_file_open, SIGNAL ( clicked ( bool ) ) , this , SLOT ( btn_file_open_clicked ( ) ) ) ;
connect ( ui-> btn_counter_clear, SIGNAL ( clicked ( bool ) ) , this , SLOT ( btn_clear_counter_clicked ( ) ) ) ;
connect ( ui-> chk_rx_tx, SIGNAL ( clicked ( bool ) ) , this , SLOT ( chk_rx_tx_clicked ( ) ) ) ;
connect ( ui-> chk_rx_hex, SIGNAL ( clicked ( bool ) ) , this , SLOT ( chk_rx_hex_clicked ( ) ) ) ;
connect ( ui-> chk_tx_tx, SIGNAL ( clicked ( bool ) ) , this , SLOT ( chk_tx_tx_clicked ( ) ) ) ;
connect ( ui-> chk_tx_hex, SIGNAL ( clicked ( bool ) ) , this , SLOT ( chk_tx_hex_clicked ( ) ) ) ;
connect ( ui-> chk_rx_pause, SIGNAL ( clicked ( bool ) ) , this , SLOT ( chk_rx_pause_clicked ( ) ) ) ;
connect ( ui-> lineEdit, SIGNAL ( returnPressed ( ) ) , this , SLOT ( on_lineEdit_ending ( ) ) ) ;
portTime= 0 ;
Times = 0 ;
lineEditData = 1000 ;
timer = new QTimer;
timer-> start ( 1 ) ;
connect ( timer, SIGNAL ( timeout ( ) ) , this , SLOT ( timerout_event ( ) ) ) ;
ui-> cmb_baud-> setCurrentIndex ( 5 ) ;
ui-> cmb_databit-> setCurrentIndex ( 3 ) ;
ui-> cmb_crcbit-> setCurrentIndex ( 2 ) ;
ui-> cmb_stopbit-> setCurrentIndex ( 0 ) ;
ui-> lineEdit-> setText ( "1000" ) ;
ui-> chk_tx_tx-> setCheckState ( Qt:: Checked) ;
ui-> chk_rx_tx-> setCheckState ( Qt:: Checked) ;
ui-> btn_serial_send-> setEnabled ( false ) ;
ui-> chk_timer-> setEnabled ( false ) ;
}
void Widget :: btn_serial_open_clicked ( )
{
qDebug ( ) << "open serialport" << endl;
if ( ui-> btn_serial_open-> text ( ) == QString ( "打开串口" ) )
{
serial-> setPortName ( ui-> cmb_serail-> currentText ( ) ) ;
qDebug ( ) << ui-> cmb_serail-> currentText ( ) << endl;
serial-> setBaudRate ( ui-> cmb_baud-> currentText ( ) . toInt ( ) ) ;
qDebug ( ) << ui-> cmb_baud-> currentText ( ) . toInt ( ) << endl;
switch ( ui-> cmb_databit-> currentText ( ) . toInt ( ) )
{
case 5 : serial-> setDataBits ( QSerialPort:: Data5) ; break ;
case 6 : serial-> setDataBits ( QSerialPort:: Data6) ; break ;
case 7 : serial-> setDataBits ( QSerialPort:: Data7) ; break ;
case 8 : serial-> setDataBits ( QSerialPort:: Data8) ; break ;
default : serial-> setDataBits ( QSerialPort:: UnknownDataBits) ; break ;
}
switch ( ui-> cmb_crcbit-> currentIndex ( ) )
{
case 0 : serial-> setParity ( QSerialPort:: EvenParity) ; break ;
case 1 : serial-> setParity ( QSerialPort:: MarkParity) ; break ;
case 2 : serial-> setParity ( QSerialPort:: NoParity) ; break ;
case 3 : serial-> setParity ( QSerialPort:: OddParity) ; break ;
default : serial-> setParity ( QSerialPort:: UnknownParity) ; break ;
}
switch ( ui-> cmb_stopbit-> currentIndex ( ) )
{
case 0 : serial-> setStopBits ( QSerialPort:: OneStop) ; break ;
case 1 : serial-> setStopBits ( QSerialPort:: OneAndHalfStop) ; break ;
case 2 : serial-> setStopBits ( QSerialPort:: TwoStop) ; break ;
default : serial-> setStopBits ( QSerialPort:: UnknownStopBits) ; break ;
}
serial-> setFlowControl ( QSerialPort:: NoFlowControl) ;
if ( ! serial-> open ( QIODevice:: ReadWrite) )
{
QMessageBox :: about ( NULL , "提示" , "无法打开串口" ) ;
return ;
}
ui-> cmb_serail-> setEnabled ( false ) ;
ui-> cmb_baud-> setEnabled ( false ) ;
ui-> cmb_databit-> setEnabled ( false ) ;
ui-> cmb_crcbit-> setEnabled ( false ) ;
ui-> cmb_stopbit-> setEnabled ( false ) ;
ui-> btn_serial_scan-> setEnabled ( false ) ;
ui-> chk_timer-> setEnabled ( true ) ;
ui-> btn_serial_open-> setText ( tr ( "关闭串口" ) ) ;
ui-> btn_serial_send-> setEnabled ( true ) ;
}
else
{
serial-> close ( ) ;
ui-> cmb_serail-> setEnabled ( true ) ;
ui-> cmb_baud-> setEnabled ( true ) ;
ui-> cmb_databit-> setEnabled ( true ) ;
ui-> cmb_crcbit-> setEnabled ( true ) ;
ui-> cmb_stopbit-> setEnabled ( true ) ;
ui-> btn_serial_scan-> setEnabled ( true ) ;
ui-> chk_timer-> setEnabled ( false ) ;
ui-> btn_serial_open-> setText ( tr ( "打开串口" ) ) ;
ui-> btn_serial_send-> setEnabled ( false ) ;
}
}
void Widget :: btn_serial_scan_clicked ( ) {
int i, n;
qDebug ( ) << "btn_serial_scan_clicked" << endl;
ui-> cmb_serail-> clear ( ) ;
portStringLine. clear ( ) ;
foreach ( const QSerialPortInfo & info, QSerialPortInfo :: availablePorts ( ) )
portStringLine += info. portName ( ) ;
n= portStringLine. size ( ) ;
for ( i= 0 ; i< n; i++ )
{
serial-> setPortName ( portStringLine[ i] ) ;
if ( ! serial-> open ( QIODevice:: ReadWrite) )
{
portStringLine[ i] += "(不可用)" ;
QVariant v ( 0 ) ;
ui-> cmb_serail-> setItemData ( 1 , v, Qt:: UserRole - 1 ) ;
}
else
{
QVariant v ( 1 | 32 ) ;
ui-> cmb_serail-> setItemData ( 1 , v, Qt:: UserRole - 1 ) ;
}
serial-> close ( ) ;
}
ui-> cmb_serail-> addItems ( portStringLine) ;
}
void Widget :: serialPort_readyRead ( )
{
int i, length;
QString lasttext;
if ( ui-> chk_rx_pause-> checkState ( ) != Qt:: Checked)
{
lasttext= ui-> tx_rev-> toPlainText ( ) ;
Receivetext = serial-> readAll ( ) ;
ReceByte+= Receivetext. length ( ) ;
ui-> label_rx-> setText ( QString :: number ( ReceByte) ) ;
if ( ui-> chk_rx_pause-> checkState ( ) == Qt:: Checked)
{
Receivetext= Receivetext. toLatin1 ( ) . toHex ( ) ;
length= Receivetext. length ( ) ;
for ( i= 0 ; i<= length/ 2 ; i++ )
{
Receivetext. insert ( ( 2 + 3 * i) , ' ' ) ;
}
}
else
Receivetext= Receivetext. toLatin1 ( ) ;
lasttext= lasttext. append ( Receivetext) ;
ui-> tx_rev-> setText ( lasttext) ;
}
}
void Widget :: timerout_event ( ) {
int t= 500 ;
Times++ ; portTime++ ;
if ( Times>= lineEditData)
{
if ( ui-> chk_timer-> checkState ( ) == Qt:: Checked)
Widget :: btn_serial_send_clicked ( ) ;
Times= 0 ;
}
if ( portTime== t)
{
QStringList newPortStringList;
newPortStringList. clear ( ) ;
foreach ( const QSerialPortInfo & info, QSerialPortInfo :: availablePorts ( ) )
newPortStringList += info. portName ( ) ;
if ( newPortStringList. size ( ) != portStringLine. size ( ) )
{
portStringLine = newPortStringList;
ui-> cmb_serail-> clear ( ) ;
ui-> cmb_serail-> addItems ( portStringLine) ;
}
portTime= 0 ;
}
}
void Widget :: btn_serial_send_clicked ( )
{
QByteArray bytearray;
Sendtext= ui-> tx_send-> toPlainText ( ) ;
if ( ui-> chk_tx_wrap-> checkState ( ) == Qt:: Checked)
Sendtext += '\n' ;
if ( ui-> chk_tx_hex-> checkState ( ) != Qt:: Checked)
bytearray = Sendtext. toLatin1 ( ) ;
else
bytearray = QByteArray :: fromHex ( Sendtext. toUtf8 ( ) ) ;
serial-> write ( bytearray) ;
SendByte+= Sendtext. length ( ) ;
ui-> label_tx-> setText ( QString :: number ( SendByte) ) ;
ui-> tx_send-> moveCursor ( QTextCursor:: End) ;
}
void Widget :: btn_clear_counter_clicked ( ) {
qDebug ( ) << "btn_clear_counter_clicked" << endl;
SendByte = 0 ;
ReceByte = 0 ;
ui-> label_tx-> setText ( QString :: number ( SendByte) ) ;
ui-> label_rx-> setText ( QString :: number ( ReceByte) ) ;
}
void Widget :: btn_rx_clear_clicked ( ) {
qDebug ( ) << "btn_rx_clear_clicked" << endl;
ui-> tx_rev-> clear ( ) ;
}
void Widget :: btn_tx_clear_clicked ( ) {
qDebug ( ) << "btn_tx_clear_clicked" << endl;
ui-> tx_send-> clear ( ) ;
}
void Widget :: chk_rx_tx_clicked ( ) {
ui-> chk_rx_tx-> setCheckState ( Qt:: Checked) ;
ui-> chk_rx_hex-> setCheckState ( Qt:: Unchecked) ;
ui-> chk_rx_pause-> setCheckState ( Qt:: Unchecked) ;
}
void Widget :: chk_rx_hex_clicked ( ) {
ui-> chk_rx_tx-> setCheckState ( Qt:: Unchecked) ;
ui-> chk_rx_hex-> setCheckState ( Qt:: Checked) ;
ui-> chk_rx_pause-> setCheckState ( Qt:: Unchecked) ;
}
void Widget :: chk_rx_pause_clicked ( )
{
qDebug ( ) << "chk_rx_pause_clicked" << endl;
ui-> chk_rx_tx-> setCheckState ( Qt:: Unchecked) ;
ui-> chk_rx_hex-> setCheckState ( Qt:: Unchecked) ;
ui-> chk_rx_pause-> setCheckState ( Qt:: Checked) ;
}
void Widget :: chk_tx_tx_clicked ( ) {
ui-> chk_tx_tx-> setCheckState ( Qt:: Checked) ;
ui-> chk_tx_hex-> setCheckState ( Qt:: Unchecked) ;
}
void Widget :: chk_tx_hex_clicked ( ) {
ui-> chk_tx_tx-> setCheckState ( Qt:: Unchecked) ;
ui-> chk_tx_hex-> setCheckState ( Qt:: Checked) ;
}
void Widget :: btn_file_open_clicked ( ) {
QString fileName = QFileDialog :: getOpenFileName ( this ) ;
QFile file ( fileName) ;
if ( ! file. open ( ( QFile:: ReadOnly| QFile:: Text) ) )
{
QMessageBox :: warning ( this , tr ( "多文档编辑器" ) ,
tr ( "无法读取文件 %1:\n%2" ) . arg ( fileName, file. errorString ( ) ) ) ;
}
QTextStream in ( & file) ;
QApplication :: setOverrideCursor ( Qt:: WaitCursor) ;
ui-> tx_send-> setPlainText ( in. readAll ( ) ) ;
QApplication :: restoreOverrideCursor ( ) ;
ui-> tx_rev-> setVisible ( true ) ;
}
void Widget :: btn_file_save_clicked ( ) {
QString fileName = QFileDialog :: getSaveFileName ( this ) ;
QFile file ( fileName) ;
if ( ! file. open ( QFile:: WriteOnly | QFile:: Text) )
{
QMessageBox :: warning ( this , tr ( "多文档编辑器" ) ,
tr ( "无法写入文件 %1:/n %2" )
. arg ( fileName, file. errorString ( ) ) ) ;
}
QTextStream out ( & file) ;
QApplication :: setOverrideCursor ( Qt:: WaitCursor) ;
out << ui-> tx_rev-> toPlainText ( ) ;
QApplication :: restoreOverrideCursor ( ) ;
}
void Widget :: on_lineEdit_ending ( )
{
if ( ui-> lineEdit-> text ( ) . toInt ( ) > 0 )
lineEditData= ui-> lineEdit-> text ( ) . toInt ( ) ;
qDebug ( ) << ui-> lineEdit-> text ( ) << endl;
}
void Widget :: resizeEvent ( QResizeEvent * event) {
qDebug ( ) << "old:" << event-> oldSize ( ) << endl;
qDebug ( ) << "new:" << event-> size ( ) << endl;
}
void Widget :: tableWidgetInit ( ) {
int i, j;
ui-> tableWidget-> horizontalHeader ( ) -> setStretchLastSection ( true ) ;
ui-> tableWidget-> horizontalHeader ( ) -> setSectionResizeMode ( QHeaderView:: ResizeToContents) ;
ui-> tableWidget-> horizontalHeader ( ) -> setSectionResizeMode ( QHeaderView:: Stretch) ;
row_count = ui-> tableWidget-> rowCount ( ) ;
column_count = ui-> tableWidget-> columnCount ( ) ;
qDebug ( ) << "row" << row_count<< "column" << column_count;
for ( i= 0 ; i< row_count; i++ )
{
for ( j= 0 ; j< column_count; j++ )
{
ui-> tableWidget-> setItem ( i, j, new QTableWidgetItem ( QString :: number ( j) ) ) ;
}
}
QTableWidgetItem* item;
QString str;
for ( int i = 0 ; i < ui-> tableWidget-> rowCount ( ) ; i++ ) {
for ( int j = 0 ; j < ui-> tableWidget-> columnCount ( ) ; j++ ) {
item = ui-> tableWidget-> item ( i, j) ;
str = str + item-> text ( ) + " " ;
}
}
qDebug ( ) << "str = " << str;
connect ( ui-> tableWidget, SIGNAL ( cellClicked ( int , int ) ) , this , SLOT ( show_prodcut_sets ( int , int ) ) ) ;
connect ( ui-> tableWidget-> selectionModel ( ) , SIGNAL ( currentChanged ( const QModelIndex & , const QModelIndex & ) ) , SLOT ( doProcessSelLine ( void ) ) ) ;
}
void Widget :: show_prodcut_sets ( int row, int col)
{
QString str;
qDebug ( ) << "所点击的单元格的row=" << row << ",col=" << col;
QTableWidgetItem* item = ui-> tableWidget-> item ( row , col) ;
qDebug ( ) << "内容为:" << item-> text ( ) ;
}
void Widget :: doProcessSelLine ( ) {
int current_column;
QString str;
QTableWidgetItem* item;
current_column = ui-> tableWidget-> currentColumn ( ) ;
for ( int j = 0 ; j < ui-> tableWidget-> columnCount ( ) ; j++ ) {
item = ui-> tableWidget-> item ( current_column, j) ;
str = str + item-> text ( ) + " " ;
}
qDebug ( ) << str<< endl;
}
void Widget :: listWidgetInit ( ) {
mylistWidget = ui-> listWidget;
connect ( ui-> listWidget, & QListWidget:: itemClicked, this , & Widget:: SLOT_ListWidget_ItemClicked) ;
}
void Widget :: SLOT_ListWidget_ItemClicked ( QListWidgetItem* item)
{
qDebug ( ) << item-> text ( ) ;
QString text;
text = item-> text ( ) ;
if ( ( text) == "连接" )
{
qDebug ( ) << 111111 << endl;
}
}
widget.h
# ifndef WIDGET_H
# define WIDGET_H
# include <QWidget>
# include <QtSerialPort>
# include <QtSerialPortVersion>
# include <QMessageBox>
# include <QDebug>
# include <QFile>
# include <QFileDialog>
# include <QTimer>
# include <QStringList>
# include <QMouseEvent>
# include <QListWidget>
namespace Ui {
class Widget ;
}
class Widget : public QWidget
{
Q_OBJECT
public :
explicit Widget ( QWidget * parent = nullptr ) ;
~ Widget ( ) ;
int Times, portTime, lineEditData;
private :
Ui:: Widget * ui;
private :
void Init ( void ) ;
QSerialPort * serial;
QTimer * timer;
QString Sendtext, Receivetext;
long int SendByte, ReceByte;
QStringList portStringLine;
int row_count, column_count;
QListWidget * mylistWidget;
void tableWidgetInit ( void ) ;
void listWidgetInit ( void ) ;
private slots:
void serialPort_readyRead ( ) ;
void timerout_event ( ) ;
void btn_serial_scan_clicked ( ) ;
void btn_serial_send_clicked ( ) ;
void btn_serial_open_clicked ( ) ;
void btn_clear_counter_clicked ( ) ;
void btn_tx_clear_clicked ( ) ;
void btn_rx_clear_clicked ( ) ;
void btn_file_save_clicked ( ) ;
void btn_file_open_clicked ( ) ;
void chk_rx_tx_clicked ( ) ;
void chk_rx_hex_clicked ( ) ;
void chk_tx_tx_clicked ( ) ;
void chk_tx_hex_clicked ( ) ;
void chk_rx_pause_clicked ( ) ;
void on_lineEdit_ending ( ) ;
void show_prodcut_sets ( int , int ) ;
void doProcessSelLine ( void ) ;
void SLOT_ListWidget_ItemClicked ( QListWidgetItem * item) ;
protected :
void resizeEvent ( QResizeEvent * event) ;
} ;
# endif