#include "com_erpc_core.hpp" #include #include #include "./ui_com_erpc_core.h" void com_erpc_core::load_default_settings() { int index = 0; // 波特率配置表 ui->cb_bandrate->addItem("1200", QSerialPort::Baud1200); ui->cb_bandrate->addItem("2400", QSerialPort::Baud2400); ui->cb_bandrate->addItem("4800", QSerialPort::Baud4800); ui->cb_bandrate->addItem("9600", QSerialPort::Baud9600); ui->cb_bandrate->addItem("19200", QSerialPort::Baud19200); ui->cb_bandrate->addItem("38400", QSerialPort::Baud38400); ui->cb_bandrate->addItem("38400", QSerialPort::Baud57600); ui->cb_bandrate->addItem("57600", QSerialPort::Baud57600); ui->cb_bandrate->addItem("115200", QSerialPort::Baud115200); ui->cb_bandrate->addItem("3000000", 3000000); // 设置默认波特率 index = ui->cb_bandrate->findText("9600"); ui->cb_bandrate->setCurrentIndex(index); // 数据位配置表 ui->cb_databit->addItem("8", QSerialPort::Data8); ui->cb_databit->addItem("7", QSerialPort::Data7); ui->cb_databit->addItem("6", QSerialPort::Data6); ui->cb_databit->addItem("5", QSerialPort::Data5); // 设置默认数据位 index = ui->cb_databit->findText("8"); ui->cb_databit->setCurrentIndex(index); // 校验位配置表 ui->cb_parity->addItem("奇校验", QSerialPort::OddParity); ui->cb_parity->addItem("偶校验", QSerialPort::EvenParity); ui->cb_parity->addItem("无校验", QSerialPort::NoParity); // 设置默认校验位 index = ui->cb_parity->findText("无校验"); ui->cb_parity->setCurrentIndex(index); // 停止位配置表 ui->cb_stop_bit->addItem("1", QSerialPort::OneStop); ui->cb_stop_bit->addItem("1.5", QSerialPort::OneAndHalfStop); ui->cb_stop_bit->addItem("2", QSerialPort::TwoStop); // 设置默认停止位 index = ui->cb_stop_bit->findText("1"); ui->lb_con_sta->setText("未打开"); } void com_erpc_core::lock_config_ui() { ui->cb_com_name->setEnabled(false); ui->cb_bandrate->setEnabled(false); ui->cb_databit->setEnabled(false); ui->cb_parity->setEnabled(false); ui->cb_stop_bit->setEnabled(false); } void com_erpc_core::unlock_config_ui() { ui->cb_com_name->setEnabled(true); ui->cb_bandrate->setEnabled(true); ui->cb_databit->setEnabled(true); ui->cb_stop_bit->setEnabled(true); ui->cb_parity->setEnabled(true); } /** * com port 断开连接回调 */ void com_erpc_core::com_port_disconnect(QSerialPort::SerialPortError error) { if (serial != nullptr) { if(error == QSerialPort::ResourceError) { if(stop_com == nullptr){ stop_com = new QTimer(this); connect(stop_com, &QTimer::timeout, this, &com_erpc_core::close_com_port); stop_com->start(10); } } } } /** * 打开串口 */ void com_erpc_core::open_com_port() { if (serial != nullptr) { return; } //配置串口参数 serial = new QSerialPort(ui->cb_com_name->currentText()); serial->setBaudRate( ui->cb_bandrate->itemData(ui->cb_bandrate->currentIndex()).toInt()); QSerialPort::DataBits data_bits = static_cast( ui->cb_databit->itemData(ui->cb_databit->currentIndex()).toInt()); serial->setDataBits(data_bits); QSerialPort::Parity parity = static_cast( ui->cb_parity->itemData(ui->cb_parity->currentIndex()).toInt()); serial->setParity(parity); QSerialPort::StopBits stop_bits = static_cast( ui->cb_stop_bit->itemData(ui->cb_stop_bit->currentIndex()).toInt()); serial->setStopBits(stop_bits); //注册断线回调 connect(serial, &QSerialPort::errorOccurred, this, &com_erpc_core::com_port_disconnect); //尝试打开com口 if (serial->open(QIODevice::ReadWrite)) { ui->lb_con_sta->setText("已打开"); connect(serial, &QSerialPort::readyRead, this, &com_erpc_core::data_append); lock_config_ui(); } else { ui->lb_con_sta->setText("打开失败"); serial->close(); delete serial; serial = nullptr; unlock_config_ui(); } } void com_erpc_core::close_com_port() { if (serial != nullptr) { serial->close(); delete serial; serial = nullptr; ui->lb_con_sta->setText("未打开"); unlock_config_ui(); } if(stop_com!= nullptr){ stop_com->stop(); delete stop_com; stop_com = nullptr; } } // 写个扫描串口设备的函数 void com_erpc_core::scan_com_port() { // printf("scan_com_port\n"); if (serial != nullptr) { return; } ui->cb_com_name->clear(); foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { ui->cb_com_name->addItem(info.portName()); } } void com_erpc_core::start_scan_com_port() { // 一直扫描 if (scan_com == nullptr) { scan_com = new QTimer(this); connect(scan_com, &QTimer::timeout, this, &com_erpc_core::scan_com_port); scan_com->start(100); } } void com_erpc_core::data_append() { printf("data_append\n"); QByteArray data = serial->readAll(); ui->tb_data_read->append(QString::fromUtf8(data)); } void com_erpc_core::sipm_cmd_send(int cmd, char *data, int len) { CHECK_SERRIAL_IS_OPEN(); printf("send cmd : %x\n", cmd); char send_data[100] = {0}; char prity = 0; send_data[0] = 0xaa; send_data[1] = 0x55; int temp_len = len + 4; send_data[2] = (temp_len >> 8) & 0xff; send_data[3] = temp_len & 0xff; send_data[4] = cmd; for (int i = 2; i < 5; i++) { prity += send_data[i]; } for (int i = 0; i < len; i++) { send_data[5 + i] = data[i]; prity += data[i]; } send_data[5 + len] = prity; serial->write(send_data, 5 + len + 1); serial->flush(); } void com_erpc_core::sipm_read_gain() { CHECK_SERRIAL_IS_OPEN(); sipm_cmd_send(0x09, nullptr, 0); } void com_erpc_core::sipm_read_SN() { CHECK_SERRIAL_IS_OPEN(); sipm_cmd_send(0x02, nullptr, 0); } void com_erpc_core::sipm_read_temp() { CHECK_SERRIAL_IS_OPEN(); sipm_cmd_send(0x06, nullptr, 0); } void com_erpc_core::sipm_set_gain() { CHECK_SERRIAL_IS_OPEN(); int gain = ui->le_gain->text().toInt(); char data[2] = {0}; data[0] = (gain >> 8) & 0xff; data[1] = gain & 0xff; sipm_cmd_send(0x18, data, 2); } com_erpc_core::com_erpc_core(QWidget *parent) : QMainWindow(parent), ui(new Ui::com_erpc_core) { ui->setupUi(this); serial = nullptr; load_default_settings(); scan_com = nullptr; stop_com = nullptr; start_scan_com_port(); connect(ui->bt_open_com, &QPushButton::clicked, this, &com_erpc_core::open_com_port); connect(ui->bt_close_com, &QPushButton::clicked, this, &com_erpc_core::close_com_port); connect(ui->bt_read_gain, &QPushButton::clicked, this, &com_erpc_core::sipm_read_gain); connect(ui->bt_read_SN, &QPushButton::clicked, this, &com_erpc_core::sipm_read_SN); connect(ui->bt_write_gain, &QPushButton::clicked, this, &com_erpc_core::sipm_set_gain); connect(ui->bt_read_temp, &QPushButton::clicked, this, &com_erpc_core::sipm_read_temp); extern void com_excute_init(); com_excute_init(); } com_erpc_core::~com_erpc_core() { delete ui; }