串口通信 收发数据

自己封装的串口类   接收那也一块设置的接口    自己已经测试过

头文件

#ifndef SETSERIALPORT_H
#define SETSERIALPORT_H


#include <QObject>
#include <QString>
#include <QSerialPort>
#include <QByteArray>
#include <QDebug>


class SetSerialPort : public QObject
{
    Q_OBJECT
public:
    explicit SetSerialPort(QObject *parent = 0);
    ~SetSerialPort();


    int getBaud() const;
    QString getPortName() const;
    int getDataBits() const;
    int getParityBits() const;
    int getStopBits() const;


    void setBaudType(int baud);
    void setPortNameType(QString portName);
    void setDataBitsType(int dataBits);
    void setParityBitsType(int parityBits);
    void setStopBitsType(int stopBits);


    void openSerialPort();
    void sendDatas(QByteArray);
    QByteArray recvDatas();
    void closeType();


    // 字符串处理
    char ConvertHexChar(char ch);
    void String2Hex(QString str, QByteArray &senddata);


signals:


public slots:


private:
    int m_baud;
    QString m_portName;
    QSerialPort::DataBits m_dataBits;
    QSerialPort::Parity m_parityBits;
    QSerialPort::StopBits m_stopBits;


    QSerialPort* comSerialPort;
};


#endif // SETSERIALPORT_H



源文件

#include "setserialport.h"
#include <QMessageBox>


SetSerialPort::SetSerialPort(QObject *parent) :
    QObject(parent)
{
        comSerialPort = new QSerialPort();
}


SetSerialPort::~SetSerialPort()
{
}


void SetSerialPort::setBaudType(int baud)
{
    m_baud = baud;
}


void SetSerialPort::setPortNameType(QString portName)
{
    m_portName = portName;
}


void SetSerialPort::setDataBitsType(int dataBits)
{
    m_dataBits = (QSerialPort::DataBits)dataBits;
}


void SetSerialPort::setParityBitsType(int parityBits)
{
    m_parityBits = (QSerialPort::Parity)parityBits;
}


void SetSerialPort::setStopBitsType(int stopBits)
{
    m_stopBits = (QSerialPort::StopBits)stopBits;
}


//void SetSerialPort::setRecvDataArray(QByteArray rvDatas)
//{
//    recvDataArray = rvDatas;
//}






// get the value of the class
int SetSerialPort::getBaud() const
{
    return m_baud;
}


QString SetSerialPort::getPortName() const
{
    return m_portName;
}


int SetSerialPort::getDataBits() const
{
    return m_dataBits;
}


int SetSerialPort::getParityBits() const
{
    return m_parityBits;
}


int SetSerialPort::getStopBits() const
{
    return m_stopBits;
}




void SetSerialPort::openSerialPort()
{
    comSerialPort->setPortName(m_portName);
    comSerialPort->setBaudRate(m_baud);
    comSerialPort->setDataBits(m_dataBits);
    comSerialPort->setParity(m_parityBits);
    comSerialPort->setStopBits(m_stopBits);
    comSerialPort->setFlowControl(QSerialPort::NoFlowControl);


    if(!comSerialPort->open(QIODevice::ReadWrite))
    {
        QMessageBox::information(0,tr("Notice:"),tr("SerialPort open failed!"));
    }
}


// 发送16进制的数据
void SetSerialPort::sendDatas(QByteArray senddatas)
{
    if(comSerialPort->isOpen())
    {
//        qDebug()<<tr("serialPort sendDatas:")<<sendDataArray;
        int rest = comSerialPort->write(senddatas);
        if(rest == -1)
        {
            QMessageBox::information(0,tr("Error"),tr("serialPort send datas Error!"));
        }
    }
}


// 接收
QByteArray SetSerialPort::recvDatas()
{
    QByteArray recvDataArray = comSerialPort->readAll();
    qDebug()<<tr("serialPort recvDatas:")<<recvDataArray;


    return recvDataArray;
}


void SetSerialPort::closeType()
{
    if(comSerialPort->isOpen())
    {
        comSerialPort->close();
    }
}


//检测一个字符是不是十六进制字符,若是返回相应的值,否则返回0x10;
 char SetSerialPort::ConvertHexChar(char ch)
 {
     if((ch >= '0') && (ch <= '9'))
         return ch-0x30;
     else if((ch >= 'A') && (ch <= 'F'))
         return ch-'A'+10;
     else if((ch >= 'a') && (ch <= 'f'))
         return ch-'a'+10;
     else return (-1);
 }


//将一个字符串作为十六进制串转化为一个字节数组,字节间可用空格分隔,返回转换后的字节数组长度,同时字节数组长度自动设置。
void SetSerialPort::String2Hex(QString str, QByteArray &senddata)
   {
        int hexdata,lowhexdata;
        int hexdatalen = 0;
        int len = str.length();
        qDebug()<<tr("要转换的长度")<<len;//计算数据长度


        senddata.resize(len/2);
        char lstr,hstr;
        for(int i=0; i<len; )
        {
            //char lstr,
            hstr=str[i].toLatin1();
            if(hstr == ' ')
            {
                i++;
                continue;
            }


            i++;
            if(i >= len)
                break;


            lstr = str[i].toLatin1();
            hexdata = ConvertHexChar(hstr);
            lowhexdata = ConvertHexChar(lstr);
            if((hexdata == 16) || (lowhexdata == 16))
                break;
            else
                hexdata = hexdata*16+lowhexdata;
            i++;
            senddata[hexdatalen] = (char)hexdata;
            hexdatalen++;
        }


        senddata.resize(hexdatalen);
        qDebug()<<"转换数据已结束";//
}



转载请表明出处

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值