主题 : 手册中的串口助手程序移植过程出现问题了! 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 63326
精华: 0
发帖: 21
金钱: 105 两
威望: 21 点
综合积分: 42 分
注册时间: 2012-02-17
最后登录: 2013-03-15
楼主  发表于: 2012-02-28 00:19

 手册中的串口助手程序移植过程出现问题了!

]求高人指点。我小小的修改了手册中的串口助手程序,用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();
}


级别: 新手上路
UID: 63326
精华: 0
发帖: 21
金钱: 105 两
威望: 21 点
综合积分: 42 分
注册时间: 2012-02-17
最后登录: 2013-03-15
1楼  发表于: 2012-02-28 12:08
之前编译了一个用挂载的方式成功,没啥问题,现在这个放进去就有问题了。原来的和现在的这个都是用串口2的。原来的那个已删除。
级别: 新手上路
UID: 72065
精华: 0
发帖: 11
金钱: 55 两
威望: 11 点
综合积分: 22 分
注册时间: 2012-06-14
最后登录: 2017-09-13
2楼  发表于: 2012-08-01 11:24
dev/ttySAC2串口设置不对ttySAC2