串口demo2.0

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSerialPort>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QPushButton>
#include <QLineEdit>
#include <QDebug>
#include <QByteArray>
#include <QThread>
#include <QVector>
#include <array>
#include <QComboBox>
#include <QSerialPortInfo>
#include <QTextEdit>
#include <QLabel>
#include "packagebuild.h"
#include <QCheckBox>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    void creatGUI();
    void setPortName(QString name);
    void connectDevice(QString name,const int rate);
    void receiveInfo();
    void sandpack(QByteArray byteArray);
    QByteArray writeCommandByteArray(PackageBuild::Command cmd, const QByteArray &data) const;
    void setCollectionChannelSwitch(QString list);
    QString hexToString(char *in, int len);
    void setStimChannelSwitch(QString list);
    uint8_t stringToUint8(std::string string);
    void setPowerSwitch(bool on);
    void writeStimCurrentSize(int stimInde, float currentSize);
private:
    Ui::Widget *ui;
    uint8_t kZero = 0x00;
    QSerialPort *m_serialport =nullptr;
    QList<QSerialPortInfo> serialPortList;
    QComboBox *portNameBox;
    QLabel *connectTip;
    QTextEdit *sendTip;
    QTextEdit *reriviceTip;
    PackageBuild m_packageBuild;
};
#endif // WIDGET_H

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->setFixedSize(1000,700);
    m_serialport = new QSerialPort();
    serialPortList = QSerialPortInfo::availablePorts();
    creatGUI();
}

Widget::~Widget()
{
    delete ui;
}

