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();
}
界面: