[原创] 自己也能做上位机 QT5

ywlzh   2016-1-22 09:48 楼主
还记得当初学单片机的时候,要用串口调试助手,就得在网上下,有时候就纳闷,那个串口调试助手是怎么做出来的,在心底留下了个印象,前几天,自己做的一个小车,用的无刷电机做一个不大不小的车,沿着轨道走的,那个串口通信协议实在是多,自己总是要一个字符一个字符的输入,发送,哎呀,太麻烦了,还不如自己写一个呢,于是就开始了自己的探索之旅。 第一个问题:用什么开发软件来开发自己的上位机呢? 开始纠结过一点点时间,后来一想,管那么多干嘛,能生成exe就行,于是随便找了个开发软件,QT5,对就是这么随便,要求不多,能用就行。 第二个问题:怎么写呢,没有个C++的底子,不得十天半个月的吗? 不要太较真程序,应用层就先想应用层的事,不要去想那些个源代码怎么实现的, 于是开始编写,自己在网上找了个教程,什么图文并茂的,什么入门教程,什么绝对入门的,看,但不一下就尝试,先纵观其整个网页,看可行不可行,然后了解个流程,开始自己编写,不求甚解!照着自己觉得好点的教程做,其中肯定回遇到问题,别怕,遇到一个解决一个。先给自己做了一个模板,哈哈,看看 本帖最后由 ywlzh 于 2016-1-22 10:31 编辑
  • 模板
天地庄周马;江湖范蠡船。 个性签名还是放QQ号吧,2060347305,添加说明EEworld好友

回复评论 (24)

