Typica is a free program for professional coffee roasters. https://typica.us
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

dialog.cpp 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #include "qextserialport.h"
  2. #include "qextserialenumerator.h"
  3. #include "dialog.h"
  4. #include "ui_dialog.h"
  5. #include <QtCore>
  6. Dialog::Dialog(QWidget *parent) :
  7. QDialog(parent),
  8. ui(new Ui::Dialog)
  9. {
  10. ui->setupUi(this);
  11. //! [0]
  12. foreach (QextPortInfo info, QextSerialEnumerator::getPorts())
  13. ui->portBox->addItem(info.portName);
  14. //make sure user can input their own port name!
  15. ui->portBox->setEditable(true);
  16. ui->baudRateBox->addItem("1200", BAUD1200);
  17. ui->baudRateBox->addItem("2400", BAUD2400);
  18. ui->baudRateBox->addItem("4800", BAUD4800);
  19. ui->baudRateBox->addItem("9600", BAUD9600);
  20. ui->baudRateBox->addItem("19200", BAUD19200);
  21. ui->baudRateBox->setCurrentIndex(3);
  22. ui->parityBox->addItem("NONE", PAR_NONE);
  23. ui->parityBox->addItem("ODD", PAR_ODD);
  24. ui->parityBox->addItem("EVEN", PAR_EVEN);
  25. ui->dataBitsBox->addItem("5", DATA_5);
  26. ui->dataBitsBox->addItem("6", DATA_6);
  27. ui->dataBitsBox->addItem("7", DATA_7);
  28. ui->dataBitsBox->addItem("8", DATA_8);
  29. ui->dataBitsBox->setCurrentIndex(3);
  30. ui->stopBitsBox->addItem("1", STOP_1);
  31. ui->stopBitsBox->addItem("2", STOP_2);
  32. ui->queryModeBox->addItem("Polling", QextSerialPort::Polling);
  33. ui->queryModeBox->addItem("EventDriven", QextSerialPort::EventDriven);
  34. //! [0]
  35. ui->led->turnOff();
  36. timer = new QTimer(this);
  37. timer->setInterval(40);
  38. //! [1]
  39. PortSettings settings = {BAUD9600, DATA_8, PAR_NONE, STOP_1, FLOW_OFF, 10};
  40. port = new QextSerialPort(ui->portBox->currentText(), settings, QextSerialPort::Polling);
  41. //! [1]
  42. enumerator = new QextSerialEnumerator(this);
  43. enumerator->setUpNotifications();
  44. connect(ui->baudRateBox, SIGNAL(currentIndexChanged(int)), SLOT(onBaudRateChanged(int)));
  45. connect(ui->parityBox, SIGNAL(currentIndexChanged(int)), SLOT(onParityChanged(int)));
  46. connect(ui->dataBitsBox, SIGNAL(currentIndexChanged(int)), SLOT(onDataBitsChanged(int)));
  47. connect(ui->stopBitsBox, SIGNAL(currentIndexChanged(int)), SLOT(onStopBitsChanged(int)));
  48. connect(ui->queryModeBox, SIGNAL(currentIndexChanged(int)), SLOT(onQueryModeChanged(int)));
  49. connect(ui->timeoutBox, SIGNAL(valueChanged(int)), SLOT(onTimeoutChanged(int)));
  50. connect(ui->portBox, SIGNAL(editTextChanged(QString)), SLOT(onPortNameChanged(QString)));
  51. connect(ui->openCloseButton, SIGNAL(clicked()), SLOT(onOpenCloseButtonClicked()));
  52. connect(ui->sendButton, SIGNAL(clicked()), SLOT(onSendButtonClicked()));
  53. connect(timer, SIGNAL(timeout()), SLOT(onReadyRead()));
  54. connect(port, SIGNAL(readyRead()), SLOT(onReadyRead()));
  55. connect(enumerator, SIGNAL(deviceDiscovered(QextPortInfo)), SLOT(onPortAddedOrRemoved()));
  56. connect(enumerator, SIGNAL(deviceRemoved(QextPortInfo)), SLOT(onPortAddedOrRemoved()));
  57. setWindowTitle(tr("QextSerialPort Demo"));
  58. }
  59. Dialog::~Dialog()
  60. {
  61. delete ui;
  62. delete port;
  63. }
  64. void Dialog::changeEvent(QEvent *e)
  65. {
  66. QDialog::changeEvent(e);
  67. switch (e->type()) {
  68. case QEvent::LanguageChange:
  69. ui->retranslateUi(this);
  70. break;
  71. default:
  72. break;
  73. }
  74. }
  75. void Dialog::onPortNameChanged(const QString & /*name*/)
  76. {
  77. if (port->isOpen()) {
  78. port->close();
  79. ui->led->turnOff();
  80. }
  81. }
  82. //! [2]
  83. void Dialog::onBaudRateChanged(int idx)
  84. {
  85. port->setBaudRate((BaudRateType)ui->baudRateBox->itemData(idx).toInt());
  86. }
  87. void Dialog::onParityChanged(int idx)
  88. {
  89. port->setParity((ParityType)ui->parityBox->itemData(idx).toInt());
  90. }
  91. void Dialog::onDataBitsChanged(int idx)
  92. {
  93. port->setDataBits((DataBitsType)ui->dataBitsBox->itemData(idx).toInt());
  94. }
  95. void Dialog::onStopBitsChanged(int idx)
  96. {
  97. port->setStopBits((StopBitsType)ui->stopBitsBox->itemData(idx).toInt());
  98. }
  99. void Dialog::onQueryModeChanged(int idx)
  100. {
  101. port->setQueryMode((QextSerialPort::QueryMode)ui->queryModeBox->itemData(idx).toInt());
  102. }
  103. void Dialog::onTimeoutChanged(int val)
  104. {
  105. port->setTimeout(val);
  106. }
  107. //! [2]
  108. //! [3]
  109. void Dialog::onOpenCloseButtonClicked()
  110. {
  111. if (!port->isOpen()) {
  112. port->setPortName(ui->portBox->currentText());
  113. port->open(QIODevice::ReadWrite);
  114. }
  115. else {
  116. port->close();
  117. }
  118. //If using polling mode, we need a QTimer
  119. if (port->isOpen() && port->queryMode() == QextSerialPort::Polling)
  120. timer->start();
  121. else
  122. timer->stop();
  123. //update led's status
  124. ui->led->turnOn(port->isOpen());
  125. }
  126. //! [3]
  127. //! [4]
  128. void Dialog::onSendButtonClicked()
  129. {
  130. if (port->isOpen() && !ui->sendEdit->toPlainText().isEmpty())
  131. port->write(ui->sendEdit->toPlainText().toLatin1());
  132. }
  133. void Dialog::onReadyRead()
  134. {
  135. if (port->bytesAvailable()) {
  136. ui->recvEdit->moveCursor(QTextCursor::End);
  137. ui->recvEdit->insertPlainText(QString::fromLatin1(port->readAll()));
  138. }
  139. }
  140. void Dialog::onPortAddedOrRemoved()
  141. {
  142. QString current = ui->portBox->currentText();
  143. ui->portBox->blockSignals(true);
  144. ui->portBox->clear();
  145. foreach (QextPortInfo info, QextSerialEnumerator::getPorts())
  146. ui->portBox->addItem(info.portName);
  147. ui->portBox->setCurrentIndex(ui->portBox->findText(current));
  148. ui->portBox->blockSignals(false);
  149. }
  150. //! [4]