基于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
基于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
相关文章推荐
- SecureCRT下Linux上传下载之rz ,sz 命令
- Linux学习2_Vim命令总结及解释
- 嵌入式Linux开发教程:Linux常见命令(上篇)
- linux expect 用法小记
- linux中date的用法总结
- Linux多线程编程小结
- Linux下"无法执行SCP开始传输"解决方法
- 浅谈 Linux 的 C# 开发环境
- linux 防火墙设置
- Arch Linux 安装 Virtualbox 4.2.0 备忘录
- Arch Linux 安装配置备忘录
- Linux jdk安装与卸载
- centos卸载默认JDK
- centos卸载默认JDK安装新的JDK
- centos非root用户(普通用户)安装rpm包
- Linux-命令-1
- linux性能分析命令-扫盲贴
- Linux 运维工程师入门须掌握的 10 个技术点
- 常用Linux Shell进阶部分小结
- opensuse linux环境下ibm_websphere和ibm_db2安装以及DB2数据迁移操