转自:http://mywutuobang.blog.sohu.com/260073467.html

一. 修改内核支持3G模块,一般内核需要枚举相关的通讯模块,其接口为串口,其数据接口和通讯接口枚举成不同的设备,如果出现问题,详见以下步骤:

3G 出现问题,通常应先检查系统是否识别到了 modem 设备,可用如下命令确认: 
     ls /dev/ttyU* 
     或者 
     ls /dev/ttyA* 
如果在/dev 下没有找到 ttyU* 或者 ttyA* 设备,此时可通过观察内核 LOG 来定位问题: 
     1. USB 设备枚举失败或者系统根本就没有发现 USB 设备,此时应检查硬件电路 
 
     2. USB 枚举成功,但没有注册到 ttyUSB 或者 ttyACM 设备,此时应检查你的内核: 
          a). 你的内核没有开启 usb serial 功能 
          b). 你的内核代码中的 usb serial 相应驱动中没有添加该设备的 VID/PID,请修改
kernel/drivers/usb/serial/option.c,在数组 static struct usb_device_id option_ids[] 的末
尾添加上新设备的 VID/PID 
 
     3. USB 枚举成功,且相关配置且 ID 都已添加,但还是不出来 ttyUSB 或者 ttyACM 设备,此时
可观察系统是否有对它执行 usb mode switch,可通过 logcat: 
          # logcat –s Vold vold & 
        观察是否有调用了 usb_modeswitch 程序,如果没有执行,则检查如下: 
          a). 检查一些必要的文件是否存在: 
               ls /system/bin/usb_modeswitch 
               ls /etc/usb_modeswitch.sh 
               ls /etc/usb_modeswitch.d/[VID_PID]  #[VID_PID]应替换成你的 modem 的
VID/PID,如: 12d1_1001 
          如果是缺少了 usb_modeswitch、usb_modeswitch.sh 等文件,则可能是你的                                           福州瑞芯微电子有限公司 福州瑞芯微电子有限公司 福州瑞芯微电子有限公司 福州瑞芯微电子有限公司 
gingerbread/device/rockchip/sdkDemo/BoardConfig.mk 中的配置存在问题,请确认
BOARD_RADIO_DATAONLY := true 
          如果是缺少了/etc/usb_modeswitch.d/[VID_PID],请告知我! 
 
          b). VOLD 中关于 usb_modeswitch 这部分的代码没有被编译,你可查看 Vold 的 log 中是
否有“Start Misc devices Manager…”的字样,如果没有这串字符,请检查你的
gingerbread/system/vold/下的内容。

通常,3G 问题中,不出来 ttyUSB 或者 ttyACM 设备,主要就是上述的那些情况 。

二.如果是开发短信功能,需要获取3G模块供应商的AT指令集,大部分的3G模块的指令集一致。

1、先执行AT命令,若返回OK,则说明三级模块与单片机的串口连接好了;

2、接着执行AT+CFUN=1, 启动初始化SIM模块命令,该命令不管有没有插卡都会返回OK;

3、接下来执行AT+CREG=1,初始化网络,允许网络注册主动提供结果代码(将<mode>设为了1);理论上可以通过查询AT+CREG?命令来判断是否注册成功,根据返回的指令判断是否注册到网络,返回命令的格式为::+CREG:<mode>,<stat> [,<lac>,<ci>],若<stat>为1(注:由于注册网络需要一段时间,所以初始返回值可能为2,即处于未注册,终端正在搜寻基站,因此需要延时一段时间,供硬件反应),则表示注册到本地网络。具体原因参见命令解释,但是由于不插上SIM卡也可以有返回指令,所以检测不便,另外硬件需要一段反应时间,从而使得测出来的结果不准确,为此应该使用以下命令。

4、接下来执行AT+COPS?如果返回0,则表示插入了SIM卡,但是此时SIM卡不一定注册成功,需要延时一段时间,然后再判断AT+COPS?返回结果,若返回+COPS: 0,0,"中国联通",0,则还需要判断AT+CREG?判断格式是否为+CREG:1.1(主要看第二个参数);若返回+CMEERROR:10,则SIM卡注册失败,有可能SIM卡未插入插槽中,此时应该检测是否将SIM卡插好,确信卡是插好的。因为硬件连接传输有可能延迟,应该多试几次。

通过以上分析,为了简化判断程序,可以只判断AT+COPS?是否能够返回0,这样就表示硬件连接上有没有问题了。

