您的位置:首页 > 运维架构 > Linux

基于QT4的linux串口助手

2015-07-28 09:46 218 查看
说明:环境:ubuntu12.04

基于QT4的linux串口助手

近期网上很火的qt编写串口通信程序全程图文详解

收到了网上的疯狂转载,上面的链接也不确定是不是原创,不过开源的东西不必追究那个原创了。

按照这个教程。调试了几天一直没有结果,最后通过一句一句的分析每天语句终于可以收到数据。

在此将本人遇到的纠结几天的问题写于此。

首先,大致按照以上教程先写出了调试程序:

---------------------------------MainWindow.cpp--------------------

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include <QtGui>

#include <QAction>

#include <QSharedMemory>

#include<QTimer>

#include"qextserialport.h"

MainWindow::MainWindow(QWidget *parent) :

QMainWindow(parent), ui(new Ui::MainWindow)

{

ui->setupUi(this);//初始化

mycom=new Posix_QextSerialPort( "/dev/ttyUSB0" ,QextSerialBase::Polling);//定义串口,传递参数,初始化串口,这句在linux下定义的"/dev/ttyS0"

mycom->open(QIODevice::ReadWrite);//以读写方式打开串口

mycom->setBaudRate(BAUD4800);

mycom->setDataBits(DATA_8);

mycom->setParity(PAR_NONE);

mycom->setStopBits(STOP_1);

mycom->setFlowControl(FLOW_OFF);//设置数据流控制,我们使用无数据流控制的默认设置

// mycom->setTimeout(500);

QTimer *readTimer=newQTimer(this);//定时器关联

//readTimer->setSingleShot(false) ;

readTimer->start(1);//延时100ms

// QObject::connect (readTimer,SIGNAL(timeout()),this,SLOT(readMyCom));

QObject::connect (readTimer,SIGNAL(timeout()), this,SLOT(readMyCom() ) ) ;

//ui->textBrowser->insertPlainText("ClosingProfiler\n");//显示在文本浏览器中

}

MainWindow::~MainWindow()

{

deleteui;

}

void MainWindow::readMyCom()//读串口函数

{

QByteArray temp=mycom->readAll();

//读取变量

// QString tmp;

// if(ui->checkBox_2->isChecked())//十六进制显示

/////// tmp = BgComm::ByteArrayToHexString(temp);

// else

// tmp = QString(temp);

//ui->textBrowser->insertPlainText(tmp);//显示在文本浏览器中

// temp=40;

// qWarning("read!");

// qDebug() << "read:"<<mycom->bytesAvailable()<<"bytes";

// QByteArray temp = mycom->readAll();

// temp ="sd";

ui->textBrowser->insertPlainText(temp);//显示在文本浏览器中

}

---------------------------------------------------MainWindow.h-----------------------------------------

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include <QtGui/QMainWindow>

#include"posix_qextserialport.h"

#include<QTimer>

namespace Ui

{

classMainWindow;

}

class MainWindow : public QMainWindow

{

Q_OBJECT

public:

explicitMainWindow(QWidget *parent =0);//explicit可以有效的防止构造函数的隐式转换带来的错误或者误解

~MainWindow();

private:

Ui::MainWindow *ui;

Posix_QextSerialPort *mycom;//声明对象

QTimer *readTimer;

private slots:

void readMyCom();//声明读串口槽函数

};

#endif // MAINWINDOW_H

-------------------------------j界面图形截图(调试部分)---------------------------------------------------------------------





在此本人为了简单起见,只是选择文本浏览器textBrowser显示数据木有发送数据

本人是通过stc89c51通过pl2303,usb转串口与电脑的usb口相链接

波特率为4800,无奇偶校检,8个数据位,无数据流控制,一位停止位,串口名字为ttyUSB0;

关于对串口的名称的查询可以,在插入但单片机的usb线后,在终端输入$dmesg | grep tty*

效果图如:





当出现提示usb 2-1.1: pl2303 converter now attached to ttyUSB0

表明链接成功,当然也可能是ttyusb1,ttys0,ttys1,等等;

假如还不明白可以参考:如何查看linux下串口是否可用?串口名称等?和ubuntu
usb转串口设置

接下来就可以编译代码测试了

在测试之前,最好能用别人写好的串口进行验证,确保电脑可以正确的接受到单片机发来的数据。

在此本人推荐连个串口工具cutecom,安装方法就是在终端输入$sudo apt-get installcutecom,或者直接在unbuntu软件中心输入cutecom进行安装也是不叫方便的。等安装完成后,运行$sudocutecom(注意是小写字母)选择相应的串口即可,打开后会发现,cutecom本地就只是有ttyS0--ttyS3,其实你选择端口选择工具条进行手动输入就好,效果如图





此外还可一安装minicom,具体可以参见Linux下minicom的配置和使用方法,配置完成后就可以测试你的程序了。

。。。

等等。还有个问题,假如你是在桌面直接打开cutecom,你会发现明明终端显示串口已经链接但是仍然提示“could not open/dev/ttyusb0”,效果如图:



出现这个的原因但是很纳闷。不过进入输入 ls -l /dev/tty*,或者输入 ls-l /dev/ttyUSB0,看其属性



这才发现原来是普通用户木有权限打开串口,输入$sudo chmod 666/dev/ttyUSB0,修改完属性你会就可一打开了。

接下来就可一分析程序了。

读取串口的方式有两种:由于QueryMode,有两种值Polling(查询方式polling,linux支持该模式)和EventDriven(事件驱动方式)win两种模式均识别,具体可以参考一博客Qt串口编程出错问题解决

使用polling模式就要参考使用qt的定时器使用QTimer,详细参见qt中定时器Timer的使用 弄好之后就万事具备,只欠调试。

因为代码比较简单,文本中也有注释,不再说明,只是加入想增加读取频率的话只是修改qextserialbase.cpp文件中的第68行即可,在这里改写时间就是扫描的时间。效果如图



在这个基础上就可增加新的功能了,本人做的效果如图:





因还没做进一步测试,等测试完成代码会上传csdn文档下载中,在这里有本人在网上下载的别人写的forwindows的串口代码

到时一起共享。

说明:本人作为初学者。错误之处在所难免。望大家指出。因文化总有各种超链接,直接复制可能会失去超链接。请参考。本人博客http://blog.sina.com.cn/u/2098080273

邮箱:woshidahuaidan2011@hotmail.com

2012 11.17

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: