QT串口2--控制GSM模块的使用

1、首先介绍下所用的gsm模块,YYROBOT_SIM800C 模块是一款高性能高性价比工业级的 GSM/GPRS 模块(开发板)。本模块采用 SIMCOM 公司的工业级四频 850/900/1800/1900MHz SIM800 芯片, 可以低功耗实现语音、SMS、数据和传真信息的传输。

注: SIM800 支持 4 频,通俗讲就是可以全球使用,而老版本的 SIM900A 仅支持双频,只能大陆使用。

2、QT串口程序设计:基于QT串口1的修改点击打开链接

3、程序:.h文件

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void on_openportButton_clicked();
    void read_Com();
    void on_sendButton_clicked();
    void on_clearpushButton_clicked();


    void QStringtoHex(QByteArray& sendData,QString str);
    char ConvertHexChar(char ch);

    
    void on_msgButton_clicked();

    void on_pushButton_clicked();

    void on_pushButton_2_clicked();


private:
    Ui::Widget *ui;
    QSerialPort serial;			//声明串口类

    //QByteArray  sendData;
};

#endif // WIDGET_H

.cpp文件

#include "widget.h"
#include "ui_widget.h"
#include<QMessageBox>
#include <QThread>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);


}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_openportButton_clicked()
{
    if(ui->portNameComboBox->isEnabled())
        {
            ui->openportButton->setText("ClosePort");		//按下“OpenPort”后,按键显示为“ClosePort”
            ui->portNameComboBox->setDisabled(true);	//按下“OpenPort”后,禁止再修改COM口
            serial.setPortName(ui->portNameComboBox->currentText());	//设置COM口
            serial.setBaudRate(QSerialPort::Baud9600,QSerialPort::AllDirections);//设置波特率和读写方向
            serial.setDataBits(QSerialPort::Data8);		//数据位为8位
            serial.setFlowControl(QSerialPort::NoFlowControl);//无流控制
            serial.setParity(QSerialPort::NoParity);	//无校验位
            serial.setStopBits(QSerialPort::OneStop);	//一位停止位
            serial.close();					//先关串口,再打开,可以保证串口不被其它函数占用。
            if(serial.open(QIODevice::ReadWrite))		//以可读写的方式打开串口
            {
                connect(&serial,SIGNAL(readyRead()),this,SLOT(read_Com()));	//把串口的readyRead()信号绑定到read_Com()这个槽函数上
                
            }
        } else {
            ui->openportButton->setText("OpenPort");		//按下“ClosePort”后,按键显示为“OpenPort”
            ui->portNameComboBox->setEnabled(true);		//按下“ClosePort”后,COM口可被修改
            serial.close();					//关串口
        }
}
void Widget::read_Com()
{
    QByteArray temp=serial.read(1);//在缓冲区中读一个byte
    if(!temp.isEmpty())//如果读到的数据不为空
    {
    ui->recvTextEdit->insertPlainText("0x");
    ui->recvTextEdit->insertPlainText(temp.toHex());//显示接收到的数据的十六进制
    ui->recvTextEdit->insertPlainText(" ");
    }
}



void Widget::on_sendButton_clicked()
{
    //ui->ASCIIcheckBox->setChecked(true);
    //  ui->HexcheckBox->setChecked(true);
   // ui->newlinecheckBox->setChecked(true);
     //发送ASCII字符
     if(ui->ASCIIcheckBox->isChecked())
     {
         QString sendData= ui->sendEdit->toPlainText().toLatin1();//以ASCII码的形式通过串口发送出去。
         QByteArray send;
         sendData += "\r\n";
         send=sendData.toLatin1();
         serial.write(send);

     }
     //发送16进制字符
         else if(ui->HexcheckBox->isChecked())
         {
             //读取要发送的数据
             QString sendData = ui->sendEdit->toPlainText().toLatin1();
             //是否显示发送消息
            // displaysend(sendData);
            // HexToString
             QByteArray sendbuff;
             //方法一
             //QStringtoHex(sendbuff,sendData);
             //方法二
             sendData +="\r\n";
             sendbuff = QByteArray::fromHex(sendData.toLatin1().data());
             serial.write(sendbuff);
         }


}

void Widget::on_msgButton_clicked()
{

    QString moshi="AT+CSCS='GSM'"; 
    QByteArray send;
    moshi += "\r\n";
    send=moshi.toLatin1();
    serial.write(send); 
    QThread::msleep( 1000 );// 休息1秒
    //QString wenben=' AT+CMGF=1"\r\n"';
    //QString haoma='AT+CMGS="18053301936""\r\n"';
    //QString xinxi= 'ROBOT"\r\n"';

    QString wenben= "AT+CMGF=1";
    QByteArray send1;
     wenben += "\r\n";
    send1=wenben.toLatin1();
    serial.write(send1);
    QThread::msleep( 1000 );// 休息1秒

   /*QString haoma="AT+CMGS='18053301936'";
    ui->sendEdit->setPlainText("haoma");//以ASCII码的形式通过串口发送出去。
    haoma += "\r\n";
    QByteArray send2;
    send2=haoma.toLatin1();
    serial.write(send2);
    ui->sendEdit->clear();
*/

}



void Widget::on_clearpushButton_clicked()
{
   ui->sendEdit->clear();
   ui->recvTextEdit->clear();
}

char Widget::ConvertHexChar(char ch)
{
    if(ch>='a'&&ch<='f')
    {
        return ch-'a'+10;
    }
    else if(ch>='A'&&ch<='F')
    {
        return ch-'A'+10;
    }
    else if(ch>='0'&&ch<='9')
    {
        return ch-'0';
    }
    else{
        return -1;
    }
}
void Widget::QStringtoHex(QByteArray& sendData,QString str)
{
    char hstr,lstr,hdata,ldata;
    int len = str.length();
    int sendnum = 0;
    QByteArray temp;
    temp.resize(len/2);//设置大小,len/2会大于实际16进制字符
    //sendData.resize(len/2);
    for(int i=0;i<len;)
    {
        //hstr = str[i].toAscii();
        hstr = str[i].toLatin1();
        if(hstr == ' ')
        {
            ++i;
            continue;
        }
        ++i;
        if(i >= len)
        {
            break;
        }
        lstr = str[i].toLatin1();

        hdata = ConvertHexChar(hstr);
        ldata = ConvertHexChar(lstr);
        if(-1 == hdata || -1 == ldata)
        {
            break;
        }
        ++i;
        temp[sendnum] = hdata<<4|ldata;
        sendnum++;
    }
    sendData.reserve(sendnum);
    sendData = temp.left(sendnum);//去掉多余字符
}


void Widget::on_pushButton_clicked()
{
    QString xinxi= "ROBOT";
    xinxi += "\r\n";
    QByteArray send;
    send=xinxi.toLatin1();
    serial.write(send);

    QString sendData = "1A";   
    QByteArray sendbuff;
    sendData +="\r\n";
    sendbuff = QByteArray::fromHex(sendData.toLatin1().data());
    serial.write(sendbuff);
}

void Widget::on_pushButton_2_clicked()
{
    QString haoma="AT+CMGS='18053301936'";
        ui->sendEdit->setPlainText("haoma");//以ASCII码的形式通过串口发送出去。
        haoma += "\r\n";
        QByteArray send2;
        send2=haoma.toLatin1();
        serial.write(send2);
        ui->sendEdit->clear();

}

界面:



猜你喜欢

转载自blog.csdn.net/qq_39989653/article/details/79906961