搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
花生_TL007
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
大数据面试hive 看这一篇就够了(离线数仓 )_hive 的底层执行 面试
2
A CLOSER LOOK: SMALL OBJECT DETECTION IN FASTER R-CNN_a closer look:small object detection in faster r-
3
安卓开发检测不到手机_安卓开发显示不出来手机
4
选择大语言模型:2024 年开源 LLM 入门指南_中文开源llm
5
质量冷知识:TRIZ,一个被人忽略的管理工具_triz 软件
6
SpringCloudConfig+SpringCloudBus+Actuator+Git实现Eureka关键配置属性热更新(全程不重启服务)_springcloud 微服务热更新
7
iOS开发问题小结_development_language
8
鸿蒙开发,对于前端开发来说,究竟是福是祸呢?
9
VirtualBox网络之桥接网卡
10
Window与WindowManager_window的唯一实现类
当前位置:
article
> 正文
sim900a call_sim900ano carrier
作者:花生_TL007 | 2024-03-21 11:19:56
赞
踩
sim900ano carrier
SIM900A手机模块的3大功能:接拨电话,收发短信和TCP/UDP通信。现在的手机基本上可以不叫手机了,真正的手机功能(前面所说的3大功能)占用不到1/5的主机资源。其实手机的工作原理非常简单,就是一个主机与从机(sim900a之类的DSP或MCU)之间的串口通信,主机向从机发送指令,从机响应指令发回响应值,然后在LCD上显示相应的界面。
原子的例程仅仅是最简单的芯片测试程序,不足很多,离以前的功能机的功能还差老远。比如:1,接拨电话,收发短信和TCP/UDP通信这三个任务间没有通信机制,收到短信时不能自动切换到收发短信界面;正常情况下最好是处于待机等待拨号界面;2,没有通话计时功能;3,只能发固定内容的短信即不能自由编辑短信内容发送;4,没有通话记录功能等;5,没有电话薄功能。这些功能貌似很简单,实施起来不容易。最近一直在想以前那些简单功能手机(不带操作系统)各种功能任务是如何调度的程序上是怎样实现的。我的想法是,以stm32作为主机加入文件系统和ucosii操作系统与SIM900A芯片构成一个简单的智能手机。就当是自娱自乐吧!
SIM900A手机模块 拨号测试函数“u8 sim900a_call_test(void)”是本例程的核心代码;本人做了非常详细的注解,贴出来方便自己随时登陆温故学习。也供同道中人参考。
// SIM900A手机模块 拨号测试函数“u8 sim900a_call_test(void)” 拨号测试部分代码
//sim900a拨号测试
//用于拨打电话和接听电话
//返回值:0,正常
// 其他,错误代码
u8 sim900a_call_test(void)
{
u8 key;
u16 lenx;
u8 callbuf[20];
u8 wangyan[]={"13476852658"};//向自己的手机拨号,因为程序中是把手机号码当作字符处理,所以要加英文引号
u8 pohnenumlen=0; //号码长度,最大15个数,如 callbuf[pohnenumlen]; usart通信时电话号码就是ASCII码;
u8 *p,*p1,*p2;
u8 oldmode=0;
u8 cmode=0; /*模式0:等待拨号;模式1:拨号中;模式2:通话中;模式3:接收到来电,共4种情况 */
LCD_Clear(WHITE);
if(sim900a_send_cmd("AT+CLIP=1","OK",200))return 1; //设置来电显示
if(sim900a_send_cmd("AT+COLP=1","OK",200))return 2; //设置被叫号码显示
p1=mymalloc(SRAMIN,20); //申请20个字节直接用于存放SIM900A模块返回的来电电话号码,usart通信时电话号码就是ASCII码;
if(p1==NULL)return 2;
POINT_COLOR=RED;
Show_Str_Mid(0,30,"ATK-SIM900A 拨号测试",16,240);
Show_Str(40,70,200,16,"请拨号:",16,0);
kbd_fn_tbl[0]="拨号";
kbd_fn_tbl[1]="返回";
sim900a_load_keyboard(0,180,(u8**)kbd_tbl1);/*加载拨号键盘界面,由此可见进入什么功能就加载相应的界面*/
POINT_COLOR=BLUE;
while(1)
{ if(KEY_LEFT==KEY_Scan(0)) u2_printf("ATD%s;\r\n",wangyan);
delay_ms(10);
if(USART2_RX_STA&0X8000) /*以下凡是受此if语句控制范围的语句都是基于已经接收到sim900a模块返回的数据,*/
{
sim_at_response(0); /* mode:0,不清零USART2_RX_STA; 将收到的来自sim900a模块的AT指令应答数据返回给电脑串口 */
if(cmode==1||cmode==2)/*首次进入时cmode为0,模式0:等待拨号;模式1:拨号中;模式2:通话中;模式3:接收到来电 */
{/* 首先发送:ATE1,设置回显,再发送:AT+COLP=1,设置被叫号码显示。然后发送:ATD10086;,拨打10086,在接通后,SIM900A模块返回:+COLP: "10086",129,"","",此时,我们就可以听到中国移动那熟悉的声音了….待一堆废话结束后,我们发送:AT+VTS=1,即可查询本机电话号码。最后,通过发送:ATH,挂断,结束本次 */
if(cmode==1)if(sim900a_check_cmd("+COLP:"))cmode=2; //拨号成功
if(sim900a_check_cmd("NO CARRIER"))cmode=0; //拨号失败
if(sim900a_check_cmd("NO ANSWER"))cmode=0; //拨号失败
if(sim900a_check_cmd("ERROR"))cmode=0; //拨号失败
}
if(sim900a_check_cmd("+CLIP:")) /*接收到来电, 如果返回值是+CLIP:则表示接收到来电 */
{/*"+CLIP:"的含义是:设置提示来电号码,带来电显示时的返回值格式是:"+CLIP:(<n>取值列表) " 参考AT命令手册P59
AT+CLIP用于设置来电显示,通过发送:AT+CLIP=1,可以实现设置来电显示功能,模块接收到来电的时候,会返回来电号码。并且可以在串口接收到来电号码,如:+CLIP: "02038271790",161,"",,"ALIENTEK",0,表示当前接入号码为:02038271790。
此时,我们发送:ATA,即可接听来电,并进行通话。当对方挂断电话的时候,SIM900A模块会返回:NO CARRIER,并结束此次通话;当然,我们也可以通过发送:ATH,来主动结束通话。*/
cmode=3; /* 模式0:等待拨号;模式1:拨号中;模式2:通话中;模式3:接收到来电 */
p=sim900a_check_cmd("+CLIP:"); /* 将接收到的"+CLIP:"字符串(即来自模块返回值)存储到P */
p+=8; /*将模块返回的来电号码存储在(P+8)处,p+8,就是偏移8个字节,不是一共8个内存空间 */
p2=(u8*)strstr((const char *)p,"\"");/*在(P+8)处开始,找到第一个出现“\”符号(每个字符串结束符
都有“\”符号)的位置,实际上就是从模块返回值中取得电话号码;并将电话号码存储到P2开始处*/
p2[0]=0; /*添加结束符。字符串的结束符是'\0' 也是0;p2=(u8*)strstr((const char*)(p1),","); 指定结束符的位置 */
/*上面两步的作用是给字符串加上“\0”这个字符串末尾标志 */
strcpy((char*)p1,(char*)p);/* 字符串P复制到P1,用于下面case3语句显示 */
}
USART2_RX_STA=0; /*将接收到的数据清零,以便让串口2再次进入中断执行“if(USART2_RX_STA==0)TIM4_Set(1)”语句*/
} /*对sim900a返回值的处理部分到此结束 ;*/
/* 上面部分的语句主要是对sim900a返回值的处理,并根据返回值的情况定义4种工作状态:模式0:等待拨号;模式1:拨号中;模式2:通话中;模式3:接收到来电 */
key=sim900a_get_keynum(0,180);/* 检测是哪个触摸键被按下,下面根据对触摸键触摸情况、对相关功能进行处理 */
if(key) /* 下面的操作都是基于触摸键有被按下 */
{
if(key<13)
{
if(cmode==0&&pohnenumlen<15) /*模式0:等待拨号且pohnenumlen对应的键值小于15,首次进入时是0 */
{
callbuf[pohnenumlen++]=kbd_tbl[key-1][0];/*执行pohnenumlen++的条件是必须有触摸键按下 */
/* 二维数组kbd_tbl[key-1][0]实际上等价于kbd_tbl[key-1];本句的作用是将被按下的触屏键值即对应的字符存储到callbuf[pohnenumlen++] */
/* 假设i=3,j=1,则key==11即key[1][3]:x轴第二格,y轴第4格,该处就是存放“11” */
u2_printf("AT+CLDTMF=2,\"%c\"\r\n",kbd_tbl[key-1][0]);
/* "AT+CLDTMF=2参考AT命令手册P126,测试DTMF音,时长2秒 ,将命令和键值发送给模块,功能:每拨一个数字键(只对0-9号数字键有效)耳机发出相应的拨号音*/
}else if(cmode==2)//通话中,主叫拨通了通话中
{
u2_printf("AT+CLDTMF=2,\"%c\"\r\n",kbd_tbl[key-1][0]);
delay_ms(100);
u2_printf("AT+VTS=%c\r\n",kbd_tbl[key-1][0]);
LCD_ShowChar(40+56,90,kbd_tbl[key-1][0],16,0);
/*在“请拨号”后面显示按下的键值,即显示拨号键 */
}
}else
{
if(key==13)if(pohnenumlen&&cmode==0)pohnenumlen--;
/*删除;1,如果pohnenumlen==0,则说明callbuf[pohnenumlen]数组中没有存放任何号码,所以就不必执行“pohnenumlen--;” 2,“cmode==0”即等待拨号模式;3,通过对数组下表的加减就可以增删数组元素;如,本例中通过执行“pohnenumlen--;”操作,就将callbuf[pohnenumlen]数组元素做了增删,重要! */
if(key==14)//执行拨号
{
if(cmode==0)/*拨号模式;如果按了拨号键且处于等待拨号模式 */
{
callbuf[pohnenumlen]=0;/*最后加入结束符, 字符串结束符是“\0”也是“0” */
// u2_printf("ATD%s;\r\n",callbuf);/*拨号,号码就是callbuf存储的内容 */
u2_printf("ATD%s;\r\n",wangyan);
/*给自己拨号拨号,号码就是wangyan存储的内容即13476852658;当按下“拨号”键时,相应的手机就接到了本机的来电 */
cmode=1; //拨号中模式1:57:01星期三 2014年8月6日
}else /* 如果按了拨号键key14*/
{
sim900a_send_cmd("ATH","OK",200);//挂机
cmode=0; /*将工作模式设置为等待拨号模式 */
}
}
if(key==15) /* 在通话测试模式中key15就是“接听” */
{
if(cmode==3) /*如果按下“接听”键且处于“接听中”(cmode==3) 模式 */
{/* 接收到来电;上面有“if(sim900a_check_cmd("+CLIP:"))”语句,所以只要有电话打进来,cmode就会等于3!*/
sim900a_send_cmd("ATA","OK",200);/*发送应答指令,ATA,即可接听来电*/
Show_Str(40+56,70,200,16,callbuf,16,0);/*显示来电号码,本句是否有问题? */
cmode=2; /* 设置为模式2:通话中 */
}else /* 如果没有电话打进来,触摸15键则会执行“break;”退出while大循环回到主函数界面,*/
{
sim900a_send_cmd("ATH",0,0); /* 不管有没有在通话,都结束通话即挂机 */
break;/*退出循环,执行“myfree(SRAMIN,p1);”语句*/
}
}
}
if(cmode==0)//只有在等待拨号模式有效
{ /* “callbuf[pohnenumlen]=0; ”这一句非常重要!该句确保每拨一个字符都能正确的显示 */
callbuf[pohnenumlen]=0; /*该句作用是每按一下拨号键就在相应的键值后加一个结束符,用以显示在LCD上 */
LCD_Fill(40+56,70,239,70+16,WHITE);
Show_Str(40+56,70,200,16,callbuf,16,0);/*将每个拨号键值显示出来 */
}
}
if(oldmode!=cmode)//模式变化了,只要cmode不等于0模式就会进入下面语句
{
switch(cmode)
{
case 0:
kbd_fn_tbl[0]="拨号";
kbd_fn_tbl[1]="返回";
POINT_COLOR=RED;
Show_Str(40,70,200,16,"请拨号:",16,0);
LCD_Fill(40+56,70,239,70+16,WHITE);
if(pohnenumlen)
{
POINT_COLOR=BLUE;
Show_Str(40+56,70,200,16,callbuf,16,0);
}
break;
case 1:
POINT_COLOR=RED;
Show_Str(40,70,200,16,"拨号中:",16,0);
pohnenumlen=0;//将电话号码清零
case 2:
POINT_COLOR=RED;
if(cmode==2)Show_Str(40,70,200,16,"通话中:",16,0);
kbd_fn_tbl[0]="挂断";
kbd_fn_tbl[1]="返回";
break;
case 3:
POINT_COLOR=RED;
Show_Str(40,70,200,16,"有来电:",16,0);
POINT_COLOR=BLUE;
Show_Str(40+56,70,200,16,p1,16,0); //显示来电
kbd_fn_tbl[0]="挂断";
kbd_fn_tbl[1]="接听";
break;
}
if(cmode==2)Show_Str(40,90,200,16,"DTMF音:",16,0);//通话中,可以通过键盘输入DTMF音
else LCD_Fill(40,90,120,90+16,WHITE);
sim900a_load_keyboard(0,180,(u8**)kbd_tbl1); //显示键盘
oldmode=cmode; /*退出“switch(cmode)”语句,确保界面处于一种稳定的与cmode值对应的模式 */
}/*假设cmode==2“通话中模式”,根据通话的具体情况cmode会得到不同的值,这样就又可以进入“switch(cmode)”语句了。 */
if((lenx%50)==0)LED0=!LED0;
lenx++;
}
myfree(SRAMIN,p1);
return 0;
}
/*
1,u8 sim900a_call_test(void)函数总结:该函数可以接听拨打电话测试,是该模块的核心函数之一,里面的算法以及c语言运用技巧都值得不断温故;可以分为2个部分:
1),按下key0键,做一些拨打电话之前的准备工作让sim900a模块进入工作状态并加载触摸屏界面;首次进入该函数时,把cmode设置为等待拨号模式;
2),该部分包含在一个while大循环里,这个while大循环就是该函数的核心,为了便于分析该函数,将while循环的功能细分为;a),以“if(USART2_RX_STA&0X8000)”语句为控制范围的内容,它的主要功能是假设收到了来自sim900a模块的AT指令应答数据即模块返回数据,基于此并根据接收到的返回值含义把sim900a模块定义为4种工作模式:模式cmode0:等待拨号;模式cmode1:拨号中;模式cmode2:通话中;模式cmode3:接收到来电;而后面程序的操作就是围绕这四种工作模式不断变化使LCD界面适应相应的操作需求以便于主机发出相应的命令;如果sim900a模块接收到来电就会向串口返回相应的数据和来电电话号码,程序就将sim900a模块设置为cmode3即接听模式并将来电号码显示在LCD;如果是拨号中或通话中模式,则根据sim900a模块的返回值将cmode设置为相应的工作模式值;b)接着就是根据某个触摸键是否按下即根据获得的触摸键值key执行向sim900a模块发出相应的AT指令,同时将cmode定义为相应的工作模式值,以便于下一步操作;c),根据cmode模式值执行相应的switch语句内容。
*/
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/花生_TL007/article/detail/280848
推荐阅读
article
鸿蒙
os
麒麟
970
,从4499跌至979元
,
昔日
华为
顶级
旗舰
降成
二手
价:
麒麟
970
+
鸿蒙
OS!.....
【Tech分析狮】5月27日消息
,
现在的
旗舰
手机市场
,
真的是可以说没有
华为
什么事了
,
几乎全是其他手机厂商的
旗舰
机在现货出...
赞
踩
article
大学
考试分数
越高
学分
越多吗_千万别到了大四才知道
,
绩点
和
学分
的
用处
,
那可就真
的
为时已晚
!......
原标题:千万别到了大四才知道
,
绩点
和
学分
的
用处
,
那可就真
的
为时已晚
!
大学
是学生们步入社会前
的
象牙塔时光
,
在这期间会发生无...
赞
踩
article
DevEco
Studio
打开失败_
deveco
studio
打不开...
DevEco
Studio
打开失败,Internal error. Please refer to https://j...
赞
踩
article
vue
.
js
——
ElementUI
表单向后台
提交
FormData
数据_
elementui
提交
for...
前端样式效果图:前端样式主要代码:
[详细] -->
赞
踩
article
astra
pro相机(乐视/奥比中光相机)在
JETSON
NANO
、TX2、NX上的ubuntu1...
0 设备和环境我用设备的是:jetson-nx设备的环境:nano:Ubuntu18.04+
ros
-melodic1 安...
赞
踩
article
多线程
视频
抽帧
python
_
python
读取
视频
帧
多线程
...
转载注明出处谢谢# -*- coding: utf-8 -*-import shutilimport numpy as ...
赞
踩
article
Vue中
传递
自定义
参数
到
后
端
、
后
端
获取数据(使用
Map
接收
参数
)_
后
端
调
接口
参数
擦
传递
用hash...
在对axios进行二次封装的时候、为了统一
接口
的设计。有些
传递
的
参数
是直接拼接到URL地址栏中的、但是为了统一管理、不能...
赞
踩
article
屏幕
分辨率
:PC / 手机
屏幕
常见
分辨率
,前
端
如何
适配
分辨率
_pc
端
适配
各种
分辨率
...
注意:
分辨率
的数字表示水平像素点数和垂直像素点数,例如1920x1080意味着在
屏幕
上有1920个水平像素和1080个垂...
赞
踩
article
鸿蒙
系统
文件
删除
怎么
恢复
,
鸿蒙
系统
升级后会
删除
东西吗?
鸿蒙
系统
游戏数据互通吗?......
鸿蒙
系统
无疑是这段时间最大的热点了,也因为太过于火爆,花粉俱乐部已经在维护修理了,不过很多小伙伴还在担忧
鸿蒙
系统
游戏和安...
赞
踩
article
基于
Huggingface
Diffusers
的文本图像生成
_
huggingface
token
...
基于
Huggingface
Diffusers
的文本图像生成
_
huggingface
token
huggingfac...
赞
踩
article
huggingFace
中文
模型
实战
——
中文
文本分类_
huggingface
.
co
...
huggingFace
中文
模型
实战
_
huggingface
.
co
huggingface
.
co
...
赞
踩
article
printf
()
的
转换
说明
修饰符
_
printf
()
的
转换
说明
修饰符
...
可以在%和定义
转换
字符之间通过插入
修饰符
对基本
的
转换
说明
加以修改。下面例如可以插入
的
合法字符。如果使用了一个以上
的
修饰符
...
赞
踩
article
FPGA
零
基础
学习之
Vivado
-
FIFO
使用教程_
vivado
fifo
tuser
...
本系列将带来
FPGA
的系统性学习,从最基本的数字电路
基础
开始,最详细操作步骤,最直白的言语描述,手把手的“傻瓜式”讲解,...
赞
踩
article
超越
ChatGPT
:
大
模型
的智能极限_
fine
turning
chatgpt
...
在此前《
大
型语言
模型
的涌现能力》、《
ChatGPT
进化的秘密》两篇文章中,符尧剖析了
大
型语言
模型
的突现能力和潜在优势,
大
...
赞
踩
article
计算机
系统
结构
并行性
,
计算机
体系
结构
中
并行性
的发展...
第1章
计算机
体系
结构
的基本概念1.6
计算机
体系
结构
中
并行性
的发展1.6.1
并行性
的概念1.
并行性
是在同一时间或同一时间间...
赞
踩
article
[
调试
逆向]
chrome
调试
微信
网页
_
微信
网页
逆向...
微信
自带浏览器采用X5内核并且有一堆的限制作为一个开发人员
调试
网页
的时候分以下步骤:1.关注公众号2.在公众号中绑定
微信
...
赞
踩
article
java
日志框架
log4j2
配置
详解...
官方文档:http://logging.apache.org/log4j/2.x/manual/configuratio...
赞
踩
article
微信
公众
号
开发
_吾爱
公众
号
开发
...
目录
微信
公众
号
开发
一、什么是
微信
公众
号二、
公众
号分类1、订阅号2、服务号3、小程序4、企业
微信
(原企业号)三、订阅号和服...
赞
踩
article
乐视
LeTMC
-520
体感
摄像头
ROS
驱动
_
乐视
体感
摄像头
用什么
驱动
...
乐视
LeTMC
-520
体感
摄像头
ROS
驱动
我以为它的
驱动
跟Xtion是一样的,其实它的
驱动
是奥比中光的,安装
驱动
参考...
赞
踩
article
摄像头
r
tsp
流转成 ws 使
前端
播放_怎么把海康
r
摄像头
r
tsp
:
xsxs
流媒体
地址转为web...
前端
是不能直接播放
r
tsp
流的,必须通过后端转成
前端
支持的形式,这里是转成Websocket。_怎么把海康
r
摄像头
r
ts...
赞
踩
相关标签
鸿蒙os 麒麟970
大学考试分数越高学分越多吗
harmonyos
ubuntu
linux
音视频
python
开发语言
vue.js
axios
前端
分辨率
屏幕分辨率
鸿蒙系统文件删除怎么恢复
深度学习
人工智能
机器学习
pytorch
nlp
fpga开发
FPGA技术培训
叁芯智能科技
FIFO使用教程
FPGA硬件开发