]求高人指点。我小小的修改了手册中的串口助手程序,用Qt SDK编写的。编译都没问题,就是在开发板的QT界面打开的时候会跳出“Fail to open serial port!”错误窗口。
通过调试判断是 open()函数返回的句柄有问题,即fd<0。不知道是什么原因,麻烦各位不吝赐教。
以下贴出我的QT代码:
//头文件,"widget.h"
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <qsocketnotifier.h>
#include <QMessageBox>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
private slots:
void on_pushButton_clicked();
void remoteDataIncomimg();
private:
Ui::Widget *ui;
int openSerialPort();
int m_fd;
QSocketNotifier *m_notifier;
//QMessageBox msgWarning;
};
#endif // WIDGET_H
//"widget.cpp"文件
#include "widget.h"
#include "ui_widget.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>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
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(remoteDataIncomimg()));
}
Widget::~Widget()
{
if(m_notifier)
{
delete m_notifier;
m_notifier = 0;
}
if(m_fd>=0)
{
::close(m_fd);
m_fd = -1;
}
delete ui;
}
void Widget::on_pushButton_clicked()
{
/* QString text(ui->m_sendEdit->text());
if(text.isEmpty())
{
return;
}
::write(m_fd,text.toLatin1(),text.length());//在项目中不会用到toLatin1函数,只需要定义一个char数组就行了
// char str[]=1;
ui->m_sendEdit->setText("");*/
char c=0x01;
::write(m_fd,&c,1);
}
int Widget::openSerialPort()
{
int fd = -1;
const char *devName = "dev/ttySAC2";
fd = ::open(devName,O_RDWR|O_NONBLOCK);
if(fd<0)
{
return -1;
}
//linux通常使用termios结构存储串口参数;
/*
termios serialAttr;
memset(&serialAttr,0,sizeof serialAttr);
serialAttr.c_iflag = IGNPAR;
serialAttr.c_cflag = B9600 | HUPCL | CS8 | CREAD | CLOCAL;
serialAttr.c_cc[VMIN] = 1;*/
termios serialAttr;
tcgetattr(fd,&serialAttr);
tcflush(fd,TCIOFLUSH);
cfsetispeed(&serialAttr,B9600);
cfsetospeed(&serialAttr,B9600);
serialAttr.c_cflag &= ~CSIZE;
serialAttr.c_cflag |= CS8;
serialAttr.c_cflag |= CLOCAL | CREAD;
serialAttr.c_cflag &= ~PARENB;
serialAttr.c_iflag &= ~INPCK;
serialAttr.c_cflag &= ~CSTOPB;
serialAttr.c_cc[VMIN] = 1;
if (tcsetattr(fd, TCSANOW, &serialAttr) != 0)//TCSANOW表示立即生效
{
return -1;
}
tcflush(fd,TCIOFLUSH);
return fd;
}
void Widget::remoteDataIncomimg()
{
char c;
if(read(m_fd,&c,sizeof(c))!=1)
{
QMessageBox::warning(this,tr("Error"),tr("Recieve error!"));
return;
}
ui->m_receiveEdit->insert(QString(QChar(c)));//把接收到的字符转换成整形,然后再进行判断。
}
//”main.cpp“文件#include <QtGui/QApplication>
#include "widget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}