#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//查找可用的串口
foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
{
QSerialPort serial;
serial.setPort(info);
if(serial.open(QIODevice::ReadWrite))
{
ui->portBox->addItem(serial.portName());
serial.close();
}
}
ui->BaudBox->setCurrentIndex(4);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_openButton_clicked()
{
serial = new QSerialPort;
serial->setPortName(ui->portBox->currentText());//设置串口名
serial->open(QIODevice::ReadWrite);//以读写方式打开串口
int baudindex=ui->BaudBox->currentIndex();
switch (baudindex)
{
case 0:
serial->setBaudRate(QSerialPort::Baud4800);//设置波特率
break;
case 1:
serial->setBaudRate(QSerialPort::Baud9600);
break;
case 2:
serial->setBaudRate(QSerialPort::Baud19200);
break;
case 3:
serial->setBaudRate(QSerialPort::Baud38400);
break;
case 4:
serial->setBaudRate(QSerialPort::Baud115200);
break;
default:
break;
}
if(ui->bitBox->currentText()=="8")
serial->setDataBits(QSerialPort::Data8);
else if(ui->bitBox->currentText()=="7")
serial->setDataBits(QSerialPort::Data7);
else if(ui->bitBox->currentText()=="6")
serial->setDataBits(QSerialPort::Data6);
else if(ui->bitBox->currentText()=="5")
serial->setDataBits(QSerialPort::Data5);
if(ui->portBox->currentIndex()==0)
serial->setParity(QSerialPort::NoParity);
else if(ui->ParityBox->currentIndex()==1)
serial->setParity(QSerialPort::OddParity);
else if(ui->ParityBox->currentIndex()==2)
serial->setParity(QSerialPort::EvenParity);
if(ui->StopbitBox->currentIndex()==0)
serial->setStopBits(QSerialPort::OneStop);
else if(ui->StopbitBox->currentIndex()==1)
serial->setStopBits(QSerialPort::OneAndHalfStop);
else if(ui->StopbitBox->currentIndex()==2)
serial->setStopBits(QSerialPort::TwoStop);
serial->setFlowControl(QSerialPort::NoFlowControl);
ui->portBox->setEnabled(false);
ui->BaudBox->setEnabled(false);
ui->bitBox->setEnabled(false);
ui->StopbitBox->setEnabled(false);
ui->ParityBox->setEnabled(false);
ui->openButton->setEnabled(false);
ui->closeButton->setEnabled(true);
flag=1;
QObject::connect(serial,&QSerialPort::readyRead,this,&MainWindow::ReadData);
}
void MainWindow::ReadData()
{
QByteArray buf;
buf = serial->readAll();
if(!buf.isEmpty())
{
QString str = ui->receiveDataTextEdit->toPlainText();
str+=tr(buf);
ui->receiveDataTextEdit->clear();
ui->receiveDataTextEdit->append(str);
}
buf.clear();
}
void MainWindow::on_closeButton_clicked()
{
serial->clear();
serial->close();
serial->deleteLater();
ui->portBox->setEnabled(true);
ui->bitBox->setEnabled(true);
ui->BaudBox->setEnabled(true);
ui->StopbitBox->setEnabled(true);
ui->ParityBox->setEnabled(true);
ui->closeButton->setEnabled(false);
ui->openButton->setEnabled(true);
flag=0;
}
void MainWindow::on_sendSpeedButton_clicked()
{
if(flag==0){
QMessageBox::warning(NULL, "warning", "Please open the USART", QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes);
return;
}
int i =0;
QByteArray data=ui->lineEdit->text().toLatin1();
int size = data.size();
QByteArray temp;
temp.resize(size+5);
temp[0]='1';
for(i=1;i<=size;i++){
temp[i]=data[i-1];
}
temp[size+1]='0';
temp[size+2]='0';
temp[size+3]= '\r';
temp[size+4]='\n';
QByteArray senddata;
senddata = temp.data ();
serial->write(senddata);
}
QByteArray MainWindow::StringToHex(QString str) //字符串转换为十六进制数据0-F
{
QByteArray senddata;
int hexdata,lowhexdata;
int hexdatalen = 0;
int len = str.length();
senddata.resize(len/2);
char lstr,hstr;
for(int i=0; i<len; )
{
hstr=str[i].toLatin1();
if(!QChar::isLetterOrNumber(hstr))
{
i++;
continue;
}
i++;
if(i >= len)
break;
lstr = str[i].toLatin1();
hexdata = ConvertHexChar(hstr);
lowhexdata = ConvertHexChar(lstr);
if((hexdata == 16) || (lowhexdata == 16))
break;
else
hexdata = hexdata*16+lowhexdata;
i++;
senddata[hexdatalen] = (char)hexdata;
hexdatalen++;
}
senddata.resize(hexdatalen);
return senddata;
}
char MainWindow::ConvertHexChar(char ch)
{
if((ch >= '0') && (ch <= '9'))
return ch-0x30;
else if((ch >= 'A') && (ch <= 'F'))
return ch-'A'+10;
else if((ch >= 'a') && (ch <= 'f'))
return ch-'a'+10;
else return ch-ch;//不在0-f范围内的会发送成0
}