基于QT界面和tiny6410的串口助手程序

友善之臂tiny6410手册中的串口助手开发部分有一些错误,在这里我把更改后的程序贴出来。
亲测可用,而且稳定性好比较好。

这是dialog.h的源代码

#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>
#include <qsocketnotifier.h>
namespace Ui {
    class Dialog;
}

class Dialog : public QDialog
{
    Q_OBJECT

public:
    explicit Dialog(QWidget *parent = 0);
    ~Dialog();
private:
        int openSerialPort();
        QString unicodeToString(QString str);

        QString stringToUnicode(QString str);
private slots:
        void on_m_sendButton_clicked();
        void remoteDataIncoming();
private:
        int m_fd;
        QSocketNotifier *m_notifier;
private:
    Ui::Dialog *ui;
};

#endif // DIALOG_H

dialog.cpp源程序

#include "dialog.h"
#include "ui_dialog.h"

#include <qtextedit.h>
#include <qprogressbar.h>
#include <qtimer.h>
#include <qapplication.h>
#include <qmessagebox.h>
#include <qstringlist.h>

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/fs.h>
#include <errno.h>
#include <string.h>
#include <termio.h>
Dialog::Dialog(QWidget *parent) :
    QDialog(parent),

    ui(new Ui::Dialog)
{
    ui->setupUi(this);
    m_fd = openSerialPort();
    if (m_fd < 0) {
            QMessageBox::warning(this, tr("Error"), tr("Fail to open serial port!"));
            return ;
    }

    m_notifier = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);
    connect (m_notifier, SIGNAL(activated(int)), this, SLOT(remoteDataIncoming()));

}



Dialog::~Dialog()
{
    delete ui;
    if (m_notifier) {
        delete m_notifier;
        m_notifier = 0;
    }

    if (m_fd >= 0) {
        ::close(m_fd);
        m_fd = -1;
    }
}



int Dialog::openSerialPort()
{
        int fd = -1;

        const char *devName = "/dev/ttySAC3";
        fd = ::open(devName, O_RDWR|O_NONBLOCK);
        if (fd < 0) {
                return -1;
        }

        termios serialAttr;
        memset(&serialAttr, 0, sizeof serialAttr);
        serialAttr.c_iflag = IGNPAR;
        serialAttr.c_cflag = B115200 | HUPCL | CS8 | CREAD | CLOCAL;
        serialAttr.c_cc[VMIN] = 1;
        if (tcsetattr(fd, TCSANOW, &serialAttr) != 0) {
                return -1;
        }
        return fd;
}


void Dialog::remoteDataIncoming()
{
        char c;

        if (read(m_fd, &c, sizeof c) != 1) {
                QMessageBox::warning(this, tr("Error"), tr("Receive error!"));
                return;
        }

        ui->m_receiveEdit->setText(ui->m_receiveEdit->toPlainText()+c);
}

void Dialog::on_m_sendButton_clicked()
{
// QString a;
// char b[50],i=0;

// for(i=0;i<50;i++)
// {
// b[i]=i;

// }
// a=unicodeToString(b);
// ::write(m_fd,b, 50);
    QString text( ui->m_sendEdit->toPlainText());
    if (text.isEmpty()) {
            return ;
    }
    ::write(m_fd, text.data(), 2*text.length());// 经实验 得读取到的长度乘2才能收得全
    //ui->m_sendEdit->setText("");
  // stringToUnicode(a)



}

main.cpp的代码

#include <QtGui/QApplication>
#include "dialog.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();

    return a.exec();
}

程序的讲解在tiny6410的《Mini6410 Qt4和Qtopia编程开发指南》手册中可以看到,这本手册从网上或者从tiny6410自带的光盘中能得到。

如果有空我会过段时间贴出原串口程序的错误地方,其实对照着上面程序就可以轻松的找到问题所在。

最后向更正程序的LY学长表达我的谢意,谢谢学长一直以来如师如友一般对我的照顾。

你可能感兴趣的:(qt,6410,串口助手)