串口助手可以连qt连不了

串口助手可以连qt连不了,第1张

串口助手使用方法:

在这里一定要注意一下,这个虚拟串口软件不要使用最新版本的9.0,会报错,一般使用7.2或者6.9版本即可。

9.0使用几天后,

中文版本报错如下:

无法配对端口。 有关详细信息,请参见日志。 要忽略错误并仍然创建捆绑包,请在选项中启用相应的设置。

英文版本报错如下:

Cannot pair ports. See log for details. To ignore errors and create bundles anyway, please, enable the corresponding setting in options.

换个版本即可解决。

使用目的

我们使用虚拟串口到底是干什么?如果有经验就知道。如果手头有一个实际的单片机,那么使用一个类似U盘的USB转TTL的东西,便可以将单片机发送的串口内容在串口助手中显示出来,但是如果没有单片机,也没有USB转TTL,那么可以在Proteus中,仿真一个单片机,发出串口内容,同时在Proteus中为单片机连接COMPIM(虚拟串口),同时在电脑上安装Virtual Serial Port Driver这个软件,那么,在Proteus中,单片机发出的串口内容便可以在同一个电脑中的串口助手中接收。这就是我们要完成的功能。

再概括一下就是,这个COMPIM模块能够将proteus中单片机的串口绑定到电脑上的一个串口,比如是com1,而这个虚拟串口就可以将com1和com2绑定,那么便可以利用上位机或者串口助手应用程序等从com2接收来自于com1中单片机的串口信息。

实现步骤如下:

(1)Proteus中单片机可以正常收发串口内容

(2)Proteus中单片机的引脚连接COMPIM,TXD连接TXD

(3)电脑中安装Virtual Serial Port Driver软件

(4)电脑中拥有串口助手

(5)Virtual Serial Port Driver软件中配对COM口,COMPIM设置相应COM口

9.0安装步骤:

双击安装vspdpro.exe

打开文件安装位置,将vspdproCHS.EXE复制过去

vspdpro-jie.exe可以不用复制过去

以后使用,直接双击vspdCHS.EXE

7.2安装步骤:

点击vspd.exe安装

打开文件所在位置,将vspdctl.dll覆盖复制到这个路径中

每次卸载完毕后,直接delete all,不要一直占用串口。

Linux下安装软件常用的三种方式:

包管理器安装:Ubuntu、Debian系列 apt-get install 包名  自动解决依赖关系,也是最简单的一种,前提是软件源中有你要安装的软件,中标麒麟就是此系列版本

下载deb包,使用命令dpkg -i *.deb

源码编译安装:下载tar.gz这种类型的源码包进行编译安装,前提是需要手动把依赖包安装好

