自己也能做上位机 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> 哇加油楼主期待后续 接下说说 我遇到过的最大的问题:
就是我要向单片机发送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: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其它的控件也差不多是这个意思?
现在做成了这个界面,心里小小的美了一把,按一下按钮就可以了,哈哈,后续还可以根据自己的情况自己改!
好文,顶起 这么快就上手了,赞 ljj3166 发表于 2016-1-22 11:19
好文,顶起
谢谢 白丁 发表于 2016-1-22 23:04
这么快就上手了,赞
很简单的 {:1_103:}{:1_103:}{:1_103:}{:1_103:} {:1_103:}{:1_103:}{:1_103:}{:1_103:} 厉害了 能请教下不 楼主,请问能否把你后来修改的工程分享一下,先谢谢楼主了 ElleryQueen 发表于 2017-5-8 18:00
楼主,请问能否把你后来修改的工程分享一下,先谢谢楼主了
不 自己爬坡去吧 ywlzh 发表于 2016-1-22 10:00
有人就会问,楼主可否贴个原工程呢?
可以啊,给!
正在学这个,下载了,谢谢楼主 请教下图上出错的是什么情况
先赞一个!!!:victory: 你这是那个IDE编写的代码
页:
[1]
2