#include "serial.h"
#include "ui_serial.h"
#include <QString>
serial::serial(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::serial)
{
ui->setupUi(this);
//user
system_init();
}
serial::~serial()
{
delete ui;
}
/*----------------------------------------------
* funtions
* -------------------------------------------*/
void serial::system_init()
{
//port config 默认配置(内置)
global_port.setParity(QSerialPort::NoParity);
global_port.setDataBits(QSerialPort::Data8);
global_port.setStopBits(QSerialPort::OneStop);
//connect
connect(ui->btn_open,&QPushButton::clicked,this,&serial::btn_open_port);
connect(ui->btn_close,&QPushButton::clicked,this,&serial::btn_close_port);
connect(ui->btn_send,&QPushButton::clicked,this,&serial::btn_send_data);
connect(&global_port,&QSerialPort::readyRead,this,&serial::receive_data);
}
//slots
/*---------------------open---------------------------*/
void serial::btn_open_port(bool)
{
//qDebug()<< "ok";
/*---------baud name-----------------------*/
//qDebug()<<ui->cmb_port_name->currentIndex();//printf 0-7
switch (ui->cmb_port_name->currentIndex()) {
case 0:
global_port.setPortName("COM1");
break;
case 1:
global_port.setPortName("COM2");
break;
case 2:
global_port.setPortName("COM3");
break;
case 3:
global_port.setPortName("COM4");
break;
case 4:
global_port.setPortName("COM5");
break;
case 5:
global_port.setPortName("COM6");
break;
case 6:
global_port.setPortName("COM7");
break;
default:
global_port.setPortName("COM8");
break;
}
/*----------baud rate------------------------------*/
//qDebug()<<ui->cmb_baud_rate->currentIndex();
switch (ui->cmb_baud_rate->currentIndex()) {
case 0:
global_port.setBaudRate(QSerialPort::Baud115200);
break;
case 1:
global_port.setBaudRate(QSerialPort::Baud57600);
break;
case 2:
global_port.setBaudRate(QSerialPort::Baud38400);
break;
case 3:
global_port.setBaudRate(QSerialPort::Baud19200);
break;
case 4:
global_port.setBaudRate(QSerialPort::Baud9600);
break;
case 5:
global_port.setBaudRate(QSerialPort::Baud4800);
break;
case 6:
global_port.setBaudRate(QSerialPort::Baud2400);
break;
default:
global_port.setBaudRate(QSerialPort::Baud1200);
break;
}
//open
global_port.open(QIODevice::ReadWrite); //打开串口驱动,可以读写。
ui->lab_status->setText("串口已打开"); //串口状态显示
//test
//global_port.write("1");//测试输出情况
}
/*---------------------close---------------------------*/
void serial::btn_close_port(bool)
{
global_port.close(); //关闭串口
ui->lab_status->setText("串口已关闭"); //串口状态显示
}
/*-------------------hex process-----------------------------*/
void StringToHex(QString str, QByteArray &senddata) //字符串转换为十六进制数据0-F
{
int hexdata,lowhexdata;
int hexdatalen = 0;
int len = str.length();
senddata.resize(len/2);
char lstr,hstr;
for(int i=0; i<len; )
{
//char lstr,
hstr=str[i].toLatin1();
if(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);
}
char 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
}
/*---------------------sending data---------------------------*/
void serial::btn_send_data(bool)
{
QString str;
str = ui->lineEdit->text(); //获取文本的方法;存入str中
QByteArray senddata;
StringToHex(str,senddata);
global_port.write(senddata);
}
/*--------------------recieve data-------------------------*/
void serial::receive_data()
{
QByteArray array = global_port.readAll(); //Reads all remaining data from the device, and returns it as a byte array.
qDebug()<<array; //控制台显示接收数据
if(ui->checkBox->checkState() == Qt::Checked){
ui->lint_send_data->insertPlainText(QString(array.toHex(' ').toUpper().append(' '))); //Hex转换,同时设置大小写和空格间隔,读取接收数据
}else{
ui->lint_send_data->insertPlainText(QString(array));
}
}