门锁系统——sim卡发送密码

接上篇

这次是门禁系统的最后一个模块了,之前设想的是还有一个蓝牙模块,但是我的开发板设计时将eeprom的I2C接口设计成了I2C2,而I2C2的接口又和串口二共用GPIO口,所以导致我的串口只能使用4个,现在所有串口都使用完了,就弄不下蓝牙模块了,而且蓝牙模块的使用和WIFI、SIM卡的操作都差不多,都是使用AT指令操作。以后有机会会使用蓝牙模块的。

好了,回归正题。

目录

认识SIM800C

代码部分


认识SIM800C

SIM800C是一款四频GSM/GPRS模块,为城堡孔封装。其性能稳定,外观小巧,性价比高,能满足客户的多种需求。SIM800C工作频率为GSM/GPRS850/900/1800/1900MHz,可以低功耗实现语音、SMS和数据信息的传输。SIM800C尺寸为17.6*15.7*2.3mm,能适用于各种紧凑型产品设计需求。简单来说,SIM800C可以像手机一样,进行通话或者发消息,也可以连接各种云等等操作。

我们这次主要使用它的发送短信功能,让SIM在我们忘记密码时,将密码发送到我们之前预设的手机上。

CobeMX中的设置非常简单,只需要打开串口五,并且开启串口的中断操作就完成了,点击生成代码。

代码部分

这部分继续先是创建一个放SIM代码的文件夹和对应的sim800c.c和sim800c.h文件,创建好后将它们添加到主程序中。

首先,先在sim800c.c文件中添加串口五的初始化函数:

void SIM800C_Init(void)

{

       // 初始化接收和发送中断

       HAL_UART_Receive_IT(&SIM800C_UART, USART5_RX_BUF, sizeof(USART5_RX_BUF));

       HAL_UART_Transmit_IT(&SIM800C_UART, USART5_RX_BUF, sizeof(USART5_RX_BUF));



      

}

完成后,先使用usb转ttl直接连接sim800c测试模块的使用,其实也可以像WIFI时一样,将串口五和串口一相连,然后测试,但是这种太麻烦了,并且测试了sim就不能收到WIFI的消息了,因为WIFI的问题比较多,所以这里不改变原先的代码,直接在外部测试。

sim800c在使用使需要注意,只能插入移动或者联通的卡!

在连线时需要注意,这里连线必须要将sim板子上的PWX引脚也接地,方法和上节WIFI相同。

商家给的教程中是PWK引脚,如果和我的不一致就看图中的这个引脚,这些地线连接一个即可。同样的这里的电源应该连接usb转ttl的5v位置。连接完成后会看到板子上有一个灯在闪烁(信号指示灯),另一个灯常亮(电源指示灯)。

闪烁的频率代表了sim的不同状态:

看模块上的net指示灯开始闪烁,当闪烁频率是3秒时候,说明已经识别卡了。如果一直是1秒闪烁,就是没识别到卡,无服务信号,请检查卡插入方向或者换其他卡试试。

LED指示灯状态

SIM800C工作状态

熄灭

SIM800C没有工作

60ms亮/800ms熄灭

SIM800C没有找到服务(GSM卡无服务)

60ms亮/3000ms熄灭

SIM800C连接到服务信号

60ms亮/300ms熄灭

SIM800C正在GPRS通讯

可以根据自己的闪烁频率对应这些状态。

完成后就可以验证模块的使用了。

先发送AT+CPIN?查询SIM800C是否读到卡,返回+CPIN: READY代表读到卡。

使用AT+CSQ产看信号强度,若信号差将注册失败。

0–7

极差

8–15

较差

16–23

较强

24–31

极强

发送AT+CREG?查询SIM800C是否注册成功,返回+CREG: 0,1代表注册成功。

如果以上都没问题就可以开始测试了,先来实现向手机打电话的操作,这里只能使对方振铃,不能通话,如果想要通话,就要连接sim模块上的音频输入输出引脚。

发送ATDXXXXXXXXXX;(注意分号不要丢,后面的×中填入对方的电话号码),返回OK后等待电话即可。

