我是靠谱客的博主 哭泣小松鼠,最近开发中收集的这篇文章主要介绍Win7+Qt5.6的高波特率串口编程,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1             概述

基于工作需要,要实现高波特率的串口,所以之前使用MFC编程的时候,是利用的Moxa公司的pcomm库。

现在转到Qt来编程,就特别希望使用Qt自身的类和访问系统的方式来实现高波特率的串口访问。毕竟,第三方库也是访问的操作系统,按照理论来讲,直接访问也是可以实现的。但是由于对Qt和操作系统的理解浅显,又没有能力短期内实现深层的研究,所以捷径就是在网上进行搜索大家的方法。

不过很不幸的是,没有找到不使用第三方类的方法的资料。所以暂时妥协。入门Qt,特别感谢微博大神“一去、二三里”(虽然他也不知道有这么个粉丝),他的不少文章都看了获益不少;感谢微信公众号“Qt编程”;另外谢谢QQ群的“广州-老秃驴”提供的网络链接以及对应的微博博主“__2017__”。

本人使用的平台是Win764bit+Qt5.6.1,所以暂时还没有验证其他操作系统的。

2             利用第三方类实现高波特率(230400 460800 921600)

2.1    源文件

对于特别需要解决问题的朋友,可以直接下我提供的文件,因为我没有分,很多人提供的资源我也下载不了。所以特别致敬大神“一去、二三里”,大家免费下!!

一共5个文件:

1)     winbase.h:操作系统底层文件,需要增加宏定义。

2)     qextserialbase.h/cpp:串口基类

3)     win_qextserialport.h/cpp:windows下的串口子类

这几个文件对于使用者而言,完全可用,需要修改的地方已经完成修改。其中winbase.h找到18.07.05所对应的3行内容,然后拷贝到你系统里的C:QtQt5.6.1Toolsmingw492_32i686-w64-mingw32include文件夹下同名的文件内就行。

     具体的每个文件的修改内容,请查阅”__2017__”的文章。

2.2    使用

2.2.1          报错处理

本文只提供博主程序环境(Windowsxp,Qt4.6.3及Qt Creator2.0)变了之后(Windows 7,Qt5.6.1)需要修改的几个小问题。

这些方法都是网上搜的,非常有用!由于不方便,所以没法粘贴其对应的网址表示谢意,只能笼统对大家表示感谢!!

1)     port.toAscii()会报错

win_qextserialport.cpp:187: error: 'class QString' has no member named 'toAscii'

         Win_Handle=CreateFileA(port.toAscii(), GENERIC_READ|GENERIC_WRITE,

                                     ^

a)      原因:新版的Qt不再支持QString类的toAscii()函数

b)     方案:将对应内容改为port.toLatin1()即可编译通过

2)     增加了h和cpp文件后Qt的调试和运行按钮变灰,不可使用。

a)      原因:.pro文件内的换行导致新行的空格数量没有对齐4字节。

b)     困惑:其实也没有明白为什么.pro文件会发生变化,因为没有改动到它啊,毕竟添加文件前都是可以正常调试和运行的,添加后哪怕什么都不做,都不行。

c)      方案:

                               i.           将所有的换行去掉,在一行显示。--实验过,OK。

                             ii.           将所有用换行的新行空白都按4空格倍数对齐。---试验过,OK。

2.2.2          使用步骤

博主“一去、二三里”有详细描述,本文不再赘述,只做概述,步骤都是亲自验证过的,传递的是文本模式。

1)     添加文件到工程。

2)     添加头文件(注意引号的格式):#include "win_qextserialport.h"

3)     添加对象和slots

private:

    Win_QextSerialPort *myCom;

private slots:

   void on_pushButton_clicked(); //”发送数据”按钮槽函数

   void readMyCom();  //读取串口

4)     初始化com信息

   myCom = new Win_QextSerialPort("COM5",QextSerialBase::EventDriven);

    //定义串口对象,指定串口名和查询模式,这里使用事件驱动EventDriven

    myCom ->open(QIODevice::ReadWrite);

    //以读写方式打开串口

    myCom->setBaudRate(BAUD460800);

    //波特率设置,我们设置为460800

    myCom->setDataBits(DATA_8);

    //数据位设置,我们设置为8位数据位

    myCom->setParity(PAR_NONE);

    //奇偶校验设置,我们设置为无校验

    myCom->setStopBits(STOP_1);

    //停止位设置,我们设置为1位停止位

    myCom->setFlowControl(FLOW_OFF);

    //数据流控制设置,我们设置为无数据流控制

    connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));

    //信号和槽函数关联,当串口缓冲区有数据时,进行读串口操作

5)     槽函数—读取串口数据—有提前建立一个文本浏览器,也可以不关联控件

void MainWindow::readMyCom() //读取串口数据并显示出来

{

    QByteArray temp = myCom->readAll();

    //读取串口缓冲区的所有数据给临时变量temp

    ui->textBrowser->insertPlainText(temp);

    //将串口的数据显示在窗口的文本浏览器中

}

6)     槽函数—发送串口数据,与文本框和按钮关联比较常见

void MainWindow::on_pushButton_clicked()  //发送数据

{

 myCom->write(“asdf123”); 

}

2.2.3          关于收发非文本数据的理解

可能得自己写一个简单的转换函数,转换成你自己想要的进制数据。

2.2.4          小发现

myCom调用了readAll()函数,但是却没在Win_QextSerialPort的类文件中找到这个函数,搜索发现是基类QIODevice()的函数。

为自己点个赞,嘿嘿嘿J


最后

以上就是哭泣小松鼠为你收集整理的Win7+Qt5.6的高波特率串口编程的全部内容,希望文章能够帮你解决Win7+Qt5.6的高波特率串口编程所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(91)

评论列表共有 0 条评论

立即
投稿
返回
顶部