在以上步骤成功后,先执行AT+CMGF=1,设定发送短消息的格式,1代表TEXT,0代表PDU格式。返回OK,则执行成功。接着输入AT+CMGS=”13988888888”回车(对应的16进制为0x0D),后面的号码表示发送短消息的目的地号码。若成功,则会返回一个>符号,提示输入信息,接着输入想要发送的信息即可,最后在发送的末尾加上CTRL+Z(对应的16进制为0X1A),则短消息发送成功。

经常涉及的指令:

1、AT+CFUN=1(全功能命令,立即执行)

此命令可以开启simcom模块的大部分功能,一般在初始化模块的时候都要写上;AT+CFUN=0的功能与+CPOF相同。(AT+CPOF,关机)

2、AT+CREG 网络注册和漫游

AT+CREG=<mode>,命令响应(Response):+CREG:<mode>,<stat> [,<lac>,<ci>]

参数说明:

<mode>

0: 禁止网络注册主动提供结果代码(默认设置)

1: 允许网络注册主动提供结果代码:+CREG:<stat>

2: 启用网络注册和位置信息非请求结果码+CREG:<stat>[,<lac>,<ci>]

<stat>

0:未注册,终端当前并未在搜寻新的运营商

1:已注册本地网络

2:未注册,终端正在搜寻基站

4:未知代码

5:已注册,处于漫游状态

<lac> 位置区编号

<ci>小区ID
注意:当设置AT+CREG成功时调制解调器回复OK.之后将网络注册状态通过响应返回。当网络注册状态发生改变时,调制解调器将状态通过响应反映上来。

LAC及CI也可以从+CCED命令查询出来。

3、AT+COPS(运营商选择)

AT+COPS=? 返回网络上支持的运营商描述列表,可能的返回结果如下:

+COPS: (2,"中国联通","CUCC","46001",0),(3,"中国移动","CMCC","46000"),,(0-4),(0-2)

读指令:AT+COPS? 返回当前选择的模式和网络运营商,格式为:+COPS:<mode>[,<format>[,<oper>]]OK

可能的返回结果:+COPS: 0,0,"中国联通",0

写指令:AT+COPS=<mode>[,<format>[,<oper>]] 强制选择和注册GSM网络运营商,返回:OK

参数:

<stat>    0 不知道

        1  可用的运营商

        2  当前运营商

        3  禁用的运营商

<oper>    运营商

<mode>   0  自动模式  <oper>被忽略

       1  手动选择

       2  从网络中手动注销

       3  选择尽有有格式

       4  手动或自动选择,如果手动失败,则自动使能

<format> 0  支持长字节格式,能升到16字节长

         1  短字节格式

         2  数字格式,

AT+CREG与AT+COPS结合使用事例:

AT+CREG=1//允许网络注册主动提供结果代码

AT+COPS=0//设置为自动模式

AT+COPS?//查询当前模式和网络运营商

4、AT+CSQ(读取信号强度)

返回+CSQ: 20.0之格式的信息,信号强度

5、AT+CMGF(设置短消息格式)

AT+CMGF=0 选择PDU格式,=1选择TEXT格式

6、AT+CMGS(发送短信)

若想发往13508485560,短消息内容为:“test“,则格式如下:

AT+CMGS="13508485560"(目的地址)回车 >test^z ;发送完号码后回车,符号”>”为系统返回,不是需要输入的符号。输入完短信内容后,按Ctrl+Z结束。

另一方面也可以发送命令AT+CMGS=6,即设置发送的短信的长度为6个。

7、AT+CSCA 设置短消息中心

AT+CSCA=“+8613800270500”回车(具体的号码由当地的运营商决定。其中+861380不变,后四位是地区区号。这里显示0270表示地区为武汉,后三位基本不变为500)。

AT+CSCA?可以得到短信中心号码。

8、AT+CSQ?(查询信号强度)

三. 发送短信

开发环境是ARM11&linux。例子是飞凌的6410开发板,3G模块选中兴的AD3812,

