专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
TI
单片机驱动GSM模块,遇到了个很棘手的问题!【已解决】
2019-07-28 18:37
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
TI MCU
16858
19
1004
本帖最后由 512826028 于 2015-1-25 23:06 编辑
单片机是 MSP430F149
GSM模块是 SIM900A
程序中 单片机单独发送 AT指令,可以得到OK答复,单片机点亮第一个LED灯。
单片机单独发送ATE0指令,也可以得到OK答复,单片机点亮另一个LED灯。
但是,如果让单片机按顺序,先发送AT指令,等到OK后,在发送ATE0指令,就不能继续运行了,第二个LED就一直都点不亮了。
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
512826028
1楼-- · 2019-07-28 21:34
一开始,在网上搜了好久,连第一个握手都很难完成。
网上有人说单片机是3.3V的,模块是3.5-5V的,串口的电平不兼容。我是直接用的TTL直连,中间也没有用232电平转换芯片。
当时从网上看到,有一种简易的电平转换,就是用一个三极管,自己也就动手做了一个,没有什么效果,还是不能握手成功。
后来,偶然一个想法,就是修改了一下程序,在后面多了一个“ ”,结果,程序就可以握手成功了。就是上面程序中看到的这个样子了。
然后,我就再添加第二条指令,但是,程序每次都只是执行完成第一个,到了第二条指令,就陷入死循环,那个LED就闪个没完。把两条指令反过来,还是只能执行第一条,到了第二条就卡住了。
只是百思不得其解,不知道问题究竟出在哪里了。
加载中...
512826028
2楼-- · 2019-07-29 00:51
很让人郁闷的一个问题啊。。。求大家帮帮,看看有没有遇到过这种情况的呐。
如果第一次发送AT,第二次发送ATE0指令,程序可以执行完第一个(AT),到了第二个指令时,就卡住了。
如果第一次发送ATE0,第二次发送AT指令,程序也是可以执行完第一个(ATE0),卡在第二个指令上。
我看别人的程序,连续发送,中间就隔了个3秒而已,没有其他的操作了。我中间也加上延时,还是不管用。
加载中...
512826028
3楼-- · 2019-07-29 06:08
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
uchar i;
WDTCTL = WDTPW + WDTHOLD; //关狗
/*------选择系统主时钟为8MHz-------*/
BCSCTL1 &= ~XT2OFF; //打开XT2高频晶体振荡器
do
{
IFG1 &= ~OFIFG; //清除晶振失败标志
for (i = 0xFF; i > 0; i--); //等待8MHz晶体起振
}
while ((IFG1 & OFIFG)); //晶振失效标志仍然存在?
BCSCTL2 |= SELM_2 + SELS; //MCLK和SMCLK选择高频晶振
//计数时钟选择SMLK=8MHz,1/8分频后为1MHz
TACTL |= TASSEL_2 + ID_3;
GPIO_Init(P2,DIR_OUTPUT); //设置P2为输出模式
UART_Init(0);
//打开全局中断
_EINT();
SIM900();
while(1);
}
复制代码
加载中...
512826028
4楼-- · 2019-07-29 10:34
/*******************************************************************************
*描 述: 此文件包含操作GSM的所有函数
*GSM 模块:SIM900A
*控制芯片:MSP430F149
*
*******************************************************************************/
#include "include.h"
extern uchar USART1BUFF[];//重新声明一下其他函数中定义的USART1BUFF数组
extern void UART_Clear_BUFF(void);
//外部声明过的函数 0 UART1,1 UART2,str为字符串指针
extern void UART_PutStr(uchar uartx, char *str);
extern void UART_PutChar(uchar uartx, char ch);
extern void DelayNms(unsigned char n);
extern void DelayNs(unsigned char n);
extern void led(int i);
extern void GPIO_OUT(uchar px, uchar data8);
extern void UART_Init(uchar uartx);
char *ATE0="ATE0 ";//清除GSM模块回显
/*******************************************************************************
*SIM900初始化函数
*
*返回值:无
*测试通过时间:2015年1月22日22:58:54
*******************************************************************************/
void SIM900(void)
{
UART_Clear_BUFF();
UART_PutStr(0,"AT ");
while(strstr((char const*)USART1BUFF,"OK")==NULL)
{
UART_Clear_BUFF();
led(2);
//注意:此处必须为RNRN!!!
UART_PutStr(0,"AT ");
}
GPIO_OUT(P2,0Xf7);//点亮一个LED灯,代表握手成功
UART_Clear_BUFF();
UART_PutStr(0,"ATE0 ");
while(strstr((char const*)USART1BUFF,"OK")==NULL)
{
UART_Clear_BUFF();
led(4);
//注意:此处必须为RNRN!!!
UART_PutStr(0,"ATE0 ");
}
GPIO_OUT(P2,0Xfe);//点亮一个LED灯,代表握手成功
}
复制代码
加载中...
512826028
5楼-- · 2019-07-29 13:54
精彩回答 2 元偷偷看……
加载中...
512826028
6楼-- · 2019-07-29 18:15
。。。。。
加载中...
1
2
3
4
下一页
一周热门
更多
>
相关问题
CPLD的方波输出
4 个回答
11个版本Quartus II 软件下载,安装包网盘合集,附教程,47G!
20 个回答
请大家帮忙到21IC发展大家谈支持我申请新版面
20 个回答
【通知】21ic中国电子网服务条款 (所有人员必读)
1 个回答
满载而归乙亥年,大展鸿途庚子年---集签赢好礼
20 个回答
携手ADI,踏上电子工程师之巅—车辆电气化视频,答题领奖!
1 个回答
如何提升论坛质量,看你了!
20 个回答
【最终名单】二姨家喊你来拿100份新年大礼啦~
20 个回答
相关文章
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
TI
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
网上有人说单片机是3.3V的,模块是3.5-5V的,串口的电平不兼容。我是直接用的TTL直连,中间也没有用232电平转换芯片。
当时从网上看到,有一种简易的电平转换,就是用一个三极管,自己也就动手做了一个,没有什么效果,还是不能握手成功。
后来,偶然一个想法,就是修改了一下程序,在后面多了一个“ ”,结果,程序就可以握手成功了。就是上面程序中看到的这个样子了。
然后,我就再添加第二条指令,但是,程序每次都只是执行完成第一个,到了第二条指令,就陷入死循环,那个LED就闪个没完。把两条指令反过来,还是只能执行第一条,到了第二条就卡住了。
只是百思不得其解,不知道问题究竟出在哪里了。
如果第一次发送AT,第二次发送ATE0指令,程序可以执行完第一个(AT),到了第二个指令时,就卡住了。
如果第一次发送ATE0,第二次发送AT指令,程序也是可以执行完第一个(ATE0),卡在第二个指令上。
我看别人的程序,连续发送,中间就隔了个3秒而已,没有其他的操作了。我中间也加上延时,还是不管用。
- int main( void )
- {
- // Stop watchdog timer to prevent time out reset
- WDTCTL = WDTPW + WDTHOLD;
-
- uchar i;
-
- WDTCTL = WDTPW + WDTHOLD; //关狗
- /*------选择系统主时钟为8MHz-------*/
- BCSCTL1 &= ~XT2OFF; //打开XT2高频晶体振荡器
- do
- {
- IFG1 &= ~OFIFG; //清除晶振失败标志
- for (i = 0xFF; i > 0; i--); //等待8MHz晶体起振
- }
- while ((IFG1 & OFIFG)); //晶振失效标志仍然存在?
- BCSCTL2 |= SELM_2 + SELS; //MCLK和SMCLK选择高频晶振
-
-
- //计数时钟选择SMLK=8MHz,1/8分频后为1MHz
- TACTL |= TASSEL_2 + ID_3;
-
- GPIO_Init(P2,DIR_OUTPUT); //设置P2为输出模式
-
- UART_Init(0);
-
- //打开全局中断
- _EINT();
- SIM900();
- while(1);
- }
复制代码- /*******************************************************************************
- *描 述: 此文件包含操作GSM的所有函数
- *GSM 模块:SIM900A
- *控制芯片:MSP430F149
- *
- *******************************************************************************/
- #include "include.h"
- extern uchar USART1BUFF[];//重新声明一下其他函数中定义的USART1BUFF数组
- extern void UART_Clear_BUFF(void);
- //外部声明过的函数 0 UART1,1 UART2,str为字符串指针
- extern void UART_PutStr(uchar uartx, char *str);
- extern void UART_PutChar(uchar uartx, char ch);
- extern void DelayNms(unsigned char n);
- extern void DelayNs(unsigned char n);
- extern void led(int i);
- extern void GPIO_OUT(uchar px, uchar data8);
- extern void UART_Init(uchar uartx);
- char *ATE0="ATE0
";//清除GSM模块回显
- /*******************************************************************************
- *SIM900初始化函数
- *
- *返回值:无
- *测试通过时间:2015年1月22日22:58:54
- *******************************************************************************/
- void SIM900(void)
- {
- UART_Clear_BUFF();
- UART_PutStr(0,"AT
");
- while(strstr((char const*)USART1BUFF,"OK")==NULL)
- {
- UART_Clear_BUFF();
- led(2);
- //注意:此处必须为RNRN!!!
- UART_PutStr(0,"AT
");
- }
- GPIO_OUT(P2,0Xf7);//点亮一个LED灯,代表握手成功
- UART_Clear_BUFF();
- UART_PutStr(0,"ATE0
");
- while(strstr((char const*)USART1BUFF,"OK")==NULL)
- {
- UART_Clear_BUFF();
- led(4);
- //注意:此处必须为RNRN!!!
- UART_PutStr(0,"ATE0
");
- }
- GPIO_OUT(P2,0Xfe);//点亮一个LED灯,代表握手成功
- }
复制代码一周热门 更多>