说明:环境: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) :
{
//
}
MainWindow::~MainWindow()
{
}
---------------------------------------------------MainWindow.h-----------------------------------------
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtGui/QMainWindow>
#include"posix_qextserialport.h"
#include<QTimer>
namespace Ui
{
}
class MainWindow : public QMainWindow
{
public:
private:
private slots:
};
#endif // MAINWINDOW_H
-------------------------------j界面图形截图(调试部分)---------------------------------------------------------------------
![基于QT4的linux串口助手 基于QT4的linux串口助手](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
在此本人为了简单起见,只是选择文本浏览器textBrowser显示数据木有发送数据
本人是通过stc89c51通过pl2303,usb转串口与电脑的usb口相链接
波特率为4800,无奇偶校检,8个数据位,无数据流控制,一位停止位,串口名字为ttyUSB0;
关于对串口的名称的查询可以,在插入但单片机的usb线后,在终端输入$dmesg | grep tty*
效果图如:
![基于QT4的linux串口助手 基于QT4的linux串口助手](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
当出现提示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,其实你选择端口选择工具条进行手动输入就好,效果如图
。
![基于QT4的linux串口助手 基于QT4的linux串口助手](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
此外还可一安装minicom,具体可以参见 Linux下minicom的配置和使用方法,配置完成后就可以测试你的程序了。
。。。
等等。还有个问题,假如你是在桌面直接打开cutecom,你会发现明明终端显示串口已经链接但是仍然提示“could not open/dev/ttyusb0”,效果如图:
![基于QT4的linux串口助手 基于QT4的linux串口助手](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
![基于QT4的linux串口助手 基于QT4的linux串口助手](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
这才发现原来是普通用户木有权限打开串口,输入$sudo chmod 666/dev/ttyUSB0,修改完属性你会就可一打开了。
接下来就可一分析程序了。
读取串口的方式有两种:由于QueryMode,有两种值Polling(查询方式polling,linux支持该模式)和EventDriven(事件驱动方式)win两种模式均识别,具体可以参考一博客 Qt串口编程出错问题解决
使用polling模式就要参考使用qt的定时器使用QTimer,详细参见 qt中定时器Timer的使用 弄好之后就万事具备,只欠调试。
因为代码比较简单,文本中也有注释,不再说明,只是加入想增加读取频率的话只是修改qextserialbase.cpp文件中的第68行即可,在这里改写时间就是扫描的时间。效果如图
![基于QT4的linux串口助手 基于QT4的linux串口助手](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
在这个基础上就可增加新的功能了,本人做的效果如图:
![基于QT4的linux串口助手 基于QT4的linux串口助手](https://i-blog.csdnimg.cn/blog_migrate/a4c26d1e5885305701be709a3d33442f.gif)
因还没做进一步测试,等测试完成代码会上传csdn文档下载中,在这里有本人在网上下载的别人写的forwindows的串口代码
到时一起共享。
说明:本人作为初学者。错误之处在所难免。望大家指出。因文化总有各种超链接,直接复制可能会失去超链接。请参考。本人博客http://blog.sina.com.cn/u/2098080273