短信的发送一般分为三种模式:Block Mode, Text Mode和PDUMode,其中blockmode已经很少使用。下面介绍的内容,是在PDUMode下发送和接收短消息的实现方法。text模式发送短信的时候比较简单,pdu模式相比而言的话要麻烦一下。具体使用那种模式,还要看你的需求,如果所要发送的短信内容全部是英文或者数字的话可以使用text模,如果你发送的短信中含有中文字符或者汉子的话就只能用pdu模式进行发送了。
我做的短信开发,发送的信息包含中文,而且接收的短信命令中也有中文,所以使用的是pdu模式。使用pdu模式发送短信的步骤如下:
(1)串口初始化。
(2)构建SMS的pdu串。
(3)设置短信发送模块的模式。
(4)使用AT指令发送pdu串到指定的手机号码。
下面对以上步骤进行详细的解释:
(1)串口初始化,串口的初始化要按照短信发送模块的默认来设置,我所使用的AD3812的说明书上明确指出 :115200,8,N,1,即传输速率是115200,数据位是8位,无奇偶校验位,一位停止位。
(2)构建SMS的pdu串。这一步是整个过程最主要的一步,关系到发送能否成功。首先要知道短信pdu串的组成,sms pdu串主要由9个部分组成,按照顺序分别为 SCA(servicecenter adress)服务中心的电话号码;pdu—type(protocoldata unit type):协议数据但与类型;MR(messagereference) 所有成功的sms—submit参考数目;OA (originatoradress)发送方sme(short-message-entity)的地址;DA(destination)接收方SME的地址;PID(ProtocolIdentifier)参数显示SMSC以何种方式处理SM;DCS(datacoding scheme)参数表示用户数据采用什么编码方案;SCTS(servicecenter time stamp)smsc接收到消息是的时间戳;UDL,用户数据长度;UD,用户要发送信息的内容。

(3)之前已经说过了,使用pdu模式,所以这一步其实就是告诉设备,我们使用的是pdu模式,对用的at指令是:AT+CMGF=0\r.注意:\r表示的是回车,指令后面必须跟有\r设备才能识别。

(4)第1-3搞定之后,剩下的就是告诉设备发送该短信了,具体的命令是AT+CMGS=%d\r,%d是一个正整数,该数的值与你发送短信的内容有关系,%d=15+2*发送的字符数。

现在根据我做的具体来说明过程,希望对你有帮助:

上面已经把我的软硬件环境说明了,下面重点说明短信的发送过程,我需要发送的短信内容是:江大科茂欢迎您!目的电话号码是18796082112,我使用是移动的sim卡。最后构建的sms pdu为:0891683108501105F011000D91688197062811F2000800166C5F592779D183026B228FCE60A8FF01

如上所示,其实整个sms pdu构建过程中,需要自己做的只有四处,分别是发送方的短信中心号码,目的手机号码,短信内容长度,短信内容的unicode码。其中紫色的为所在地的短信中心号码,因为我用的是镇江移动的号吗作为发送手机号,所以从网上就可以查到,对应的短信中心号是13800511500,需要按照前后位交换,最后一位补F进行重新排列。3108501105F0。红色的为目的手机号码,也需要进行重新排列。绿色的是短信的内容的长度具体计算方法为:短信内容的字符数*2,并要注意要以4位16进制表示。蓝色的为短信内容“江大科茂欢迎您!”的unicode吗,网上可以查到,这样就sms pdu就构建完成了。还需要特别提醒一下的是,在pdu构建完成,向设备写pdu串的时候不要忘记最后要添加ctrl+z,因为这是设备识别pdu串结束的标志。ctrl+z的assic码是0x1a。其中还要重点提一下就是 AT+CMGS=?的计算方法 15+短信字符数*2。具体的实现代码如下。

charsmstype[]="AT+CMGF=0\r";

charsmscmgs[]="AT+CMGS=31\r";

charpdu[]="0891683108501105F011000D91688197062811F2000800316C5F592779D183026B228FCE60A8FF01

\0x1a";

write(fd_usb,smstype,sizeof(smstype));

usleep(20000);

write(fd_usb,smscmgs,sizeof (smscmgs));

usleep(20000);

write(fd_usb,pdu_warn,sizeof(pdu_warn));

usleep(20000);

四. 开发其他功能,详细参见AT指令集