void Widget::creatGUI()
{
    QHBoxLayout *all = new QHBoxLayout();
    QVBoxLayout *left = new QVBoxLayout();
    QHBoxLayout *right = new QHBoxLayout();

    QHBoxLayout *first = new QHBoxLayout();
    QPushButton *portNameBtn = new QPushButton();
    portNameBtn->setFixedSize(100,30);
    portNameBtn->setText(tr("连接"));

    portNameBox =new QComboBox();
    portNameBox->setFixedSize(100,30);
    portNameBox->setStyleSheet("QAbstractItemView::item {height: 30px;font-size:20px}");

    for(int i=0;i < serialPortList.size();i++){
        portNameBox->addItem(serialPortList[i].portName());
    }
    portNameBox->addItem("no port");

    connectTip = new QLabel();
    connectTip->setFixedSize(100,30);
    QLineEdit *baudRateEdit = new QLineEdit();
    baudRateEdit->setFixedSize(100,30);

    QLabel *noUse = new QLabel();
    noUse->setFixedSize(100,30);

    first->setContentsMargins(0,0,0,0);
    first->addStretch();
    first->addWidget(portNameBtn);
    first->addSpacing(5);
    first->addWidget(portNameBox);
    first->addSpacing(5);
    first->addWidget(baudRateEdit);
    first->addStretch();

    connect(portNameBtn,&QPushButton::clicked,[this,baudRateEdit](){connectDevice(portNameBox->currentText(),baudRateEdit->text().toInt());});

    QHBoxLayout *second = new QHBoxLayout();
    QPushButton *portNumBtn = new QPushButton();
    portNumBtn->setFixedSize(100,30);
    portNumBtn->setText(tr("采集通道"));

    QLineEdit *portNumEdit = new QLineEdit();
    portNumEdit->setFixedSize(100,30);
    portNumEdit->setText("1");
    connect(portNumBtn,&QPushButton::clicked,[this,portNumEdit](){setCollectionChannelSwitch(portNumEdit->text());});

    sendTip = new QTextEdit();
    sendTip->setFixedSize(450,400);

    second->setContentsMargins(0,0,0,0);
    second->addStretch();
    second->addWidget(portNumBtn);
    second->addSpacing(5);
    second->addWidget(portNumEdit);
    second->addSpacing(5);
    second->addWidget(noUse);
    second->addStretch();

    QHBoxLayout *third = new QHBoxLayout();
    QPushButton *stimBtn = new QPushButton();
    stimBtn->setFixedSize(100,30);
    stimBtn->setText(tr("刺激通道"));

    QLineEdit *stimNumEdit = new QLineEdit();
    stimNumEdit->setFixedSize(100,30);
    stimNumEdit->setText("1");
    connect(stimBtn,&QPushButton::clicked,[this,stimNumEdit](){setStimChannelSwitch(stimNumEdit->text());});

    third->setContentsMargins(0,0,0,0);
    third->addStretch();
    third->addWidget(stimBtn);
    third->addSpacing(5);
    third->addWidget(stimNumEdit);
    third->addSpacing(5);
    third->addWidget(noUse);
    third->addStretch();

    QHBoxLayout *fourth = new QHBoxLayout();
    QPushButton *powerBtn = new QPushButton();
    powerBtn->setFixedSize(100,30);
    powerBtn->setText(tr("PowerSwitch"));

    QCheckBox *powerBox = new QCheckBox();
    powerBox->setFixedSize(100,30);
    connect(powerBtn,&QPushButton::clicked,[this,powerBox](){setPowerSwitch(powerBox->isChecked());});

    fourth->setContentsMargins(0,0,0,0);
    fourth->addStretch();
    fourth->addWidget(powerBtn);
    fourth->addSpacing(5);
    fourth->addWidget(powerBox);
    fourth->addSpacing(5);
    fourth->addWidget(noUse);
    fourth->addStretch();

    QHBoxLayout *fifth = new QHBoxLayout();
    QPushButton *stimCurrentBtn = new QPushButton();
    stimCurrentBtn->setFixedSize(100,30);
    stimCurrentBtn->setText(tr("StimCurrent"));
    QLineEdit *stimIndexEdit = new QLineEdit();
    stimIndexEdit->setFixedSize(100,30);
    QLineEdit *stimCurrentEdit = new QLineEdit();
    stimCurrentEdit->setFixedSize(100,30);
    connect(powerBtn,&QPushButton::clicked,[this,stimIndexEdit,stimCurrentEdit](){writeStimCurrentSize(stimIndexEdit->text().toInt(),stimCurrentEdit->text().toFloat());});

    fifth->setContentsMargins(0,0,0,0);
    fifth->addStretch();
    fifth->addWidget(stimCurrentBtn);
    fifth->addSpacing(5);
    fifth->addWidget(stimIndexEdit);
    fifth->addSpacing(5);
    fifth->addWidget(stimCurrentEdit);
    fifth->addStretch();

    left->setContentsMargins(0,0,0,0);
    left->addSpacing(20);
    left->addLayout(first);
    left->addLayout(fourth);
    left->addLayout(second);
    left->addLayout(third);
    left->addLayout(fifth);
    left->addWidget(sendTip);
    left->addStretch();

    reriviceTip = new QTextEdit();
    reriviceTip->setFixedSize(450,600);

    right->setContentsMargins(0,0,0,0);
    right->addSpacing(20);
    right->addWidget(reriviceTip);
    right->addStretch();

    all->setContentsMargins(0,0,0,0);
    all->addSpacing(0);
    all->addLayout(left);
    all->addStretch();
    all->addLayout(right);


    this->setLayout(all);
}

void Widget::connectDevice(QString name,const int rate)
{

    m_serialport->setPortName(name);
    m_serialport->setBaudRate(rate, QSerialPort::AllDirections);
    m_serialport->setDataBits(QSerialPort::Data8);
    m_serialport->setFlowControl(QSerialPort::NoFlowControl);
    m_serialport->setParity(QSerialPort::NoParity);
    m_serialport->setStopBits(QSerialPort::OneStop);

    connect(m_serialport, &QSerialPort::readyRead, this, &Widget::receiveInfo);

    if (m_serialport) {
        if (m_serialport->isOpen()) {
            m_serialport->close();
        }
        if (!m_serialport->open(QIODevice::ReadWrite)) {
            qDebug() << m_serialport << "open serial port faill!";
            connectTip->setText("fail");
        }else{
            connectTip->setText("success");
        }
    }

}

void Widget::receiveInfo()
{
    auto data = m_serialport->readAll();

    QString string = hexToString(data.data(),data.size());
    reriviceTip->append(string);
    //qDebug() << data;
}

