Baldwin 发表于 2016-4-27 16:08:06

i.max283基于Qt5实现串口收发

最近将板子上的Qt版本升级到了Qt5,基于原生库实现了串口收发

1、对串口进行参数配置
2、打开了一个定时器,每3S发送一条命令
3、使用信号与槽机制,将收到的数据打印

//---------------mainwindow.cpp
#define DefaultPortName "/dev/ttySP0"
#define DefaultBaud   BAUD115200

MainWindow::MainWindow(QObject *parent) : QObject(parent)
{

}

MainWindow::~MainWindow()
{
    pMSerialPort->deleteLater();
    delete(readMeterTimer);
}

void MainWindow::show(void)
{
    ////////////串口初始化
    if(SerialPortInit())
    {
      qDebug() << "Open SerialPort OK";
    }
    else
    {
      qDebug() << "Open SerialPort Error";
    }
    ////////////定时器初始化
    PollTimerInit();
}

bool MainWindow::SerialPortInit(void)
{
    pMSerialPort = new MSerialPort(DefaultPortName);

    pMSerialPort->MSerialsetBaudRate(QSerialPort::Baud115200);
    pMSerialPort->MSerialsetDataBits(QSerialPort::Data8);
    pMSerialPort-> MSerialsetParity(QSerialPort::NoParity);
    pMSerialPort->MSerialsetStopBits(QSerialPort::OneStop);

    if(!pMSerialPort->MSerialPortOpen())
    {
      pMSerialPort->deleteLater();
      pMSerialPort= NULL;
      return false;
    }
    else
    {
      connect(pMSerialPort,SIGNAL(SignalRxTimeout()),this,SLOT(SlotSerialPortRx()));
      return true;
    }
}

void MainWindow::SerialPortClose()
{
    pMSerialPort->MSerialPortClose();
}

void MainWindow::SlotSerialPortRx(void)
{
    char rxBuf;
    int rxBufLen = 0;

    rxBufLen = pMSerialPort->MSerialPortRead(rxBuf,256);
    qDebug() << "Receive Data " << rxBufLen;
    SerialPortConsoleBufLen(rxBuf,rxBufLen);

}

quint64 MainWindow::SerialPortWrite(char *str)
{
    return pMSerialPort->MSerialPortWrite(str,strlen(str));
}

void MainWindow::SerialPortRead()
{   

}

void MainWindow::SerialPortConsoleBufLen(char *buf,int buflen)
{
    QString strText="";
    int i;

    for(i=0;i<buflen;i++)
    {
      strText += QString("%1 ").arg(buf,2,16,QChar('0'));
    }
    strText = strText.toUpper();
    qDebug() << strText;
}

void MainWindow::PollTimerInit(void)
{
    readMeterTimer = new QTimer();
    readMeterTimer->start(3000);
    connect(readMeterTimer,SIGNAL(timeout()),this,SLOT(SlotReadMeter()));
}

void MainWindow::SlotReadMeter(void)
{
    qDebug() << "Hello PC";
    qDebug() << SerialPortWrite((char*)"Hello Pc");
}

//---------------mainwindow.h
#include <QObject>
#include <QDebug>
#include <QTimer>
#include "mserialport.h"

class MainWindow : public QObject
{
    Q_OBJECT
public:
    explicit MainWindow(QObject *parent = 0);
    ~MainWindow();
    void show(void);

    bool SerialPortInit(void);
    void SerialPortOpen();
    void SerialPortClose();
    quint64 SerialPortWrite(char *str);
    void SerialPortRead();
    void SerialPortConsoleBufLen(char *buf,int buflen);

    void PollTimerInit(void);
private:
    QTimer* readMeterTimer;
    QTimer *pollTimer,*waitForAckTimer,*intervalTimer;
    MSerialPort *pMSerialPort;
signals:

public slots:
    void SlotSerialPortRx(void);
    void SlotReadMeter(void);
};

工程文件见附件

donglaile 发表于 2016-5-14 14:29:23

用Qserialport或者QextSerialport写,会比较好移植{:smile:}

Baldwin 发表于 2016-5-16 11:19:47

donglaile 发表于 2016-5-14 14:29
用Qserialport或者QextSerialport写,会比较好移植

底层就是用QSerialPort写的啊

Excellence 发表于 2016-5-17 16:35:38

我也写了一个简单的串口助手。

ywlzh 发表于 2016-5-22 21:55:01

不错,正好我最近也买了IMX287,可以跟着一起学习

308594151 发表于 2016-5-23 10:37:30

mark一下

qq开始学单片机 发表于 2016-9-3 09:35:24

新建qmake的时候提示如下,请问一下楼主知道如何解决吗?
页: [1]
查看完整版本: i.max283基于Qt5实现串口收发