用qt写的一个简单到不能在简单的上位机

用qt写的一个简单到不能在简单的上位机

学QT时,写的一个简单得不能再简单的串口上位机,用来控制单片机上的2个LED。假设一个是只有开和关的状态。一个可以调节亮度。上位机的界面如下图:

其中,波特率,数据位,停止位下拉值在设计师里面添加。剩下的功能,基本由代码实现。通信使用的协议也是随便写的。很简单和随意。图片是老弟手绘的。

下面贴代码 (*^__^*) 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include <QtSerialPort>

MainWindow::MainWindow(QWidget *parent) :

    QMainWindow(parent),

    ui(new Ui::MainWindow)

{

    ui->setupUi(this);

    Pic = tr("://Resource/关灯.jpg"); //放置一张图片

    ui->lightLabel->setPixmap(Pic);

    ui->RTextEdit->setReadOnly(false);

    ui->STextEdit->setReadOnly(false);

    ui->onButton->setEnabled(true); //默认关灯

    ui->offButton->setEnabled(false);

    ui->lightDial->setEnabled(false);

    serial = new QSerialPort(this);

    OpenFlag = false;   //串口未打开

    connect(ui->lightDial, SIGNAL(valueChanged(int)), this, SLOT(on_light_chance()));

    UsartUi();

}

MainWindow::~MainWindow()

{

    delete ui;

}

void MainWindow::UsartUi()  //完善串口配置UI

{

    ui->parityBox->addItem(QStringLiteral("None"),QSerialPort::NoParity);

    ui->parityBox->addItem(QStringLiteral("偶校验"),QSerialPort::EvenParity);

    ui->parityBox->addItem(QStringLiteral("奇校验"),QSerialPort::OddParity);

    ui->parityBox->addItem(QStringLiteral("Mark  1"),QSerialPort::MarkParity);

    ui->parityBox->addItem(QStringLiteral("Space 0"),QSerialPort::SpaceParity);

    ui->baundRateBox->setItemData(0,QSerialPort::Baud4800);

    ui->baundRateBox->setItemData(1,QSerialPort::Baud9600);

    ui->baundRateBox->setItemData(2,QSerialPort::Baud19200);

    ui->baundRateBox->setItemData(3,QSerialPort::Baud38400);

    ui->baundRateBox->setItemData(4,QSerialPort::Baud57600);

    ui->baundRateBox->setItemData(5,QSerialPort::Baud115200);

    ui->dataBitBox->setItemData(0,QSerialPort::Data5);

    ui->dataBitBox->setItemData(1,QSerialPort::Data6);

    ui->dataBitBox->setItemData(2,QSerialPort::Data7);

    ui->dataBitBox->setItemData(3,QSerialPort::Data8);

    ui->stopBitBox->setItemData(0,QSerialPort::OneStop);

    ui->stopBitBox->setItemData(1,QSerialPort::OneAndHalfStop);

    ui->stopBitBox->setItemData(2,QSerialPort::TwoStop);

    PortInfo();

}

void MainWindow::PortInfo()

{

    ui->uNameBox->clear();

    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {

        QStringList list;

        list << info.portName()

             << info.description()

             << info.manufacturer()

             << info.systemLocation()

             << (info.vendorIdentifier() ? QString::number(info.vendorIdentifier(), 16) : QString())

             << (info.productIdentifier() ? QString::number(info.productIdentifier(), 16) : QString());

        ui->uNameBox->addItem(list.first(), list);

    }

}

//槽函数

void MainWindow::on_startButton_clicked()   //打开串口

