项目需要在基于Qt的界面下发送短信,选用4G模块SIM7600通过AT指令发送短信,和小伙伴调了一天多,终于可以了,下面简单总结一下调试过程中遇到的问题和学习到的经验,供大家参考,少走弯路。
1、在网上购买了该模块时商家回给你大量的资料,你需要的只是一个SIM7600的使用说明书,商家给的是window下的串口助手,首先在windows下调试正常,证明模块是OK 的。
2、发送中文短信步骤,根据说明书上来就行
(1) 发送: AT+CMGF=1, 设置为文本模式。
(2)发送 AT+CSMP=17,167,2,25,设置文本模式参数。
(3)AT+CSCS=”UCS2”,设置为 UCS2 编码字符集。
(4)设定发送手机号:由于使用了 UCS2字符集,所有字符/数字/汉字,都必须使用 UNICODE 编码。可以使用Unicode转换工具转换。AT+CMGS=”0031003300370039------UNICODE 编码-------0033003100350036035”
(5)输入我们需要发送的内容:同样需要转为unicide编码
0048004F0045002D00530049004D0037003600300030004300454E2D82F1658777ED4FE153D190016D4B8BD5
(6)最后选择串口助手上的“十六进制发送”或者“HEX发送”勾选框,然后输入1A,点击发送,就可以收到发送成功的显示了。
NOTE:前四步发送指令时如果串口助手上有发送新行,则需要勾选,没有的话,在输入完指令需要按一下回车再发送!!!
3、发送英文短信:步骤与中文短信类似,说明文档中说的很清楚
AT+CMGF=1
AT+CSCS="GSM"
AT+CSMP=17,23,64,244 //TXT 发送一般不用设置如果设置发送中文后想再发英文需要设置一次啊。
AT+CMGS="158××××××××"
发送信息,十六进制发送1A,返回OK,证明发送成功!
NOTE:我们调试的时候没仔细看文档,发送完中文短信,再发英文需要设置 AT+CSMP,我们以为还是设置AT+CSMP=17,23,64,244,怎么改返回都是 text mode error!后来发现切换到发送英文信息模式需要设置 AT+CSMP=17,167,0,0而不是AT+CSMP=17,23,64,244!!
4、QT串口读写实现短信发送
之前同学在网上找了几个Qt写的串口助手,带源码的,有在Ubuntu 下调试的(如上图)感谢网友分享,链接暂时找不到了,我把资源 传到了百度云,分享给大家!
链接:https://pan.baidu.com/s/1xPtKwCeEq3sIBnEARXR8Ig 密码:prn6
简单来说就是将输入指令那几步转为按钮点击就可以了,主要用到QtSerialPort这个模块
(1)设置串口,写在该窗口的构造函数中,调用改窗口时打开串口,返回时关闭串口
//set the serialport
serial.setPortName("/dev/ttyUSB2"); //设置COM口 改为("/dev/ttyUSB0")
serial.setBaudRate(QSerialPort::Baud9600,QSerialPort::AllDirections);//设置波特率和读写方向
serial.setDataBits(QSerialPort::Data8); //数据位为8位
serial.setFlowControl(QSerialPort::NoFlowControl);//无流控制
serial.setParity(QSerialPort::NoParity); //无校验位
serial.setStopBits(QSerialPort::OneStop); //一位停止位
if(serial.isOpen())//先关串口,再打开,可以保证串口不被其它函数占用。
{serial.close();}
if (serial.open(QIODevice::ReadWrite)) {
QMessageBox::information (this,tr("Info"),tr("Connect successfully!"),QMessageBox::Ok);
} else {
QMessageBox::information (this,tr("Info"),tr("Connect Failed!"),QMessageBox::Ok);
}
(2)设置信息模式,写在选择信息按钮的槽函数中,也可以加入上一步需要点击的按钮
//在选择信息按钮的槽函数中
void SendfileDialog::on_pushButton_clicked()
{
char cmgf[]="AT+CMGF=1\r"; //设置短信发送模式为text
serial.write(cmgf);
QThread::msleep( 1000 );// 休息1秒
char cscs[]="AT+CSCS=\"";
strcat(cscs,"GSM\"\r");
serial.write(cscs);
QThread::msleep( 1000 );// 休息1秒
char csmp[]="AT+CSMP=17,167,0,0\r";
serial.write(csmp);
QThread::msleep( 1000 );// 休息1秒
}
(3)输入收信人手机号,在确认按钮中槽函数中发送指令
void SendfileDialog::on_enter_phone_clicked()
{
QString send_number= ui->lineEdit_phone->text();
char* char_number;
QByteArray buff = send_number.toLatin1();
char_number=buff.data();
char cmgs[256]="at+cmgs=\""; //AT+CMGS="号码"
strcat(cmgs,char_number);
strcat(cmgs,"\"\r"); //加个双引号
serial.write(cmgs);//
printf("cmsg :%s\n",cmgs);
QThread::msleep( 1000 );// 休息1秒
}
(4)设定GO按键发送信息,发送短信(其实这里可以设为QMessageBox确认键,避免按键过多)写于槽函数中
void SendfileDialog::on_go_Button_clicked()
{
QString xinxi= " Your file is on the way,please get it to your office door late!";
QByteArray send;
send=xinxi.toLatin1();
serial.write(send);
QString sendData = "1A";
QByteArray sendbuff;
sendbuff = QByteArray::fromHex(sendData.toLatin1().data());
serial.write(sendbuff);
}
(5)大致界面如下
5、知识点总结
(1)文章中写入AT指令参考C语言的实现方式,参考文章链接:SIM71004G模块使用Linux C语言实现打电话发短信,文中程序编译直接课用于sim7600打电话,发短信还需要简单添加命令设置。
(2)写入AT+CMGS=“158××××××××”命令时,双引号着实另我废了一些脑筋,最后采用的字符链接strcat(),还涉及到将手机号string转char类型 。参考:Qt下 QString转char*
有什么写的不对的,还请留言指正!