用串口控制SIM900A打电话和发短信,遇到的一些问题总结。

使用SIM900A心得总结

一、串口选择

供电对于SIM900A很重要,串口推荐选择CP2102的USB-TTL模块。注意:CH340不能用,如果用单片机供电的话,我试过两个灯都不亮,不推荐。
如何接线就不说了。

二、指示灯与SIM卡选择

注意观察指示灯,D5常亮、D6亮一秒、灭三秒就是正常的。我当时D6一直是快闪,然后我更换过三个联通卡、两个移动卡,依旧是快闪。后来发现我用移动卡时,串口发指令有一个指令返回SIM PIN。发现是我的移动卡,设置了PIN码,然后我就把移动卡插回手机,取消PIN码的设置,再放回SIM900A中,D6灯就正常慢闪了,可以连上网络了。我的联通信号卡虽然没有设置SIM PIN但是依旧不行,具体原因不清楚,可能联通信号不好吧。推荐使用移动电话卡,并取消SIM PIN设置。

三、可以打电话不能发短信问题

做到这又出现了能打电话,不能发短信的问题。
我用ATD152********(省略电话号),返回了OK,成功打电话了。
接下来AT+CMGS=“152********”,最后输入短信内容,再1A后,返回了错误。原来是需要加86,即:AT+CMGS=“86152********”。这里说的是发送英文短信。
发送中文短信,遇到了问题。用汉字转Unicode时转换出来的数字,每四个就有一个空格这个空格要删除,包括汉字和电话的转码都要删去空格,号码可以不加上86,我的可以发送,不行的话就加上试试。

  • 5
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
好的,以下是使用STM32控制SIM900A发送短信的代码: #include "stm32f10x.h" #include "stdio.h" #define SIM900A_TX_BUFFER_SIZE 128 #define SIM900A_RX_BUFFER_SIZE 128 char SIM900A_TX_Buffer[SIM900A_TX_BUFFER_SIZE]; char SIM900A_RX_Buffer[SIM900A_RX_BUFFER_SIZE]; void SIM900A_SendCommand(char* command); void SIM900A_SendTextMessage(char* phoneNumber, char* message); int main(void) { // 初始化串口 USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 960; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); // 初始化SIM900A SIM900A_SendCommand("AT+CMGF=1\r\n"); // 设置短信格式为文本模式 SIM900A_SendCommand("AT+CNMI=2,2,,,\r\n"); // 设置接收短信的方式为自动接收 // 发送短信 SIM900A_SendTextMessage("13800138000", "Hello, world!"); while (1) { // 接收串口数据 if (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == SET) { char ch = USART_ReceiveData(USART1); // 处理接收到的数据 } } } void SIM900A_SendCommand(char* command) { // 发送AT指令 sprintf(SIM900A_TX_Buffer, "%s", command); USART_SendString(USART1, SIM900A_TX_Buffer); // 等待SIM900A返回OK while (1) { SIM900A_RX_Buffer[] = '\'; USART_ReceiveString(USART1, SIM900A_RX_Buffer, SIM900A_RX_BUFFER_SIZE); if (strstr(SIM900A_RX_Buffer, "OK") != NULL) { break; } } } void SIM900A_SendTextMessage(char* phoneNumber, char* message) { // 发送短信 sprintf(SIM900A_TX_Buffer, "AT+CMGS=\"%s\"\r\n", phoneNumber); USART_SendString(USART1, SIM900A_TX_Buffer); USART_SendString(USART1, message); USART_SendData(USART1, x1A); // 发送Ctrl+Z结束短信 // 等待SIM900A返回OK while (1) { SIM900A_RX_Buffer[] = '\'; USART_ReceiveString(USART1, SIM900A_RX_Buffer, SIM900A_RX_BUFFER_SIZE); if (strstr(SIM900A_RX_Buffer, "OK") != NULL) { break; } } }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值