基于QT4的linux串口助手

说明:环境:ubuntu12.04
基于QT4的linux串口助手


近期网上很火的 qt编写串口通信程序全程图文详解
收到了网上的疯狂转载,上面的链接也不确定是不是原创,不过开源的东西不必追究那个原创了。
按照这个教程。调试了几天一直没有结果,最后通过一句一句的分析每天语句终于可以收到数据。
在此将本人遇到的纠结几天的问题写于此。
首先,大致按照以上教程先写出了调试程序:
---------------------------------MainWindow.cpp--------------------
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
#include


#include
#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:"<bytesAvailable()<<"bytes";
      // QByteArray temp = mycom->readAll();
     // temp ="sd";
    ui->textBrowser->insertPlainText(temp);//显示在文本浏览器中
 }





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


#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include
#include"posix_qextserialport.h"



#include


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界面图形截图(调试部分)---------------------------------------------------------------------
基于QT4的linux串口助手

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


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

波特率为4800,无奇偶校检,8个数据位,无数据流控制,一位停止位,串口名字为ttyUSB0;
关于对串口的名称的查询可以,在插入但单片机的usb线后,在终端输入$dmesg | grep tty*
效果图如:

基于QT4的linux串口助手

当出现提示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串口助手


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

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


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



这才发现原来是普通用户木有权限打开串口,输入$sudo chmod 666/dev/ttyUSB0,修改完属性你会就可一打开了。
接下来就可一分析程序了。
读取串口的方式有两种:由于QueryMode,有两种值Polling(查询方式polling,linux支持该模式)和EventDriven(事件驱动方式)win两种模式均识别,具体可以参考一博客 Qt串口编程出错问题解决 
使用polling模式就要参考使用qt的定时器使用QTimer,详细参见 qt中定时器Timer的使用 弄好之后就万事具备,只欠调试。
因为代码比较简单,文本中也有注释,不再说明,只是加入想增加读取频率的话只是修改qextserialbase.cpp文件中的第68行即可,在这里改写时间就是扫描的时间。效果如图 基于QT4的linux串口助手

在这个基础上就可增加新的功能了,本人做的效果如图:
基于QT4的linux串口助手




因还没做进一步测试,等测试完成代码会上传csdn文档下载中,在这里有本人在网上下载的别人写的forwindows的串口代码
到时一起共享。
说明:本人作为初学者。错误之处在所难免。望大家指出。因文化总有各种超链接,直接复制可能会失去超链接。请参考。本人博客http://blog.sina.com.cn/u/2098080273
  邮箱:[email protected]    
 2012 11.17 


你可能感兴趣的:(Qt)