void Widget::sandpack(QByteArray byteArray)
{
    if(connectTip->text() == "fail"){
        sendTip->append("open serial port faill! Please connect serial port!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
        return;
    }
    QString string = hexToString(byteArray.data(),byteArray.size());
    sendTip->append(string);
    m_serialport->write(byteArray);

    QThread::msleep(200);
}
QByteArray Widget::writeCommandByteArray(PackageBuild::Command cmd, const QByteArray& data) const
{
    int dataLength = data.size();
    QByteArray databig(reinterpret_cast<char*>(&dataLength), 2);
    std::reverse(databig.begin(), databig.end());
    QByteArray byteArray;
    byteArray.append(0xEB);
    byteArray.append(0x90);
    byteArray.append(databig);
    byteArray.append(2);
    byteArray.append(cmd);
    byteArray.append(kZero);
    byteArray.append(0x33);
    byteArray.append(0x33);

    QByteArray dataFlip(data, data.size());
    std::reverse(dataFlip.begin(), dataFlip.end());

    byteArray.append(dataFlip);

    uint16_t sum = 0;
    for (size_t i = 0; i < byteArray.size(); i++) {

        sum = sum + (uint8_t)byteArray.at(i);
    }
    QByteArray checkByteArray(reinterpret_cast<char*>(&sum), 2);
    std::reverse(checkByteArray.begin(), checkByteArray.end());
    byteArray.append(checkByteArray);
    return byteArray;
}
void Widget::setCollectionChannelSwitch(QString list)
{
    QByteArray byteArray;

    switch(list.toInt()){
    case 1:{
        byteArray.append(0x01);
        break;
    }
    case 2:{
        byteArray.append(0x03);
        break;
    }
    case 3:{
        byteArray.append(0x07);
        break;
    }
    case 4:{
        byteArray.append(0x0F);
        break;
    }
    case 5:{
        byteArray.append(0x1F);
        break;
    }
    case 6:{
        byteArray.append(0x3F);
        break;
    }
    case 7:{
        byteArray.append(0x7F);
        break;
    }
    case 8:{
        byteArray.append(0xff);
        break;
    }
    };
    sandpack(writeCommandByteArray(PackageBuild::COMMAND_COLLECT_CHANNEL_SWITCH,byteArray));
}
QString Widget::hexToString(char *in, int len)
{
    int i;
    unsigned char inChar,hi,lo;
    QString s;

    for (i=0; i<len; i++)
    {
        inChar = in[i];

        hi = (inChar & 0xF0) >> 4;
        if (hi > 9)
            hi = 'A' + (hi - 0x0A);
        else
            hi += 0x30;
        s.append(hi);

        lo = inChar & 0x0F;
        if (lo > 9)
            lo = 'A' + (lo - 0x0A);
        else
            lo += 0x30;
        s.append(lo);

        s.append(0x20);
    }

    return s;
}
void Widget::setStimChannelSwitch(QString list)
{
    std::array<bool, 2> stimChannelSwitchList;
    if(list.toInt() == 1){
        stimChannelSwitchList[0] = true;
        stimChannelSwitchList[0] = false;
    }else{
        stimChannelSwitchList[0] = true;
        stimChannelSwitchList[0] = true;
    }
    std::string kChannelSwitchlist;
    for (int i = 0; i <2; i++){
        if (stimChannelSwitchList[i]) {
            kChannelSwitchlist.append(std::to_string(1));
        } else {
            kChannelSwitchlist.append(std::to_string(0));
        }
    }
    sandpack(m_packageBuild.writeStimChannelSwitch(stringToUint8(kChannelSwitchlist)));
}
uint8_t Widget::stringToUint8(std::string string)
{
    int base = 0;
    for (size_t j = 0; j < 2; j++) {
        if (j >= string.size()) {
            base = (base << 1) +0;
        } else {
            int b = string[j] - '0';
            base = (base << 1) + b;
        }
    }
    return (uint8_t)base;
}

void Widget::setPowerSwitch(bool on)
{
    sandpack(m_packageBuild.writePowerSwitch(on));
}

void Widget::writeStimCurrentSize(int stimInde, float currentSize)
{

}

#ifndef PACKAGEBUILD_H
#define PACKAGEBUILD_H

#include <QObject>

class PackageBuild
{
public:
    PackageBuild();
    enum Command {
        COMMAND_POWER_SWITCH = 0xC0,
        COMMAND_COLLECT_CHANNEL_SWITCH = 0xC1,
        COMMAND_STIM_CHANNEL_SWITCH = 0xC2,
        COMMAND_STIM_CURRENT_SIZE = 0xC3,
        COMMAND_STIM_INTERVAL = 0xC4,
        COMMAND_PULSE_WIDTH = 0xC5,
        COMMAND_COLLECT_DATA = 0xC6,
        COMMAND_IMPENDENCE_CHECK = 0xC7,
        COMMAND_HEARTBEAT_CONTENT = 0xC8,
        COMMAND_RESTART_OR_UPGRADE = 0xA0,
        COMMAND_SET_SELF_TEST = 0xA3,
        COMMANDM_IMPEDANCE_CALIBRATION = 0xA7,
        COMMAND_READ_FRONT_SERIAL_NUMBER = 0xA9
    };
    QByteArray writePowerSwitch(bool on) const;
    QByteArray readPowerSwitch() const;

    QByteArray writeCollectionChannelSwitch(uint8_t data) const;
    QByteArray readCollectionChannelSwitch() const;

    QByteArray writeStimChannelSwitch(uint8_t data) const;
    QByteArray readStimChannelSwitch() const;

    QByteArray writeStimCurrentSize(int stimInde,float currentSize) const;
    QByteArray readStimCurrentSize() const;

    QByteArray writeStimIntervalSize(int stimIndex, std::chrono::milliseconds interval) const;
    QByteArray readStimIntervalSize() const;

    QByteArray writePulseWidth(int stimIndex, int pulseWidth) const;
    QByteArray readPulseWidth() const;

    QByteArray writeImpedanceDetectionEnable(bool on) const;
    QByteArray readImpedanceDetectionEnable() const;

    static QByteArray generateChecksum(const QByteArray& bytes, int size, int start = 0);

private:
    QByteArray writeCommandByteArray(Command cmd, const QByteArray& data) const;
    QByteArray readCommandByteArray(Command cmd, const QByteArray& data) const;
    uint8_t kZero = 0x00;
    const static int kFrameSize = 10;
};

#endif // PACKAGEBUILD_H

#include "packagebuild.h"

PackageBuild::PackageBuild()
{

}
QByteArray PackageBuild::writePowerSwitch(bool on) const
{
    uint8_t data = on ? 0x01 : 0x00;
    QByteArray byteArray;
    byteArray.append(data);
    return writeCommandByteArray(COMMAND_POWER_SWITCH, byteArray);
}

QByteArray PackageBuild::readPowerSwitch() const
{
    QByteArray byteArray;
    byteArray.append(kZero);
    return readCommandByteArray(COMMAND_POWER_SWITCH, byteArray);
}

QByteArray PackageBuild::writeCollectionChannelSwitch(uint8_t data) const
{
    QByteArray byteArray;
    byteArray.append(data);
    return writeCommandByteArray(COMMAND_COLLECT_CHANNEL_SWITCH, byteArray);
}

QByteArray PackageBuild::readCollectionChannelSwitch() const
{
    QByteArray byteArray;
    byteArray.append(kZero);
    return readCommandByteArray(COMMAND_COLLECT_CHANNEL_SWITCH, byteArray);
}

QByteArray PackageBuild::  writeStimChannelSwitch(uint8_t data) const
{
    QByteArray byteArray;
    byteArray.append(data);
    return writeCommandByteArray(COMMAND_STIM_CHANNEL_SWITCH, byteArray);
}

QByteArray PackageBuild::readStimChannelSwitch() const
{
    QByteArray byteArray;
    byteArray.append(kZero);
    return readCommandByteArray(COMMAND_STIM_CHANNEL_SWITCH, byteArray);
}

QByteArray PackageBuild::writeStimCurrentSize(int stimInde, float currentSize) const
{
    QByteArray byteArray;
    byteArray.append(stimInde);
    int current = currentSize;
    byteArray.append(reinterpret_cast<char*>(&current), 2);
    return writeCommandByteArray(COMMAND_STIM_CURRENT_SIZE, byteArray);
}

QByteArray PackageBuild::readStimCurrentSize() const
{
    QByteArray byteArray;
    byteArray.append(kZero);
    return readCommandByteArray(COMMAND_STIM_CURRENT_SIZE, byteArray);
}

QByteArray PackageBuild::writeStimIntervalSize(int stimIndex, std::chrono::milliseconds interval) const
{
    unsigned int kInterval = interval.count();
    QByteArray byteArray;
    byteArray.append(stimIndex);
    byteArray.append(reinterpret_cast<char*>(&kInterval), 2);
    return writeCommandByteArray(COMMAND_STIM_INTERVAL, byteArray);
}

QByteArray PackageBuild::readStimIntervalSize() const
{
    QByteArray byteArray;
    byteArray.append(kZero);
    return readCommandByteArray(COMMAND_STIM_INTERVAL, byteArray);
}

QByteArray PackageBuild::writePulseWidth(int stimIndex, int pulseWidth) const
{
    QByteArray byteArray;
    byteArray.append(stimIndex);
    byteArray.append(reinterpret_cast<char*>(&pulseWidth), 2);
    return writeCommandByteArray(COMMAND_PULSE_WIDTH, byteArray);
}

QByteArray PackageBuild::readPulseWidth() const
{
    QByteArray byteArray;
    byteArray.append(kZero);
    return readCommandByteArray(COMMAND_PULSE_WIDTH, byteArray);
}

QByteArray PackageBuild::writeImpedanceDetectionEnable(bool on) const
{
    uint8_t data = on ? 0x01 : 0x00;
    QByteArray byteArray;
    byteArray.append(data);
    return writeCommandByteArray(COMMAND_IMPENDENCE_CHECK, byteArray);
}

QByteArray PackageBuild::readImpedanceDetectionEnable() const
{
    QByteArray byteArray;
    byteArray.append(kZero);
    return readCommandByteArray(COMMAND_IMPENDENCE_CHECK, byteArray);
}

QByteArray PackageBuild::generateChecksum(const QByteArray& bytes, int size, int start)
{
    uint16_t sum = 0;
    QByteArray validByte = bytes.mid(start, size);
    for (size_t i = 0; i < validByte.size();i++) {
        sum = sum + (uint8_t)validByte.at(i);
    }
    QByteArray checkByteArray(reinterpret_cast<char*>(&sum), 2);
    std::reverse(checkByteArray.begin(), checkByteArray.end());
    return checkByteArray;
}

QByteArray PackageBuild::writeCommandByteArray(Command cmd, const QByteArray& data) const
{
    int dataLength = data.size();
    QByteArray databig(reinterpret_cast<char*>(&dataLength), 2);
    std::reverse(databig.begin(), databig.end());
    QByteArray byteArray;
    byteArray.append(0xEB);
    byteArray.append(0x90);
    byteArray.append(databig);
    byteArray.append(2);
    byteArray.append(cmd);
    byteArray.append(kZero);
    byteArray.append(0x33);
    byteArray.append(0x33);

    QByteArray dataFlip(data, data.size());
    std::reverse(dataFlip.begin(), dataFlip.end());

    byteArray.append(dataFlip);

    uint16_t sum = 0;
    for (size_t i = 0; i < byteArray.size(); i++) {

        sum = sum + (uint8_t)byteArray.at(i);
    }
    QByteArray checkByteArray(reinterpret_cast<char*>(&sum), 2);
    std::reverse(checkByteArray.begin(), checkByteArray.end());
    byteArray.append(checkByteArray);
    return byteArray;
}

QByteArray PackageBuild::readCommandByteArray(Command cmd, const QByteArray& data) const
{
    int dataLength = data.size();

    QByteArray databig;
    databig.append(reinterpret_cast<char*>(&dataLength), 2);
    std::reverse(databig.begin(), databig.end());
    QByteArray byteArray;
    byteArray.append(0xEB);
    byteArray.append(0x90);
    byteArray.append(databig);
    byteArray.append(1);
    byteArray.append(cmd);
    byteArray.append(kZero);
    byteArray.append(0x33);
    byteArray.append(0x33);

    QByteArray dataFlip(data, data.size());
    std::reverse(dataFlip.begin(), dataFlip.end());

    byteArray.append(dataFlip);

    uint16_t sum = 0;
    for (size_t i = 0; i < byteArray.size(); i++) {
        sum = sum + byteArray.at(i);
    }
    QByteArray checkByteArray(reinterpret_cast<char*>(&sum), 2);
    std::reverse(checkByteArray.begin(), checkByteArray.end());
    byteArray.append(checkByteArray);
    return byteArray;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值