一、文件下载文件下载地址:也可以下载我上传到网盘上的:二、文件内容介绍1.下载到的文件为qextserialport-1.2win-alpha ,解压并打开后其内容如下。(点击图片可以查看清晰大图)下面分别介绍:(1)doc文件夹中的文件内容是QextSerialPort类和QextBaseType的简单的说明,我们可以使用记事本程序将它们打开。(2)examples文件夹中是几个例子程序,可以看一下它的源码,不过想运行它们好像会出很多问题啊。(3)html文件夹中是QextSerialPort类的使用文档。(4)然后就是剩下的几个文件了。其中qextserialenumerator.cpp及qextserialenumerator.h文件中定义的QextSerialEnumerator类是用来获取平台上可用的串口信息的。不过,这个类好像并不怎么好用,而且它不是我们关注的重点,所以下面就不再介绍它了。(5)qextserialbase.cpp和qextserialbase.h文件定义了一个QextSerialBase类,win_qextserialport.cpp和win_qextserialport.h文件定义了一个Win_QextSerialPort类,posix_qextserialport.cpp和posix_qextserialport.h文件定义了一个Posix_QextSerialPort类,qextserialport.cpp和qextserialport.h文件定义了一个QextSerialPort类。这个QextSerialPort类就是我们上面所说的那个,它是所有这些类的子类,是最高的抽象,它屏蔽了平台特征,使得在任何平台上都可以使用它。2.几个类的简单介绍。下面是这几个类的关系图。可以看到它们都继承自QIODevice类,所以该类的一些函数我们也可以直接来使用。图中还有一个QextBaseType类,其实它只是一个标识,没有具体的内容,它用来表示Win_QextSerialPort或Posix_QextSerialPort中的一个类,因为在QextSerialPort类中使用了条件编译,所以QextSerialPort类既可以继承自Win_QextSerialPort类,也可以继承自Posix_QextSerialPort类,所以使用了QextBaseType来表示。这一点我们可以在qextserialport.h文件中看到。再说QextSerialPort类,其实它只是为了方便程序的跨平台编译,使用它可以在不同的平台上,根据不同的条件编译继承不同的类。所以它只是一个抽象,提供了几个构造函数而已,并没有具体的内容。在qextserialport.h文件中的条件编译内容如下:#ifdef_TTY_POSIX_#include“posix_qextserialport.h”#define QextBaseTypePosix_QextSerialPort#else#include“win_qextserialport.h”#define QextBaseTypeWin_QextSerialPort#endif所以,其实我们没有必要使用这个类,直接使用Win_QextSerialPort或Posix_QextSerialPort就可以了。当然如果你想使用这个类,实现同样的源程序可以直接在Windows和Linux下编译运行,那么一定要注意在Linux下这里需要添加#define _TTY_POSIX_ 。而我们这里为了使得程序更明了,所以没有使用该类,下面也就不再介绍它了。 QextSerialBase类继承自QIODevice类,它提供了 *** 作串口所必需的一些变量和函数等,而Win_QextSerialPort和Posix_QextSerialPort均继承自QextSerialBase类,Win_QextSerialPort类添加了Windows平台下 *** 作串口的一些功能,Posix_QextSerialPort类添加了Linux平台下 *** 作串口的一些功能。所以说,在Windows下我们使用Win_QextSerialPort类,在Linux下我们使用Posix_QextSerialPort类。3.在QextSerialBase类中还涉及到了一个枚举变量QueryMode。它有两个值Polling和EventDriven。QueryMode指的是读取串口的方式,下面我们称为查询模式,我们将Polling称为查询方式Polling,将EventDriven称为事件驱动方式。 事件驱动方式EventDriven就是使用事件处理串口的读取,一旦有数据到来,就会发出readyRead()信号,我们可以关联该信号来读取串口的数据。在事件驱动的方式下,串口的读写是异步的,调用读写函数会立即返回,它们不会冻结调用线程。而查询方式Polling则不同,读写函数是同步执行的,信号不能工作在这种模式下,而且有些功能也无法实现。但是这种模式下的开销较小。我们需要自己建立定时器来读取串口的数据。在Windows下支持以上两种模式,而在Linux下只支持Polling模式。三、小结。 这里讲了这么多,最后要说的只是,我们在Qt中使用这个类编写串口程序,根据平台的不同只需要分别使用四个文件。在Windows下是:qextserialbase.cpp和qextserialbase.h以及win_qextserialport.cpp和win_qextserialport.h在Linux下是:qextserialbase.cpp和qextserialbase.h以及posix_qextserialport.cpp和posix_qextserialport.h而在Windows下我们可以使用事件驱动EventDriven方式,也可以使用查询Polling方式,但是在Linux下我们只能使用查询Polling方式。第二部分 在Windows下编写串口通信程序我们的环境是Windowsxp,Qt4.6.3及Qt Creator2.0。第一,下面我们首先使用事件驱动来实现串口通信。1.新建工程。我们在QtCreator中新建Qt Gui工程,命名为myCom,Base Class选择QWidget。2.添加文件。我们将那四个文件添加到工程文件夹中。如下图。然后我们将这四个文件添加到工程中,在QtCreator的工程列表中的工程文件夹上点击鼠标右键,在d出的菜单中选择“AddExisting Files”菜单。如下图。我们在d出的对话框中选中四个文件,按下“打开”按钮即可,如下图。最终工程文件列表如下图。3.更改界面。我们将界面设计如下。其中的TextBrowser 部件用来显示接收到的数据,Line Edit部件用来输入要发送的数据,PushButton按钮用来发送数据。我们保持各部件的属性为默认值即可。4. 我们在widget.h文件中进行对象及函数声明。添加头文件包含:#include“win_qextserialport.h”然后在private中声明对象:Win_QextSerialPort *myCom声明私有槽函数:private slots:voidon_pushButton_clicked()//”发送数据”按钮槽函数void readMyCom()//读取串口5.在widget.cpp文件中进行更改。在构造函数中添加代码,完成后,构造函数内容如下:Widget::Widget(QWidget*parent) : QWidget(parent),ui(newUi::Widget){ ui->setupUi(this) myCom=new Win_QextSerialPort(“COM1″,QextSerialBase::EventDriven)//定义串口对象,指定串口名和查询模式,这里使用事件驱动EventDrivenmyCom->open(QIODevice::ReadWrite)//以读写方式打开串口 myCom->setBaudRate(BAUD9600)//波特率设置,我们设置为9600 myCom->setDataBits(DATA_8) //数据位设置,我们设置为8位数据位 myCom->setParity(PAR_NONE)//奇偶校验设置,我们设置为无校验 myCom->setStopBits(STOP_1)//停止位设置,我们设置为1位停止位 myCom->setFlowControl(FLOW_OFF)//数据流控制设置,我们设置为无数据流控制 myCom->setTimeout(500)//延时设置,我们设置为延时500ms,这个在Windows下好像不起作用 connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()))//信号和槽函数关联,当串口缓冲区有数据时,进行读串口 *** 作}实现槽函数:void Widget::readMyCom()//读取串口数据并显示出来{ QByteArraytemp = myCom->readAll()//读取串口缓冲区的所有数据给临时变量temp ui->textBrowser->insertPlainText(temp)//将串口的数据显示在窗口的文本浏览器中}voidWidget::on_pushButton_clicked() //发送数据{ myCom->write(ui->lineEdit->text().toAscii())//以ASCII码形式将数据写入串口}6.此时,我们运行程序,效果如下。可以看到,已经成功完成通信了。(注:我们这里下位机使用的是单片机,它使用串口与计算机的COM1相连。单片机上运行的程序的功能是,接收到一个字符便向上位机发送一个字符串然后发送接收到的字符。)两个重要问题的讲解:一、关于数据接收。我们想在程序中对接收的数据进行控制,但是readyRead()信号是一旦有数据到来就发射的,不过我们可以使用bytesAvailable()函数来检查已经获得的字节数,从而对数据接收进行控制。(1)我们在widget.cpp中添加头文件包含:#include 然后在读串口函数中添加一行代码,如下:void Widget::readMyCom() //读取串口数据并显示出来{ qDebug()<<“read:“<<myCom->bytesAvailable()<<”bytes”//我们输出每次获得的字节数 QByteArraytemp = myCom->readAll() ui->textBrowser->insertPlainText(temp)}运行程序,效果如下:可以看到,我们获取的数据并不是一次获得的。(2)利用上面的结论,我们可以让串口缓冲区拥有了一定的数据后再读取。void Widget::readMyCom(){if(myCom->bytesAvailable()>=8 )//如果可用数据大于或等于8字节再读取 { qDebug()<<“read:“<<myCom->bytesAvailable()<<”bytes” QByteArraytemp = myCom->readAll() ui->textBrowser->insertPlainText(temp) }}运行程序,效果如下:我们发送了两次数据,可以看到,这样实现了每8个字节读取一次,而最后剩余的不够8个字节的数据将会和后面的数据一起读出。然后我们将8改为3,发送一次数据,效果如下:改为7,发送两次数据,效果如下:改为11,发送两次数据,效果如下:改为17,发送三次数据,效果如下:重要结论:我们发送一次数据,应该获得37字节的数据,然后我们对比上面的结果,发现了什么?是的,其实串口每次读取8字节的数据放到缓冲区,只有数据总数小于8字节时,才会读取小于8字节的数据。为了再次验证我们的结论,我们可以将上面程序中的“>=”改为“==”,那么只有8的倍数才能读取数据(当然这里37也可以),你可以测试一下。 关于接收数据方面,可以根据你自己的需要再去进行研究和改进,这里只是抛砖引玉。二、关于发送数据。我们也可以使用函数获取要发送的数据的大小,这里有个bytesToWrite()可以获取要发送的字节数。例如将发送数据更改如下:voidWidget::on_pushButton_clicked() //发送数据{ myCom->write(ui->lineEdit->text().toAscii()) qDebug()<<“write:“<<myCom->bytesToWrite()<<”bytes”//输出要发送的字节数}运行后效果如下:当然,对于要发送的数据的大小我们不是很关心,而且它还有很多方法可以实现,这个还有个bytesWritten()信号函数来获取已经发送的数据的大小,不过好像它不是很好用。这里将它们提出来,只是供大家参考而已。第二,使用查询方式Polling来实现串口通信。这里再次说明,Polling方式是不能使用readyRead()信号的,所以我们需要自己设置定时器,来不断地读取缓冲区的数据。1.我们在widget.h中声明一个定时器对象。添加头文件包含:#include添加private变量:QTimer *readTimer2.我们在widget.cpp文件中的构造函数中更改。(1)将串口定义更改为:myCom =newWin_QextSerialPort(“COM1″,QextSerialBase::Polling)//定义串口对象,指定串口名和查询模式,这里使用Polling(2)定义定时器,并将以前的关联更改为定时器的关联。readTimer = newQTimer(this) readTimer->start(100)//设置延时为100ms connect(readTimer,SIGNAL(timeout()),this,SLOT(readMyCom()))//信号和槽函数关联,延时一段时间,进行读串口 *** 作3.此时运行程序,便可以正常收发数据了。重点:关于延时问题。上面的程序中可以进行数据的接收了,但是好像中间的延时有点长,要等一会儿才能收到数据,而且即便我们将定时器改为10ms也不行。问题在哪里呢?其实真正控制串口读写时间的不是我们的定时器,而是延时timeout。我们在构造函数中设置了延时:myCom->setTimeout(500)//延时设置,我们设置为延时500ms我们前面说延时并不起作用,那是因为是在事件驱动的情况下,一旦有数据到来就会触发readyRead()信号,所以延时不起作用。但是现在,真正控制串口读写数据间隔的就是这个函数。这里值得注意,我们现在所说的串口读写是指底层的串口读写,从上面的程序中我们也可以看到,我们每隔100ms去读串口,确切地说,应该是去读串口缓冲区。而timeout才是正真的读取串口数据,将读到的数据放入串口缓冲区。所以如果timeout时间很长,即便我们的定时器时间再短,也是读不到数据的。所以我们这里需要将timeout设置为较小的值,比如10。我们更改代码:myCom->setTimeout(10)这样再运行程序,我们就可以很快地获得数据了。关于数据接收:事件驱动那里的结论依然有用,不过这里更多的是靠读取的时间间隔来控制。关于发送数据:这时bytesToWrite()函数就不再那么好用了。第三部分 在Linux下编写串口通信程序我这里的环境是Ubuntu10.04,Qt 4.6.3和Qt Creator2.0。上面已经提到,在Linux下只能使用Polling的方式读取串口数据,所以我们将上面Windows下的应用Polling的程序在Linux下重新编译。我们使用Qt Creator打开该工程,然后进行下面的 *** 作。1.文件替换。将工程中的win_qextserialport.cpp和win_qextserialport.h文件替换成posix_qextserialport.cpp和posix_qextserialport.h文件。(1)我们先删除工程中的win_qextserialport.cpp和win_qextserialport.h文件。在工程列表中用鼠标右击win_qextserialport.h,然后选择“Remove File”选项。如下图。在d出的对话框中我们选中“Deletefile permanently”选项,确保删除了工程文件夹中的文件。如下图。然后我们使用同样的方法删除win_qextserialport.cpp文件。(2)我们按照Windows下添加文件的方法,向工程中添加posix_qextserialport.cpp和posix_qextserialport.h文件。最终工程文件列表如下。2.设置编码。(这是因为两个系统使用的默认编码不同造成的,如果你那里没有该问题,可以跳过这一步)现在我们打开widget.cpp文件,发现中文出现乱码,而且无法编辑。在编辑器最上面有一个黄色提示条和一个“SelectEncoding”按钮,我们点击该按钮。如下图。在d出的对话框中我们选择“GB2312”。按下“Reload with Encoding”按钮,中文就可以正常显示了。3.更改程序。在widget.h文件中:将以前的#include“win_qextserialport.h”更改为#include“posix_qextserialport.h”将以前的Win_QextSerialPort*myCom更改为Posix_QextSerialPort*myCom在widget.cpp文件中:将以前的myCom= newWin_QextSerialPort(“COM1″,QextSerialBase::Polling)更改为:myCom= newPosix_QextSerialPort(“/dev/ttyS0″,QextSerialBase::Polling)(这里一定要注意串口名称的写法。)4.下面我们运行程序。这时可能会出现以下提示。错误是说一个函数的调用出现了问题。我们点击该错误,定位到出错的位置,然后将那个函数中的第一个参数删除即可。如下图。5.再次运行程序,这时已经可以正常运行了。6.小结可以看到将Windows下的串口程序在Linux下重新编译是很简单的,我们只需要替换那两个文件,然后更改一下头文件包含,对象定义和串口名即可。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/9014162.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-23
下一篇 2023-04-23

发表评论

登录后才能评论

评论列表(0条)

保存