友善之臂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学长表达我的谢意,谢谢学长一直以来如师如友一般对我的照顾。