ywlzh 发表于 2016-1-22 09:48

自己也能做上位机 QT5

<div class='showpostmsg'> 本帖最后由 ywlzh 于 2016-1-22 10:31 编辑

还记得当初学单片机的时候,要用串口调试助手,就得在网上下,有时候就纳闷,那个串口调试助手是怎么做出来的,在心底留下了个印象,前几天,自己做的一个小车,用的无刷电机做一个不大不小的车,沿着轨道走的,那个串口通信协议实在是多,自己总是要一个字符一个字符的输入,发送,哎呀,太麻烦了,还不如自己写一个呢,于是就开始了自己的探索之旅。
第一个问题:用什么开发软件来开发自己的上位机呢?
      开始纠结过一点点时间,后来一想,管那么多干嘛,能生成exe就行,于是随便找了个开发软件,QT5,对就是这么随便,要求不多,能用就行。
第二个问题:怎么写呢,没有个C++的底子,不得十天半个月的吗?
      不要太较真程序,应用层就先想应用层的事,不要去想那些个源代码怎么实现的,
于是开始编写,自己在网上找了个教程,什么图文并茂的,什么入门教程,什么绝对入门的,看,但不一下就尝试,先纵观其整个网页,看可行不可行,然后了解个流程,开始自己编写,不求甚解!照着自己觉得好点的教程做,其中肯定回遇到问题,别怕,遇到一个解决一个。先给自己做了一个模板,哈哈,看看
   
</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

soso 发表于 2016-1-22 09:55

哇加油楼主期待后续

ywlzh 发表于 2016-1-22 09:57

接下说说 我遇到过的最大的问题:
就是我要向单片机发送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<len; )
      {
          hstr=str.toLatin1();
          if(hstr == ' ')
          {
            i++;
            continue;
          }
          i++;
          if(i >= len)
            break;
          lstr = str.toLatin1();
          hexdata = ConvertHexChar(hstr);
          lowhexdata = ConvertHexChar(lstr);
          if((hexdata == 16) || (lowhexdata == 16))
            break;
          else
            hexdata = hexdata*16+lowhexdata;
          i++;
          senddata = (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);
}

ywlzh 发表于 2016-1-22 10:00

有人就会问,楼主可否贴个原工程呢?
可以啊,给!

cwfwh 发表于 2016-1-22 10:12

谢谢楼主分享

ywlzh 发表于 2016-1-22 10:30

本帖最后由 ywlzh 于 2016-1-22 10:37 编辑

有人还问,程序是怎么实现的呢?
那我先说一下自己的见解,讲几个注意的地方,肯定有不对的地方,毕竟才弄了三天日子,我靠,三天!对,没错,你要是自己写可能一天就好了!应用层就想应用层的事,别想多了,将整个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:41

现在做成了这个界面,心里小小的美了一把,按一下按钮就可以了,哈哈,后续还可以根据自己的情况自己改!

ljj3166 发表于 2016-1-22 11:19

好文,顶起

白丁 发表于 2016-1-22 23:04

这么快就上手了,赞

ywlzh 发表于 2016-1-23 16:16

ljj3166 发表于 2016-1-22 11:19
好文,顶起

谢谢

ywlzh 发表于 2016-1-23 16:16

白丁 发表于 2016-1-22 23:04
这么快就上手了,赞

很简单的

涛声依旧00 发表于 2016-1-23 16:24

{:1_103:}{:1_103:}{:1_103:}{:1_103:}

jokerzhanglin 发表于 2016-12-12 12:37

{:1_103:}{:1_103:}{:1_103:}{:1_103:}

棒棒哥 发表于 2017-3-20 21:44

厉害了 能请教下不

ElleryQueen 发表于 2017-5-8 18:00

楼主,请问能否把你后来修改的工程分享一下,先谢谢楼主了

ywlzh 发表于 2017-5-9 11:48

ElleryQueen 发表于 2017-5-8 18:00
楼主,请问能否把你后来修改的工程分享一下,先谢谢楼主了

不 自己爬坡去吧

大北极熊 发表于 2017-10-12 19:36

ywlzh 发表于 2016-1-22 10:00
有人就会问,楼主可否贴个原工程呢?
可以啊,给!

正在学这个,下载了,谢谢楼主

小征VB 发表于 2017-12-21 14:37

请教下图上出错的是什么情况

damiaa 发表于 2017-12-21 16:03

先赞一个!!!:victory:

羊羊羊一样 发表于 2018-3-12 10:46

你这是那个IDE编写的代码
页: [1] 2
查看完整版本: 自己也能做上位机 QT5