[3G/4G]3G/4G模块开发的更多相关文章

  1. Android与.Net交互模拟用户屏幕操作添加APN和网络4G/3G切换

    前几天接到一个需求,我们的客户需要对手机网络接入点进行可用性测试,简单点说就是需要实现Android上的APN配置的添加,APN切换网络模式4G/3G/2G切换,我要调研下写个demo. 因为是要实现 ...

  2. STM32开发 -- 4G模块开发详解(转)

    STM32开发 -- 4G模块开发详解(1) STM32开发 -- 4G模块开发详解(2) STM32开发 -- 4G模块开发详解(3) STM32开发 -- 4G模块开发详解(4)

  3. 迅为IMX6开发板支持4G全网通模块GPS模块

    IMX6开发板特点 处理器:IMX6开发板支持4G全网通模块GPS模块. 核心板配置:2GB DDR3内存  16GB EMMC 存储,扩展引脚多达320个:运行温度-20 ℃到+80 ℃之间. 核心 ...

  4. Luatools v2烧录教程(适用于2G、4G Cat.1、4G Cat.4模块)

    目录,可以根据需要直接点击跳转: 下载LuaTools工具 2G模块烧写教程(Air2xx系列.Air8xx系列) 连接模块 刷入AT版本的lod 刷入任意的lod固件 下载lua脚本文件 [4G 模 ...

  5. AngularJS多模块开发

    angularJS中的多模块开发是指多个module模块开发,步骤为: 1. 确定主模块    var app=angular.module('myApp',[]); 2. 其他的子模块添加到主模块后 ...

  6. js模块开发(一)

    现在嵌入页面里面的javascript代码越来越复杂,于是可能依赖也越来越严重,使用别人开发的js也越来越多,于是在理想情况下,我们只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 于是j ...

  7. seajs实现JavaScript 的 模块开发及按模块加载

    seajs实现了JavaScript 的 模块开发及按模块加载.用来解决繁琐的js命名冲突,文件依赖等问题,其主要目的是令JavaScript开发模块化并可以轻松愉悦进行加载. 官方文档:http:/ ...

  8. Asp.net Mvc模块化开发之“开启模块开发、调试的简单愉快之旅”

    整个世界林林种种,把所有的事情都划分为对立的两个面. 每个人都渴望的财富划分为富有和贫穷,身高被划分为高和矮,身材被划分为胖和瘦,等等. 我们总是感叹,有钱人的生活我不懂;有钱人又何尝能懂我们每天起早 ...

  9. 基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)--模块开发

    之前文章中给大家说明了下我这个小小的想法,发现还是有不少人的支持和关注.你们的鼓励是对我最大的支持. 我总结了了大家的评论,有以下几个问题: 1.希望有更多的文档说明. 2.希望介绍下Orchard的 ...

  10. js 模块开发之一(模块开发价值)

    首先引用我们的今天的主角 ----<前端模块化开发的价值> 1,前端开发最常见的两个问题 ---命名冲突和文件依赖 2,对于命名冲突的基本解决办法就是学习其他语言的习惯,添加命名空间 va ...

随机推荐

  1. web.xml文件头出错

    原先将web.xml文件头设置为如下格式 <?xml version="1.0" encoding="UTF-8"?><web-app ver ...

  2. iOS10 完美降级 iOS9.3.2,保留全部数据

    本篇文章由:http://xinpure.com/downgrade-ios10-perfect-ios9-3-2-retention-of-all-data/ iOS 10 Beta版尝鲜 前段时间 ...

  3. NuGet学习笔记(1) 初识NuGet及快速安装使用[转]

    来自:http://www.cnblogs.com/lzrabbit/archive/2012/05/01/2477607.html 关于NuGet园子里已经有不少介绍及使用经验,本文仅作为自己研究学 ...

  4. MySQL 如何更新某个字段的值为原来的值加1

    格式:update 表名称 set 字段名称 = 字段名称 + 1 [ where语句] 比如说数据库中有一张student表,要想把id为1的学生成绩(score)加1则update student ...

  5. fcntl函数用法详解

    功能描述:根据文件描述词来操作文件的特性. #include <unistd.h> #include <fcntl.h>  int fcntl(int fd, int cmd) ...

  6. socket概述和字节序、地址转换函数

    一.什么是socket socket可以看成是用户进程与内核网络协议栈的编程接口. socket不仅可以用于本机的进程间通信,还可以用于网络上不同主机的进程间通信. socket API是一层抽象的网 ...

  7. Dev BarManager使用方法

    作者:jiankunking 出处:http://blog.csdn.net/jiankunking 近期使用BarManager时候.发现一个问题就是在一開始把BarManager控件拖到窗口上的时 ...

  8. MIME类型释义--MIME类型大全--web.xml中有关<mime-mapping>配置说明

    最早的HTTP协议中,并没有附加的数据类型信息,所有传送的数据都被客户程序解释为超文本标记语言HTML 文档,而为了支持多媒体数据类型,HTTP协议中就使用了附加在文档之前的MIME数据类型信息来标识 ...

  9. SQL Server 2012 Express LocalDB 的作用

    微软最新推出的 SQL Server 2012 Express LocalDB 是一种 SQL Server Express 的运行模式,特别适合用在开发环境使用,也内置在 Visual Studio ...

  10. docker lnmp php

    使用 Docker 构建 LNMP 环境 https://segmentfault.com/a/1190000008833012 Docker 快速上手指南 https://segmentfault. ...