{

    if(!OpenFlag)//执行打开串口

    {

        currentConfig.name = ui->uNameBox->currentText();

        currentConfig.baudRate = static_cast<QSerialPort::BaudRate>

               (ui->baundRateBox->itemData(ui->baundRateBox->currentIndex()).toInt());

        currentConfig.dataBits = static_cast<QSerialPort::DataBits>

               (ui->dataBitBox->itemData(ui->dataBitBox->currentIndex()).toInt());

        currentConfig.stopBits = static_cast<QSerialPort::StopBits>

               (ui->stopBitBox->itemData(ui->stopBitBox->currentIndex()).toInt());

        currentConfig.parity = static_cast<QSerialPort::Parity>

               (ui->parityBox->itemData(ui->parityBox->currentIndex()).toInt());

        serial->setPortName(currentConfig.name);

        if(serial->open(QIODevice::ReadWrite))

        {

            if( serial->setBaudRate(currentConfig.baudRate)

                && serial->setDataBits(currentConfig.dataBits)

                && serial->setStopBits(currentConfig.stopBits)

                && serial->setParity(currentConfig.parity) )

            {

                OpenFlag = true;

                ui->startButton->setText(tr("关闭串口"));

            }

            else

            {

                serial->close();

                OpenFlag = false;

                ui->startButton->setText(tr("打开串口"));

            }

        }

        else

        {

            OpenFlag = false;

            ui->startButton->setText(tr("打开串口"));

        }

    }

    else

    {

        OpenFlag = false;

        ui->startButton->setText(tr("打开串口"));

        serial->close();

    }

/*    ui->STextEdit->setText(tr("校验位:%1 \n波特率:%2 \n数据位:%3 \n停止位:%4")

                             .arg(ui->parityBox->itemData(ui->parityBox->currentIndex()).toString())

                             .arg(ui->baundRateBox->itemData(ui->baundRateBox->currentIndex()).toString())

                             .arg(ui->dataBitBox->itemData(ui->dataBitBox->currentIndex()).toString())

                             .arg(ui->stopBitBox->itemData(ui->stopBitBox->currentIndex()).toString()));

*/

}

void MainWindow::on_offButton_clicked() //关灯

{

    QByteArray data;

    QString Pdata;

    data.resize(3);

    data[0] = 0xF0;

    data[1] = 0X0F;

    data[2] = 0x80;

    ui->offButton->setEnabled(false);

    ui->onButton->setEnabled(true);

    ui->lightDial->setValue(1);

    ui->lightDial->setEnabled(false);

    Pdata = data.toHex().toUpper();

    int Size = Pdata.size();

    for(int i = Size; i > 0; i--)

    {

        Pdata.insert(i * 2, " ");

    }

    ui->STextEdit->insertPlainText(Pdata);

    //发送数据

    serial->write(data);

}

void MainWindow::on_onButton_clicked()  //开灯  0XF0 0X0F 0X81

{

    QByteArray data;

    QString Pdata;

    data.resize(3);

    data[0] = 0xF0;

    data[1] = 0X0F;

    data[2] = 0X81;

    ui->onButton->setEnabled(false);

    ui->offButton->setEnabled(true);

    ui->lightDial->setEnabled(true);

    Pdata = data.toHex().toUpper();

    int Size = Pdata.size() / 2;

    for(int i = Size; i > 0; i--)

    {

        Pdata.insert(i * 2, " ");

    }

    ui->STextEdit->insertPlainText(Pdata);

    //发送数据

    serial->write(data);

}

void MainWindow::on_light_chance()

{

    QByteArray data;

    QString Pdata;

    data.resize(5);

    data[0] = 0xF0;

    data[1] = 0x0F;

    data[2] = 0xC0;

    data[3] = 0x01;

    data[4] = ui->lightDial->value();

    Pdata = data.toHex().toUpper();

    int Size = Pdata.size() / 2;

    for(int i = Size; i > 0; i--)

    {

        Pdata.insert(i * 2, " ");

    }

    ui->STextEdit->insertPlainText(Pdata);

    serial->write(data);

}

void MainWindow::on_freshButton_clicked()   //刷新状态

{

    QByteArray Rdata = serial->readAll();

    QString Pdata = Rdata.toHex().toUpper();    //转换成HEX格式且大写

    int Size = Pdata.size()/2;

    for(int i = Size; i > 0; i--)   //插入空格 使格式如 xx xx xx

    {

        Pdata.insert(i * 2, " ");

    }

    ui->RTextEdit->insertPlainText(Pdata);

    int i = 0;

    if(Rdata.at(i) && 0xF0 == 0xF0)

    {

        i++;

        if(Rdata.at(i) && 0x0F == 0x0F)

        {

            while(Rdata.at(i) != '\0'//解析指令

            {

                if(Rdata.at(i) && 0x80 == 0x80)currentStatus.lightOnOff = false;

                if(Rdata.at(i) && 0x81 == 0x81)currentStatus.lightOnOff = true;

                if(Rdata.at(i) && 0xc0 == 0xc0)

                {

                    i = i + 2;

                    currentStatus.lightValue = Rdata.at(i);

                }

                i++;

            }

        }

    }

    if(currentStatus.lightOnOff)Pic = tr("://Resource/开灯.jpg");

    else Pic = tr("://Resource/关灯.jpg");

    ui->lightLabel->setPixmap(Pic);

    ui->lightLcdNumber->display(currentStatus.lightValue);

}

  

猜你喜欢

转载自blog.csdn.net/huangmaiqiu2594/article/details/81458979