哇  加油楼主  期待后续
加油!在电子行业默默贡献自己的力量!:)
点赞  2016-1-22 09:55
接下说说 我遇到过的最大的问题:
  就是我要向单片机发送lineEdit里的数据时,它是字符串型的,我可以把它转化成Ascii码,但是我单片机是接受16进制的数据才可行。有人说何必这样呢,单片机接受Ascii再解码不就行了,对,是可以这样做,回过头来,要是用16进制的时候怎么办,还是得考虑,于是找啊找,找到了,代码如下:
  static 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 (-1);
}
static QByteArray QString2Hex(QString str)
  {
      QByteArray senddata;
      int hexdata,lowhexdata;
      int hexdatalen = 0;
      int len = str.length();
      senddata.resize(len/2);
      char lstr,hstr;
      for(int i=0; i       {
          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);
      return senddata;
  }
细细一看,原来就是将字符串里的数据一个一个转成16进制,然后两个合并成一个字节,
然后在发送数据按钮转到槽,对它的单击事件写下这个就可以了:
void MainWindow::on_sendMsgBtn_clicked()
{
    QString text=ui->sendMsglineEdit->text();
    QByteArray senddata = QString2Hex(text);      //转换为16进制
    myCom->write(senddata);
}
天地庄周马;江湖范蠡船。 个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
点赞  2016-1-22 09:57
有人就会问,楼主可否贴个原工程呢?
可以啊,给!

    usart.rar (2016-1-22 10:00 上传)

    909.2 KB, 下载次数: 649

天地庄周马;江湖范蠡船。 个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
点赞  2016-1-22 10:00
谢谢楼主分享  
点赞  2016-1-22 10:12
有人还问,程序是怎么实现的呢? 那我先说一下自己的见解,讲几个注意的地方,肯定有不对的地方,毕竟才弄了三天日子,我靠,三天!对,没错,你要是自己写可能一天就好了!应用层就想应用层的事,别想多了,将整个ui界面弄好了后,那些个端口,波特率,停止位,校验位,数据位的对象是Combo Box 然后单机拖到ui界面里,自己设好位置,然后双击添加一些要显示的数据,比如波特率要显示9600,或者115200,反正添加就行,不要纠结,程序是怎么知道, 然后那些关闭串口,打开串口,清屏,发送数据的按钮对象是Push Button,在ui界面下添加就行。 串口是怎么实现的? 先右击打开串口的按钮,转到槽,(槽是什么东西?就是指向这个对象的函数,管他什么东西)选择它的单击事件函数clicked(),看一看,源码如下: void MainWindow::on_openMyComBtn_clicked() { QString portName = ui->portNameComboBox->currentText(); //获取串口名 myCom = new Win_QextSerialPort(portName,QextSerialBase::EventDriven); //定义串口对象,并传递参数,在构造函数里对其进行初始化 myCom ->open(QIODevice::ReadWrite); //打开串口 if(ui->baudRateComboBox->currentText()==tr("9600")) //根据组合框内容对串口进行设置 myCom->setBaudRate(BAUD9600); else if(ui->baudRateComboBox->currentText()==tr("115200")) myCom->setBaudRate(BAUD115200); else if(ui->baudRateComboBox->currentText()==tr("14400")) myCom->setBaudRate(BAUD14400); else if(ui->baudRateComboBox->currentText()==tr("56000")) myCom->setBaudRate(BAUD56000); //设置波特率 if(ui->dataBitsComboBox->currentText()==tr("8")) myCom->setDataBits(DATA_8); else if(ui->dataBitsComboBox->currentText()==tr("7")) myCom->setDataBits(DATA_7); //设置数据位 if(ui->parityComboBox->currentText()==tr("无")) myCom->setParity(PAR_NONE); else if(ui->parityComboBox->currentText()==tr("奇")) myCom->setParity(PAR_ODD); else if(ui->parityComboBox->currentText()==tr("偶")) myCom->setParity(PAR_EVEN); //设置奇偶校验 if(ui->stopBitsComboBox->currentText()==tr("1")) myCom->setStopBits(STOP_1); else if(ui->stopBitsComboBox->currentText()==tr("2")) myCom->setStopBits(STOP_2); else if(ui->stopBitsComboBox->currentText()==tr("1.5")) myCom->setStopBits(STOP_1_5); //设置停止位 myCom->setFlowControl(FLOW_OFF); //设置数据流控制,我们使用无数据流控制的默认设置 myCom->setTimeout(500); //设置延时 connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom())); ui->openMyComBtn->setEnabled(false); //打开串口后“打开串口”按钮不可用 ui->closeMyComBtn->setEnabled(true); //打开串口后“关闭串口”按钮可用 ui->sendMsgBtn->setEnabled(true); //打开串口后“发送数据”按钮可用 ui->baudRateComboBox->setEnabled(false); //设置各个组合框不可用 ui->dataBitsComboBox->setEnabled(false); ui->parityComboBox->setEnabled(false); ui->stopBitsComboBox->setEnabled(false); ui->portNameComboBox->setEnabled(false); } 先粗略的解释一下,获取串口名是根据当前串口的Combobox里显示的是哪个串口就打开哪个串口,怎么打开的呢?不知道,也不要太死磕是怎么打开的,就是到这么做就是怎么个意思,波特率的选择也是一个意思,至于那个if(ui->baudRateComboBox->currentText()==tr("9600")),我将那个波特率的的ComboBox的对象名称改成了baudRateComboBox,ui是整个ui界面,这句话的意思就是如果这个UI界面下的baudRateComboBox里显示的是9600(中文)那就做 myCom->setBaudRate(BAUD9600);myCom是在头文件里用的第三方的类定义的,那个setBaudRate(BAUD9600);里的BAUD9600,是内部写好了的,用就是,那写好的波特率有哪些呢? 如下: RATE Windows Speed POSIX Speed ----------- ------------- ----------- BAUD50 110 50 BAUD75 110 75 *BAUD110 110 110 BAUD134 110 134.5 BAUD150 110 150 BAUD200 110 200 *BAUD300 300 300 *BAUD600 600 600 *BAUD1200 1200 1200 BAUD1800 1200 1800 *BAUD2400 2400 2400 *BAUD4800 4800 4800 *BAUD9600 9600 9600 BAUD14400 14400 9600 *BAUD19200 19200 19200 *BAUD38400 38400 38400 BAUD56000 56000 38400 *BAUD57600 57600 57600 BAUD76800 57600 76800 *BAUD115200 115200 115200 BAUD128000 128000 115200 BAUD256000 256000 115200 \endverbatim其它的控件也差不多是这个意思? 本帖最后由 ywlzh 于 2016-1-22 10:37 编辑
天地庄周马;江湖范蠡船。 个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
点赞  2016-1-22 10:30
现在做成了这个界面,心里小小的美了一把,按一下按钮就可以了,哈哈,后续还可以根据自己的情况自己改!
  • 小小界面.PNG
天地庄周马;江湖范蠡船。 个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
点赞  2016-1-22 10:41
好文,顶起
点赞  2016-1-22 11:19
这么快就上手了,赞
training
点赞  2016-1-22 23:04
引用: ljj3166 发表于 2016-1-22 11:19
好文,顶起

谢谢
天地庄周马;江湖范蠡船。 个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
点赞  2016-1-23 16:16
引用: 白丁 发表于 2016-1-22 23:04
这么快就上手了,赞

很简单的
天地庄周马;江湖范蠡船。 个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
点赞  2016-1-23 16:16
点赞  2016-1-23 16:24
点赞  2016-12-12 12:37
厉害了 能请教下不
点赞  2017-3-20 21:44
楼主,请问能否把你后来修改的工程分享一下,先谢谢楼主了
点赞  2017-5-8 18:00
引用: ElleryQueen 发表于 2017-5-8 18:00
楼主,请问能否把你后来修改的工程分享一下,先谢谢楼主了

不 自己爬坡去吧
天地庄周马;江湖范蠡船。 个性签名还是放QQ号吧,2060347305,添加说明EEworld好友
点赞  2017-5-9 11:48
引用: ywlzh 发表于 2016-1-22 10:00
有人就会问,楼主可否贴个原工程呢?
可以啊,给!

正在学这个,下载了,谢谢楼主
点赞  2017-10-12 19:36
请教下图上出错的是什么情况

  • QQ图片20171221143631.jpg
点赞  2017-12-21 14:37
先赞一个!!!
点赞  2017-12-21 16:03
你这是那个IDE编写的代码
点赞  2018-3-12 10:46
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复