如果对方挂断会回复NO ANSWER;如果对方接电话后挂断会回复NO CARRIER;如果对方没接会回复NO ANSWER

电话实现后说明之前的连线和信号接收都没有问题了,现在就试试能不能发送短信,这里直接发送密码:

1.发送指令AT+CMGF=1设置为文本模式,返回OK

2.发送AT+CSCS="GSM"为设置为缺省字符集用于发纯英文短信。

3.发送AT+CMGS="XXXXXXXXXXX",返回<。(后面的×中填入对方的电话号码)

4.输入短信内容,最大180个字节。

5.短信内容发送完毕后,使用16进制发送1A(无回车)完成发送短信操作。

发送完成后会返回:+CMGS: 102

这些都操作完成后就可以完成测试了,然后将sim模块和单片机的串口五相连接。这里需要注意,我在测试时发现如果直接将单片机的VCCsim模块连接,会导致sim无法工作,最后在查了资料后发现是单片机的电压不足,所以我这里使用时是将sim模块的VCC和地接到刚才的usbttl上了。

完成接线后就是将之前发送的AT指令存入数组,然后封装成函数做出来:

// 发送指令AT+CMGF=1设置为文本模式,返回OK

uint8_t CMGF[] = "AT+CMGF=1\r\n";

// 发送AT+CSCS="GSM"为设置为缺省字符集用于发纯英文短信。

uint8_t CSCS[] = "AT+CSCS=\"GSM\"\r\n";

// 发送AT+CMGS="155XXXXXX46",返回<。

uint8_t CMGS[] = "AT+CMGS=\"155XXXXXX46\"\r\n";  // 手机号

// 存放密码的数组

uint8_t PassWord[6] = {0};

// 短信内容发送完毕后,使用16进制发送1A(无回车)完成发送短信操作。

uint8_t OverTransmit[] = {0x1a};

void PassWordPhone(void)

{

       // 获取密码

       EP24C_ReadBytes(PASSWORD_PARA_ADDR,PassWord,sizeof(PassWord));

       // 发送密码到手机上

       // 发送指令AT+CMGF=1设置为文本模式

       HAL_UART_Transmit_IT(&SIM800C_UART,CMGF,sizeof(CMGF));

       while(__HAL_UART_GET_FLAG(&SIM800C_UART,UART_FLAG_TC)==RESET);//等待发送完成

       HAL_Delay(500);

       // 发送AT+CSCS="GSM"为设置为缺省字符集用于发纯英文短信

       HAL_UART_Transmit_IT(&SIM800C_UART,CSCS,sizeof(CSCS));

       while(__HAL_UART_GET_FLAG(&SIM800C_UART,UART_FLAG_TC)==RESET);//等待发送完成

       HAL_Delay(500);

       // 发送AT+CMGS="155XXXXXX46",返回<

       HAL_UART_Transmit_IT(&SIM800C_UART,CMGS,sizeof(CMGS));

       while(__HAL_UART_GET_FLAG(&SIM800C_UART,UART_FLAG_TC)==RESET);//等待发送完成

       HAL_Delay(500);

       // 发送密码

       HAL_UART_Transmit_IT(&SIM800C_UART,PassWord,sizeof(PassWord));

       while(__HAL_UART_GET_FLAG(&SIM800C_UART,UART_FLAG_TC)==RESET);//等待发送完成

       HAL_Delay(500);

       // 使用16进制发送1A(无回车)完成发送短信操作

       HAL_UART_Transmit_IT(&SIM800C_UART,OverTransmit,sizeof(OverTransmit));

       while(__HAL_UART_GET_FLAG(&SIM800C_UART,UART_FLAG_TC)==RESET);//等待发送完成

       HAL_Delay(500);

       printf("短信发送完成\r\n");

}

这样就完成了函数的封装,现在只要将函数放入我们之前的bsp_lcd.c中的KEY4中就可以了。

到这里整个项目的开发就完成了。这次确实时间有点长,而且也穿插着考试,有些地方没有做出更好的改进,可能会存在一些bug。以后有时间的话我再好好测试下这个项目。

如果需要源码的话可以加我🐧:1977459613

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值