当前位置:编程学习 > wap >>

一个关于串口的程序在linux和windows下表现不同,求助

定义了一个串口类,这个串口类不光在主线程中使用,也会在很多次线程中使用,为了不多次创建对象,于是我使用了单件模式

//can.h
class CAN : public QObject
{
  Q_OBJECT
public:
    static CAN& instance();
    ~CAN();
    void openSerialPort(const QString &port);
protected:
    CAN(QObject *parent = 0);
private:
    QSerialPort *m_SerialPort;
}



//can.cpp
CAN::CAN(QObject *parent)
    : QObject(parent),
      m_SerialPort(NULL)
{
}
CAN &CAN::instance()
{
    static CAN instance;
    return instance;
}
CAN::~CAN()
{
    if (m_SerialPort != NULL)
    {
        if (m_SerialPort->isOpen())
        {
            m_SerialPort->close();
        }
        delete m_SerialPort;
    }
}
void CAN::openSerialPort(const QString &port)
{
    if (m_SerialPort != NULL)
    {
        m_SerialPort->close();
        qDebug() << QString("Port %1 closed.").arg(m_SerialPort->portName());
        delete m_SerialPort;
    }
    m_SerialPort = new QSerialPort();
    m_SerialPort->setPortName(port);
    m_SerialPort->setBaudRate(QSerialPort::Baud9600, QSerialPort::AllDirections);
    m_SerialPort->setDataBits(QSerialPort::Data8);
    m_SerialPort->setParity(QSerialPort::NoParity);
    m_SerialPort->setStopBits(QSerialPort::OneStop);
    m_SerialPort->setFlowControl(QSerialPort::NoFlowControl);
    if (!open())
    {
        qDebug() << QString("Open port %1 failed, please check!").arg(m_SerialPort->portName());
        return;
    }
    qDebug() << QString("(CAN Module)Port %1 opened!").arg(m_SerialPort->portName());
    connect(m_SerialPort, SIGNAL(readyRead()), this, SLOT(readSerialPort()));
}

以上是部分串口类代码,在主线程或者其他次线程中使用CAN::instance()来使用串口,但是发现一个问题,在linux中,在次线程中使用没有问题,下位机也能正常工作,但是在windows中次线程中使用串口,都没有反馈,下位机也不工作,并提示错误
QWinEventNotifier: event notifiers cannot be enabled from another thread

请教各位大神,为什么同样的代码在不同平台会有这么大的差异,还有我这样主线程和不同次线程中使用串口类的方法是否正确 串口 多线程 --------------------编程问答-------------------- 串口使用的是qt5.1中qt自带的 --------------------编程问答-------------------- 没有人给点意见吗 --------------------编程问答-------------------- 不用多开线程吧,没个串口应该都自带一个线程的。
后台肯定在一直读串口数据,有数据了才触发readReady,Qt的IODevice大多这样。
感觉应该不用在开线程 --------------------编程问答--------------------
引用 3 楼 haltwang 的回复:
不用多开线程吧,没个串口应该都自带一个线程的。
后台肯定在一直读串口数据,有数据了才触发readReady,Qt的IODevice大多这样。
感觉应该不用在开线程

我试试不开线程的做法,但是linux可以windows就不可以了,这有点奇怪 --------------------编程问答-------------------- 串口程序先用虚拟串口测试软件是否有问题,再硬件实际测试 --------------------编程问答--------------------
引用 5 楼 haltwang 的回复:
串口程序先用虚拟串口测试软件是否有问题,再硬件实际测试

虚拟串口测试软件是什么呢 --------------------编程问答-------------------- windows下我用的Configure Virtual Serial Port Driver
补充:移动开发 ,  Qt
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,