新款 西门子 Siemens MiniTC35/TC35i GSM 开发板
笔者文章刊登于2008年10月《无线电》杂志“GSM模块——实现远程控制的新锐 ”一文,文章中我们介绍了一些常用的GSM模块,其中使用最为广泛的是西门子的TC35或TC35i模块,因此,我们在2008年推出了“西门子 Siemens TC35/TC35i GSM 开发板”,自投放市场以来,受到了广大用户的好评,品质、质量、做工、资料属于一流,我们成功开发了短信控制继电器的源程序代码,使用C语言平台,使用51单片机来收发短信,方便了很多客户进行二次开发,也有不少客户在我们开发板的平台上快速、高效地完成了二次开发,做了一系列的GSM控制产品。
2008-2009年,我们根据用户的反馈情况与建议,将硬件与设计的软件做了相应的完善,推出了09新款,修正了之前的一些BUG,PCB硬件的版本号分别有1.0、1.1、1.2、1.3版,目前TC35开发板带继电器的款式最新为1.3版。1.3版到现在为止已有大半年的时间,现在我们再次根据用户反馈与市场需求相结合,推出了2010新款 MiniTC35/TC35i开发板,在硬件上保留了原来硬件产品稳定性的特点,对硬件资源做了重新调整,以适合不同人群的需要。 MiniTC35/TC35i 开发板译为迷你型TC35/TC35i开发板,板上去除了原有的8路继电器,但在硬件上增加了一些资源。非Mini版的TC35开发板突出的是控制功能,新款的MiniTC35/TC35i开发板对各方面功能做了兼顾性的设计方式,我们给用户提供了更好、更优的产品,希望大家喜欢。
对于GSM模块的说明:有很多用户经常会咨询我们TC35、TC35I、MC35、MC35I的区别,MC35系列的模块,主要是支持GPRS,MC35I比MC35的速度要快,而TC35和TC35I的区别在于外形,体积,电压都不同,有一些指令也不同,经常我们实际比对测试,TC35I的功耗比TC35要小一些,其它没有太多的区别,当然用户最关心的还是价格的问题,TC35I比TC35要贵不少,如果用户用来做一些短信和语音方面的功能,那完全可以使用TC35模块,我们可以提供稳定的货源,对于MC35和TC35,如果你一定要用到GRPS功能,那只能选择MC35系列模块,MC35I比MC35的速度要快,但价格要高一些。对于使用TC35、TC35I、MC35、MC35I的模块,都可以直接在我们的开发板上使用,管脚都是完全兼容的,我们也经过实测。
新款 西门子 Siemens MiniTC35/TC35i GSM 开发板 2011年最新款式
这是 西门子 Siemens TC35/TC35i GSM 开发板,目前最新已更新到V1.3版
硬件资源与特点介绍:
1、板载优质电源开关,方便程序调试与开关机操作。
2、电源设计使用大电流专用电源IC模块29302,保证电源电路稳定供电。现在市场上的一些廉价开发板我们看到很多是直接使用LM7805,因为5V的输出电压已经非常接近TC35模块的上限临界点,所以长时间工作,稳定性差,比较比较危险,7805的输出电流最大只能是1.5A,而我们使用的29302最大的输出电流可达3A,要知道GSM通信时,有时瞬间的电流是非常大的,特别是在一些信号不好的地方,为了搜索网络信号,模块会提升自己的发射功率,这时的电流消耗是非常大的了,电源电路做得不好,稳定性的话,就会体现出问题了。我们曾对市场上一些开发板进行过抽样测试,事实发现有很多板子在一些信号差的情况下,都不能正常通信与工作,我们测试时做了相应的屏蔽控制。
3、板载硬件资源接口丰富:
——提供了12864点阵液晶接口:可以显示数字、英文、中文和任何形状的图形,对比度通过电位器可进行调节,同时,还可以直接连接NOKIA5110液晶晶,该屏使用非常广泛,也很廉价。
TFT彩屏专用接口:真彩色显示各类文字和图像,将开发板做成手机的操作界面并非不可能,只要发挥你的想像力,做个NOKIA手机界面不是不可能。
蜂鸣器电路:5V有源蜂鸣器驱动,可以发生提示音,方便用户调试程序和做提醒功能的设置,小巧而实用的功能。
DS18B20温度传感器接口:1线式数字温度传感器接口,只占用一个单片机I/O口,即可获得实时温度值,稳定可靠。
4个直控按键:用户可以在程序中自定义按键功能,实现按键控制,我们提供的DEMO程序已可以通过按键来拨打电话和发送短信的控制。
4、8路LED状态指示灯:用户可以通过点亮和熄灭8路LED发光管,方便程序调试工作。同时我们提供了短信控制LED发光二极管的例子程序。
5、三种通信跳线方式:PC与TC35/TC35I模块通信;
PC与单片机通信:板上的STC89C52单片机芯片可以通过串口完成ISP下载程序,无需额外的编程器。
单片机与TC35/TC35I模块通信。
6、开放单片机I/O扩展口:单片机40引脚口全部外留,供用户外扩展使用,在单片机两边各放了20个孔,全部与芯片引脚直接相连。
7、板载话筒、听筒接口:我们在板子设计了模块的话筒电路接口,用户只要直接焊上麦克风话筒即可摘机进行远程监听,也可以实现语音拨打电话的功能,听筒接口也已预留。
8、STC89Cxx,最高频率可达90MHz,片内4K以上FLASH程序存储器,8K左右的片内EEROM ,512B-1208B片内RAM,36个IO口。
9、1个LED指示灯:一个电源指示。
10、ISP接口(用于程序下载、串口监视)。
11、RS232接口ISP;支持串口调试。
12、9v直流电源输入:带电源指示灯。
产品设计与加工工艺:
1、开发板四周增加螺丝定位孔,方便板子的固定。
2、开发板PCB板上增加天线定位孔,方便GSM天线直接固定在板子上,而不需要外拖天线。
3、使用波峰焊工艺,焊点漂亮,做工精致。
4、贴片元件设计与加工工艺,所有电解电容使用昂贵的优质钽电容,保证电源稳定可靠。
套装清单:——售价:400元/套 (西门子 Siemens MiniTC35/TC35i GSM 开发板 )
MiniTC35/TC35i GSM 开发板 :1块 (板上带有Siemens 西门子TC35模块,如需将标配更换成TC35i,需要补差价,请先电话和我们联系)
外接电源:1个
RS232串口线:1条
配套光盘:1份
GSM 专用天线:1个
TC35 专用天线转接线:1个 (已焊接固定在PCB板上)
光盘附送相关资料:
AT指令集;SIEMENS_TC3x接口描述;Siemens TC35i数据手册
TC35外围电路图及开发板电路原理图
TC35测试程序(PC机端程序)
TC35通过电脑发短信的实例程序(含VB源程序代码)
TC35通过单片机收发短信和控制硬件实例程序—— Keil C源程序代码 本公司全新力作,国内首创!
——程序所能完成的功能如下:
1、通过发短信点亮和熄灭8路LED发光管(会控制发光管亮与灭就可以控制继电器开与关,道理一样);
2、通过发短信控制蜂鸣器报警鸣音;
3、按板上第一个按键,自动拨打程序中设定好的目标电话号码;
4、按板上第二个按键,自动发送DS18B20温度传感器测到的温度值给程序中设定好的目标手机号码;
5、按板上第三个按键,自动发送测试“DEMO”短信给程序中设定好的目标手机号码,发送文字“DEMO”;
6、按板上第四个按键,控制液晶显示内容,用户可以自定义显示文字、数字及图形,给大家一个良好的人机界面;
我们的配套光盘中提供了12864液晶屏、Nokia5110液晶屏、TFT彩屏的液晶驱动程序,都有完整的C语言例程,方便用户直接更改嵌入主程序。
串口调试助手软件
STC芯片烧写软件
注意:该开发板可适用于TC35/TC35i/MC35/MC35i 模块,我们下面的介绍以TC35模块为例。
GSM串口调试助手软件 2010年6月24日更新发布
这是我们为TC35开发板专门编写了GSM串口调试助手软件,调试AT指令,测试模块工作更为方便、快捷,功能强大。
大家可以从窗体中看到上半部分为知名的串口调试助手软件全部功能,下面我们专门编写了GSM调试功能,同时支持SIM300 GRPS模块的调试。
这是我们在2008年10期《无线电》杂志上刊登的TC35模块介绍文章,大家也可以直接翻阅《无线电》杂志。
这是我们的“西门子 Siemens TC35/TC35i GSM 开发板 ”的操作演示视频录像,大家可以点击下载视频文件进行观看,视频中我们介绍了学习板的硬件和软件资料的情况以及初次使用的应用实例,大家可以做个参考,很多原理都是一样的。注意,为了达到最好的显示效果,请全屏播放进行观看
-->>下载高品质视频文件 http://www.hificat.com/tc35/tc35.rar
点击上面窗口进行在线播放 ,双击进行全屏观看
概述
西门子GSM模块 (TC35/TC35i/MC35/MC35i) 开发(评估)板是采用51单片机+TC35(GSM)为核心部件综合实验板。单片机采用STC89C51系列MCU,最高工作速度可达90MHz,片内FLASH程序存储器和8K左右的片内EEROM,多达36个通用I/O口。通过RS232实现ISP编程;
TC35(TC35i/MC35/MC35i)无线GSM/GPRS通信模块, 集成了标准的RS232接口以及SIM卡,可以在PC机上用AT命令通过串口对它进行设置。这使它成为在声音和数据通讯上通用的一个GSM/GPRS双频终端产品。 你可以快速的把它应用到产品开发上,同时它也可以作为产品的一个组成部分和产品结合在一起。在无线短信工业控制、远程通讯,现场监控等诸多无线通讯领域开发板将会给您的工作带来极大的便利.
该板方便用户实验、开发,根据用户的设计思维自由组合很快将思想变为产品,无论用户有无GSM方面的知识累积,该板都是良好助手。
实验说明:
◆ 短信收发实验。
◆ 话音呼叫实验。
◆ AT指令实验。
TC35模块通过电脑联机,DEMO程序。
这是模块DEMO测试程序,我们可以用来读取模块预存的各种出厂信息,以及发送中文短信的实例应用。 直接点击图片放大观看。
这是模块DEMO测试程序,我们可以用来读取模块预存的各种出厂信息,以及发送英文短信的实例应用。 直接点击图片放大观看。
另一款TC35模块测试程序,这个程序可以完成拨号操作,同时实时显示模块操作的各条AT指令,上图为连接模块初始化成功的反馈信息 “OK”。
另一款短信发送接收软件。
下面我们来看一下miniTC35开发板的一些硬件资源特写:
使用优质40PIN扁线座,方便与TC35模块进行连接,接触性好。
优质SIM卡插座,打开卡座,插入GSM手机SIM卡即可。
这里我们放入一张站长使用了N年,历史悠久的SIM卡,表面已经是伤痕累累了:)
这是装上SIM卡后的样子。
8路LED发光管指示 注:其中 KinCony 为我公司使用的注册商标或商标。
SMA天线接口,我们只要将GSM天线直接拧上即可,而现在市场上大部分开发板都需要将天线和天线转接线拖着,很容易拉坏GSM模块上面的天线扣,实在脆弱。
镀金的GSM SMA天线座,保证了接触良好性。
我们只需要将GSM天线拧上即可,非常方便。
GSM天线与SMA插座进行相连。
这是串口设置跳线,方便我们设置PC机、单片机、GSM模块三者之间进行两两通信。
三种通信方式跳线:PC与单片机通信;PC与TC35/TC35I模块通信;单片机与TC35/TC35I模块通信。
如果要使用电脑来收发短信或进行语音呼叫实验,请将跳线设置成:PC与TC35/TC35I模块通信。
如果要给单片机芯片烧写程序,即完成ISP下载功能, 请将跳线设置成:PC与单片机通信。
如果要使用单片机来控制TC35/TC35I模块,请将跳线设置成:单片机与TC35/TC35I模块通信。
这是PCB板反面的样子。
元件全部使用优质贴片器件,质量稳定可靠。
板载4个直控按键供用户使用。
DS18B20数字温度传感器。
板载话筒电路,用户只要直接将麦克风和PCB焊进行连接即可,市场上有很多称板载话筒接口,它只是提供了接口,但实际上我们经过实验,如果麦克风和TC35模块直接进行连接并不能达到比较理想的通话效果,因此,我们在设计时,加入了话筒的耦合电路,保证通话声音清晰,音质佳。
图中蓝色的电位器用来调节12864液晶显示屏的对比度。
外接9V电源接口,同时板载了优质电源开关,方便通断电源。
与PC电脑连接的RS232串口,串口引脚序号可以从插座上看到。
核心电源管理IC-29302,保证了GSM模块稳定可靠的4.2V电源。
外接喇叭接口,方便用户进行语音通话实验。
连接天线后的SMA头。
IPX转SMA线我们根据经验,直接将其焊接在板子上比较不容易损坏,另一端直接扣在TC35模块上即可,避免了拉扯天线的可靠性,以便损坏GSM模块天线扣。
注意:该接口比较脆弱的,拔插时请千万小心,不可乱用力,一定要对准了再下压。
优质IPX转接线,与TC35模块进行扣式相连,现在很多节省成本的做法就是将信号线直接焊接在TC35模块上,但更换模块非常麻烦,带扣的只需要拔插转换线即可更换新模块。
将IPX线头与TC35/TC35I模块的天线孔对准了,再压下去,听到“喀喳”一声,说明连接到位了,如果需要将其再取下,请务必小心,慢慢将线头拔出。
优质40PIN扁平线,耐弯、耐压,接触性好。
这是我们更换成TC35i模块的开发板实样。
下面我们一起来看一下开发板提供的“TC35通过单片机收发短信和控制继电器例子程序”。
先来看一下我们的“西门子 Siemens TC35 GSM 开发板”的短信控制指令介绍与使用方法:
1. 给开发板供上9v直流电源后,板子上LED9点亮,表明开发板已经正常上电。
2. 此时会看到LED10一闪一秒,亮灭间隔时间相同,此状态表明TC35正处于搜寻网络状态。大概一分钟以后(不确定具体时间,看当时所处环境的信号强度)。
3. 当LED10出现短灭常亮的状态时,表明TC35已经搜寻到网络信号,处于待机状态。
4. 此时可以通过手机发送指令通过TC35模块接收来实现对单片机的控制,进而实现对继电器的控制。
以下为具体指令介绍:
假如模块SIM卡上的手机号码为:13675857933
通过手机发送短信到13675857933;
指令如下:
1.点亮LED指示灯
发送open?(?代表选择第几个LED指示灯,注意open是小写),如发送open1到目标号码,片刻后将会看到板子上的LED1灯点亮,此时手机将收到来自目标号码的自动回复,回复内容为:Operate Successfully!。此时表明此次操作已经成功。如果你发送的指令错误,手机将会收到来自目标手机的短信提醒,告诉你当前的操作失败,操作失败的短信回复内容为:Operate Failed,try again!此时你可以检查是否发送正确指令给模块,再次操作!(板子上一共有8路LED指示灯,所以发送的指令如下open1,open2,open3,open4,open5,….open8,一次只能打开一个LED指示灯,下一次操作不会影响前一次的操作)。
2.熄灭LED指示灯
发送shut?(?代表选择第几个LED指示灯,注意shut是小写),如发送shut1到目标号码,如果先前LED指示灯1是处于开启状态的话,则会看到如下结果,LED1灯熄灭,如果先前LED指示灯是处于熄灭状态的话则不会有任何反应。一会儿以后手机将收到来自目标号码的自动回复,回复内容为:Operate Successfully!。此时表明此次操作已经成功。如果你发送的指令错误,手机将会收到来自目标手机的短信提醒,告诉你当前的操作失败,操作失败的短信回复内容为:Operate Failed,try again!过一会儿你可以检查是否发送正确指令给模块,再次操作!(板子上一共有8路LED指示灯,所以发送的指令如下shut1,shut2,….shut8,一次只能打开一个LED指示灯,下一次操作不会影响前一次的操作)。
3.LED指示灯,开关的全部打开和全部关闭
发送指令openO表示打开所有LED指示灯,shutS表示关闭所有LED指示灯。过一会儿手机将收到来自目标号码的自动回复,回复内容为:Operate Successfully!。此时表明此次操作已经成功。如果你发送的指令错误,手机将会收到来自目标手机的短信提醒,告诉你当前的操作失败,操作失败的短信回复内容为:Operate Failed,try again!此时你可以检查是否发送正确指令给模块,再次操作!
5. 状态查询
发送open?代表查询开关状态,如发送open?到开发板上SIM卡的号码,片刻之后,将会收到来自目标号码的短信:如:11110000
Operate Successfully!
的短信.其中1表示此路LED指示灯处于开着的状态.0表示现在LED指示灯处于关闭状态。
6. 控制蜂鸣器报警鸣音
发送open9使蜂鸣器鸣音报警,如发送open9到开发板上SIM卡的号码,片刻后将会听到板子上的蜂鸣器开始“滴滴滴”发生声响,此时手机将收到来自目标号码的自动回复,回复内容为:Operate Successfully!。此时表明此次操作已经成功。如果你发送的指令错误,手机将会收到来自目标手机的短信提醒,告诉你当前的操作失败,操作失败的短信回复内容为:Operate Failed,try again!此时你可以检查是否发送正确指令给模块,再次操作!
以下为部分实验演示图片:
首先,将我们的短信控制的单片机程序烧入STC89C5x芯片后,插上9v外接电源,SIM卡找到网络信号成功注册后,此时会看到LED10一闪一秒,亮灭间隔时间相同,此状态表明TC35正处于搜寻网络状态。大概一分钟以后(不确定具体时间,看当时所处环境的信号强度)。下面,我们准备打开第一路LED指示灯。
我们使用的是Nokia6300手机,编缉短信内容为:open1 , 发送到号码为13675857933的开发板,接着手机显示“正在发送短信”,发送成功后,手机显示“已发送至XXXXXXXX号码”,之后,开发板收到了短信指令,随即打开第一路LED指示灯,并反馈控制成功的短信给手机操作者。
我们现在看到板子上的LED1灯点亮,此时手机将收到来自目标号码的自动回复,回复内容为:Operate Successfully!。此时表明此次操作已经成功。
我们现在来测试一下全开LED指示灯的功能,编缉短信内容为:openO , 发送到号码为13675857933的开发板,发送成功后,手机显示“已发送至XXXXXXXX号码”,之后,开发板收到了短信指令,随即打开全部LED指示灯,并反馈控制成功的短信给手机操作者。
我们现在来测试一下关闭第一路LED指示灯的功能,编缉短信内容为:shut1 , 发送到号码为13675857933的开发板,发送成功后,手机显示“已发送至XXXXXXXX号码”,之后,开发板收到了短信指令,随即关闭第一路LED指示灯,并反馈控制成功的短信给手机操作者。
这是我们给开发板上电时,通过串口调试助手软件看到的,TC35模块初始化时的各条指令。注意:+8613800571500 是浙江省杭州地区的移动短信服务中心号码,您给开发板使用不同地区的SIM卡,请在程序中设置正确的当地ISP移动电话服务商提供的短信中心号码。
这是收到来自13185018567手机短信后的指令情况,开发板做出控制LED指示灯的动作后,反馈给手机用户“Operate Successfully!”的成功控制短信信息。
这是我们提供的“TC35通过单片机收发短信和控制LED指示灯例子”源程序代码,使用Keil C环境编写,大部分语句都加了中文注释,让开发者很容易上手,缩短了二次开发的周期,提高了开发效率。
部分程序代码截图。
函数的定义与说明。
短信指令的识别与LED指示灯的控制代码。
-------------------------------------------------------------------------------------------------------------------------------
西门子 TC35i模块介绍
TC35i新版西门子工业GSM模块是一个支持中文短信息的工业级GSM模块,工作在EGSM900和GSM1800双频段,电源范围为直流3.3~4.8V ,电流消耗——休眠状态为3.5mA,空闲状态为25mA,发射状态为300mA(平均),2.5A峰值;可传输语音和数据信号, 功耗在EGSM900(4类)和GSM1800(1类)分别为2W和1W ,通过接口连接器和天线连接器分别连接SIM卡读卡器和天线。SIM电压为3V/1.8V,TC35i的数据接口(CMOS电平)通过AT命令可双向传输指令和数据,可选波特率为300b/s~115kb/s , 自动波特率为1.2kb/s~115kb/s。它支持Text和PDU格式的SMS(Short Message Service,短消息),可通过AT命令或关断信号实现重启和故障恢复,中文资料如下:
TC35i由供电模块(ASIC)、闪存、ZIF连接器、天线接口等6部分组成。作为TC35i的核心基带处理器主要处理GSM终端内的语音和数据信号,并涵盖了蜂窝射频设备中的所有模拟和数字功能。
TC35i硬件设计:
TC35i模块有40个引脚,通过一个ZIF(Zero Insertion Force,零阻力插座)连接器引出。这40个引脚可以划分为5类,即电源、数据输入/输出、SIM卡、音频接口和控制。
TC35i的第1~5引脚是正电源输入脚通常推荐值4.2V,第6~10引脚是电源地。11、12为充电引脚,可以外接锂电池,13为对外输出电压(共外电路使用),14为ACCU-TEMP接负温度系数的热敏电阻,用于锂电池充电保护控制。
15脚是启动脚IGT,系统加电后为使TC35i进入工作状态,必须给IGT加一个大于100ms的低脉冲,电平下降持续时间不可超过1ms。
16~23为数据输入/输出,分别为DSR0、RING0、RxD0、TxD0、CTS0、RTS0、DTR0 和DCD0。tc35i模块的数据输入/输出接口实际上是一个串行异步收发器,符合ITU-T RS232接口标准。它有固定的参数:8位数据位和1位停止位,无校验位,波特率在300bps~115kbps之间可选,默认9600。硬件握手信号用RTS0/CTS0,软件流量控制用XON/XOFF,CMOS电平,支持标准的AT命令集。
其中18脚RXD、19脚TXD为TTL的串口通讯脚,需要和单片机或者PC通讯。
TC35i使用外接式SIM卡, 24~29为SIM卡引脚,SIM卡同TC35i是这样连接的:SIM上的CCRST、CCIO、CCCL、CCVCC和CCGND通过SIM卡阅读器与TC35i的同名端直接相连,ZIF连接座的CCIN引脚用来检测SIM卡是否插好,如果连接正确,则CCIN引脚输出高电平,否则为低电平。
TC35i的第32脚SYNC引脚有两种工作模式,一种是指示发射状态时的功率增长情况,另一种是指示TC35i的工作状态,可用AT命令AT+SYNC进行切换,本模块使用的是后一种。当LED熄灭时,表明TC35i处于关闭或睡眠状态;当LED为600 ms亮/600ms熄时,表明SIM卡没有插入或TC35i正在进行网络登录;当LED为75 ms亮/3s熄时,表明TC35i已登录进网络,处于待机状态。
30、31、32脚为控制脚,其中30为RTC backup,31为Power down,32 为SYNC。
35~38为语音接口,35、36接扬声器放音。37、38可以直接接驻极体话筒来采集声音(37是话筒正端,39是话筒负端)
TC35I开发技巧:
模块的供电电压如果低于3.3V会自动关机。同时模块在在发射时,电流峰值可高达2A。同时在此电流峰值时,电源电压(送入模块的电压)下降值不能超过0.4V。所以该模块对电源的要求较高,电源的内阻+FFC联接线的电阻必需小于200mΩ。
单片机通过两根I/O口控制TC35的开关机、复位等,通过串口与TC35进行数据通信,通信速率为9600Kbps,采用8位异步通讯方式,1位起始位,8位数据位,1位停止位。
TC35模块输入输出的TTL正电平逻辑不是+5V,而是+2.9V,因此必要时加端口保护。
新版德国西门子工业级GSM模块TC35i套装 ,清单如下:
1、TC35i模块一个
2、SIM卡座一个
3、GSM天线转接线一根
4、GSM小天线一根
5、40芯专用排线及接插件一个
TC35i模块的详细英文PDF资料 >>下载
TC35I西门子工业GSM模块 250元一个
40芯0.5mm间距扁平排线3厘米长 5元一个
40PIN 间距0.5mm 翻盖式专用排线卡座 5元一个 主要用于连接TC35I与目标板的连接。
TC35I专用天线转接线 10元一根 村田头转成SMA接口,主要用于TC35I模块和GSM天线的连接。是每个西门子模块必备的产品.
GSM小天线(SMA接口) 10元一个
这是SIM卡座 5元一个
LM2941CS 7元一片 它是开关型可调高性能微波电路专用稳压芯片,上图中最左边的第一脚是电压调整端,提供1.28V的基准电压,可以通过外围两个电阻的分压比能灵活改变输出电压,第二脚是控制端,高电平时关闭电源模块,低电平时模块正常工作,第三脚是地,第四脚是电源输入端,第五脚是电压输出端,例如TC35理想工作电压是4.2V。
很多客户对TC35I不太熟悉,对如何调试无从下手,我们以TC35I试验板为例来简单说一下,首先将内正外负的9v直流电源接通试验板的插座中,测量LM2941CS的第5脚是否输出4.2V的直流电压?如果没有检查2941的第2脚是否接地?然后通过排线连接TC35I,插好手机卡并接好天线转接线和GSM天线,再通电测量TC35I的第1~5脚是否有4.2V电压?将TC35I的第16脚也就是单片机的P1.3脚对地短路一下,这时TC35I就能启动,等1分钟后,用其他电话拨打手机卡号,如果不能接通重点检查排线座和SIM卡的6根线是否有接触不良?如果能接通说明TC35I正常,如果直接用单片机调试是非常困难的,可以将TC35I的串口脱离单片机通过RS232电平转换后连接电脑的串口,先用我们开发的短信息收发专用软件(点击下载 ) 进行测试,如果能正常工作再用串口调试助手软件(点击下载 )进行AT命令测试。最后用单片机调试。
以下是我们对TC35i模块进行维修中的照片,TC35和TC35i使用上基本上差不多,在外观形状上,TC35i比TC35略有不同。
取下TC35i模块的屏蔽罩
这是取下屏蔽罩后的样子,内部还有IC。
使用热风枪对BGA芯片进行焊接
使用热风枪对BGA芯片进行焊接
进行串口调试时,可以先发送AT,看看TC35I模块是否能回答AT OK,如果行说明串口部分硬件正常,如果不能回复,请顺着串口的两根PCB走线检查,看看4053的两根飞线是否连接正确?TC35I排线座上的两根串口线是否接触不良?如果TC35I和单片机的供电电压相同,可以去掉220欧姆的保护电阻。
还有AT命令比较复杂,不同生产日期的TC35I模块的AT指令可能有一些区别,请客户以实践为准耐心调试,一个复杂的系统完全指望别人是不可能成功的,请务必保持一定的心理准备。
-->>点击这里可以下载到详细的TC35I英文使用说明书
-->>点击这里可以下载到简编的中文AT指令 集
下面我们列举一些常用的AT指令:
控制端发送的AT指令
TC35回答
指令的功能
备注
AT
OK
通讯握手
AT+CLCC
OK
来电话时有信号输出
串口输出:RING
AT+CMGL=0
读取全部未读过的SMS消息
AT+CMGL=2
列出已有的短信息
AT+CMGL=4
读取全部SMS消息
AT+CMGR=X
读取第X条短消息
AT+CMGF=0
用PDU格式
AT+CMGD=X
删除第X条短消息
AT+CGSN
读取TC35I的序列号
例如:351254004238596
AT+CSCA
显示短信息中心地址
AT+CMGW
写短信息并存储。
ATD051383082087;
拨打051383082087电话
注意需要最后的分号
AT+CNMI=1,1,2
OK
例如:+CMTI:“SM”,4 4表示手机内短消息数量
这是用串口调试助手成功发送的中文短信息完整过程,短信中心号码:13800513500 短信接收方号码:13306285091 短信内容:晚上好123 红色表示发送的内容,蓝色表示接收到的数据,黑色表示备注。
AT (回车)通讯握手
OK
AT+CMGF=0 设置为PDU模式,因为要发送中文汉字
OK
AT+CMGS=6 发送短消息的字节数
> 表示可以接收数据
0891683108503105F011000B813103265890F10008A90C665A4E0A597D003100320033 包含短信中心、接收方手机号码和短信内容的数据
1A 发送结束标志,一定要十六进制大写模式,不是ASIC码!(可以在串口调试助手中勾选十六进制选项)只有最后发送1A十六进制码后短信才会被成功发出!
+CMGS: 45
OK 表示 第45条短信发送成功
下面分析这条信息:
08——表示短消息中心地址长度;
91——表示短消息中心号码类型;
68----中国代码
3108200905F0——表示短消息房层中心号码;1380 0290 500
0103——表示发送短消息的编码方式;
0D——表示目的地址长度;
91——表示目的地址类型;
683199312523F9——表示接收短消息的手机号码为13991352329(前面68是固定的,后面的手机号码每2位掉换一下位置,最后一位前面加入F)
3208——表示发送中文字符方式;
0C——表示短消息长度;
665A4E0A597D003100320033——表示发送中文字符的UNICODE码
汉字的中文内码: 665A{晚} 4E0A{上} 597D{好} 0031{1} 0032{2} 0033{3}。
单片机实现短信自动发送
进行短信发送的前提是短信内容的正确编码。经过以上对短信发送过程的分析,可以通过单片机对其进行实现。下面是实现程序例程:
/*-------------------------------------------------------------------------
函数名:PDU_SMS()
功能 :发送短信
参数说明:SMS_Center为短信中心号码 11位
SMS_Telenum为短信接收方的号码 11位
SMS_Context为短信的内容
--------------------------------------------------------------------------------*/
int PDU_SMS(char *SMS_Center, char *SMS_Telenum,
char *SMS_Context,char is_GB)
{
int i,j;
unsigned char len,time;
char lens[3];
time=0;
for(i=0;i<300;i++) PDU_Code[i]=PDU_t[i];
/*----------设置短信中心号码--------------*/
for (i = 0, j = 0; i < strlen(SMS_Center) / 2; i++)
{
PDU_Code[6+(j++)] = SMS_Center[2 *i + 1];
PDU_Code[6+(j++)] = SMS_Center[2 *i];
}
PDU_Code[6+j++] = 'F'; //在最后补上的F
PDU_Code[6+j] = SMS_Center[strlen(SMS_Center) - 1];
/*---------------------------------------------*/
/*----------设置接收号码--------------*/
for (i = 0, j = 0; i < strlen(SMS_Telenum) / 2; i++)
{
PDU_Code[26+(j++)] = SMS_Telenum[2 *i + 1];
PDU_Code[26+(j++)] = SMS_Telenum[2 *i];
}
PDU_Code[26+j++] = 'F';
PDU_Code[26+j] = SMS_Telenum[strlen(SMS_Telenum) - 1];
/*---------------------------------------------*/
/*----------设置短信内容长度--------------*/
if(is_GB==0)
len = strlen(SMS_Context) *2;
else
len = strlen(SMS_Context);
PDU_Code[44] = (len >> 4) > 9 ? (len >> 4) + 55: (len >> 4) + 48;
PDU_Code[45] = (len &0x0f) > 9 ? (len &0x0f) + 55: (len &0x0f) + 48;
/*---------------------------------------------*/
/*----------编码短信内容--------------*/
if(is_GB==0)//如果不是GB码,短信内容为ascii码字符串
{
for (i = 0,j=0; i<strlen(SMS_Context);i++)
{
szzh16(SMS_Context[j++],lens);
PDU_Code[46+i*4] = '0';
PDU_Code[46+i*4+1] = '0';
PDU_Code[46+i*4+2] = lens[0];
PDU_Code[46+i*4+3] = lens[1];
}
PDU_Code[46+i*4] = 0x1a;
PDU_Code[46+i*4+1] = 0xff;
}
else
//短信内容为GB码,如果要使手机能够显示,改到UNICODE编码
{
for (i = 0,j=0; i<strlen(SMS_Context);i++)
{
szzh16((int)SMS_Context[j++],lens);
PDU_Code[46+i*2] = lens[0];
PDU_Code[46+i*2+1] = lens[1];
}
PDU_Code[46+i*2] = 0x1a;
PDU_Code[46+i*2+1] = 0xff;
}
/*---------------------------------------------*/
if(PDU_HandShake())
{
do
{
//LCD_PutChn(5,96,"SS...");
//if(is_GB)
PDU_EnablePDU();
if(is_GB==0)
PDU_SetLength(Strlen(SMS_Context)*2);
else
PDU_SetLength(Strlen(SMS_Context));
PDU_Send(PDU_Code);
//LCD_PutEng(5,96,"SS");
for(i=0;i<25;i++)
delay(20000);
sbuf[counter]=0;
//LCD_PutNum16(5,96,time);
counter=0;
time++;
}
//判断是否发送成功,如果不成功继续发送,最多4次,如仍不成功,返回0
while(strpos(sbuf+strlen(sbuf)-20,'G')==-1&&time<4);
if(strpos(sbuf+strlen(sbuf)-20,'G')==-1)
return 0;
else
return 1; //成功的话返回0
}
else
{
//LCD_PutEng(5,96,"LL");
sbuf[counter]=0;
//LCD_PutEng(0,0,sbuf);
counter=0;
return 0;
}
}
以上程序成功实现短信的发送,其中的一些函数限于篇幅可自行实现。
(6)单片机对短信的读取与解码
单片机可以通过AT指令对短信猫中的短信进行读取,并对读入的短信数据进行分析与解码。
读出的短信格式与发送时的短信编码大致是相同的。下面给出相应的程序例程,读者可以在自行实验中对照验证。
1. 读取某一条短信,并将其进行显示
/*-------------------------------------------------------
函数名:LAD_SMS()(short for "Load And Display the Short MessageS")
功能:用户函数,读取第n条短信,并在LCD的(x,y)位置显示出来
----------------------------------------------------------*/
unsigned char LAD_SMS(unsigned char n,unsigned char x,unsigned char y)
{
unsigned char i,len,t;
char temp[5];
char temp1[3];
//IN_Draw_BlankorBlackRect(0,20,30,72,0);
szzh10(n,temp1);
//将n转为相应的字符串,如n=21,则字符串为"21",用以与AT指令拼接。
t=85;
clear_sbuf();
counter=0;
send_s("AT+CMGR=");//AT+CMGR为读取短信的AT指令
send_s(temp1);//上面所得的字符串
send(0x0d);
send(0x0a);
for(i=0;i<10;i++) delay(10000); //等待读取完毕
sbuf[counter]=0; //在收到的数据末尾附加'\0'
temp[0]=sbuf[23];
temp[1]=sbuf[24];
temp[2]=sbuf[25];
temp[3]=0;
if(sbuf[25]!=0x0d) t++;
for(i=0;i<strlen(temp);i++) if(temp[i]==0x0d) temp[i]=0;
len=atoi(temp); //获取收到的短信内容长度
//LCD_PutEng(23,76,"(SM:");
//LCD_PutNum16(27,76,n);
//LCD_PutEng(29,76,")");
if(len==0)
{
//LCD_PutEng(5,96,"EMP");
//LCD_PutChn(x,y,">短信空");
delay(50000);
return 0;
}
len-=20;
if(len>90)
{
//LCD_PutEng(5,96,"MTL");
//LCD_PutChn(x,y,">短信太长");
delay(50000);
return 0;
}
for(i=0;i<len;i++)
{
temp[0]=sbuf[t+2*i];
temp[1]=sbuf[t+2*i+1];
temp[2]=0;
sbuf[i]=_hex_(temp);
//收到的短信内容是内存方式的显示表示,转为十六进制数
}
sbuf[i]=0;
Analysis_Pro();//解码后的内容在sbuf中,此函数对其进行显示输出
//LCD_PutEng(x,y,inf_bw.Date);
//LCD_PutEng(x,y,sbuf+29);
delay(50000);
clear_sbuf();
counter=0;
return 1;
}
2. 检测新短信
/*-------------------------------------------------------
函数名:Check_New()
功能:用户函数,检测有无新的短信,如果有返回1,否则返回0
----------------------------------------------------------*/
unsigned char Check_New()
{int i;
send_s("AT+CMGL=0"); //AT+CMGL=0为读取新短信的AT指令
send(0x0d);
send(0x0a); //发送回车
delay(10000); //等待接收完毕
if(sbuf[12]=='O') return 0xff;
if(sbuf[12]=='+')
{
for(i=18;i<23;i++)
if(sbuf[i]==',') sbuf[i]=0;
return atoi(sbuf+19); //返回新短信的位置
}
}
3. 删除某条短信
/*-------------------------------------------------------
函数名:Delete()
功能:用户函数,删除第n条短信
----------------------------------------------------------*/
unsigned char Delete(unsigned char n)
{
char t[10];
char t1[5];
strcpy(t,"AT+CMGD="); //AT+CMGD为删除短信的AT指令
szzh10(n,t1);
strcpy(t+8,t1);
while(Send_AT_CMD(t)!=1);
//LCD_PutEng(5,96,"SM");
//LCD_PutNum16(7,96,n);
//LCD_PutEng(10,96,"De");
delay(60000);
return 1;
}
TC35的控制主要包含如下几类指令:
(1)初始化指令
设置短消息发送格式AT+CMGF=1<CR>,设置1代表PDU模式,<CR>是回车符号,也就是0x0d,指令正确则模块返回<CRLF>OK<CRLF>,<CRLF>是回车换行符号。
(2)设置/读取短消息中心
短消息中心号码由移动运营商提供。
设置短消息中心的指令格式为:
AT+CSCA=″+8613800531500″(短消息中心)<CR>
设置正确则模块返回<CRLF>OK<CRLF>。
读取短消息服务中心则使用命令:
AT+CSCA=?<CR>
TC35模块应该返回:
<CRLF>+CSCA:″8613800531500″<CRLF>。
(3)设置短消息到达自动提示
设置短消息到达自动提示的指令格式为:
AT+CNMI=1,1,0,0,1<CR>
设置正确则TC35模块返回:
<CRLF>OK<CRLF>。
设置此命令可使模块在短消息到达后向串口发送指令:
<CRLF>+CMTI:″SM″,INDEX(信息存储位置)<CRLF>。
通过TC35发送短消息的方法为:
PC上的控制软件按照PDU的格式发送和接收数据,短消息的内容可以是中文或者其他字符。在PDU模式,如果发送短消息,则首先发送短消息数据的长度:
AT+CMGS=<length><CR>
等待TC35模块返回ASCII字符">",则可以将PDU数据输入,PDU数据以<Z>(也就是0x1a)作为结束符。短消息发送成功,模块返回:
<CRLF>OK<CRLF>
通过TC35接收短消息的方法为:
短消息到来后,串口上会接收到指令
<CRLF>+CMTI:″SM″,INDEX(信息存储位置)<CRLF>
PC上的控制软件通过读取PDU数据的AT命令
AT+CMGR=INDEX<CRLF>
将TC35模块中PDU格式的短消息内容读出。如果用+CMGL代替+CMGR,则可一次性读出全部短消息。
通过TC35删除短消息的方法为:
PC上的控制软件收到一条短消息并处理后,需要将其在SIM卡上删除,以防止SIM卡饱和。删除短消息的指令为:
AT+CMGD=INDEX<CR>
删除后模块返回
<CRLF>OK<CRLF>
2.程序实例
由于本文的宗旨在于讲解串口通信,因此,我们屏蔽图形用户界面的细节,制作一个简单的短信收发软件,它包含了控制短信终端的所有串口通信内容。实际上,一个理想的短信收发软件的界面应类似于Outlook或Foxmail,包含收件箱、发件箱、已发送短信箱等内容,但是这些东西都与我们要介绍的串口通信无关,因此,下面的软件界面虽"败絮其外",但仍可称得上"金玉其中":
关于界面上控件的描述如下:
BEGIN
EDITTEXT IDC_SMSCONTENT_EDIT,39,61,242,38,ES_AUTOHSCROLL
PUSHBUTTON "发送",IDC_SEND_BUTTON,316,80,45,18
GROUPBOX "接收短消息",IDC_STATIC,28,124,361,167
LTEXT "对方手机号",IDC_STATIC,41,35,42,11
EDITTEXT IDC_PHONENUM_EDIT,88,30,192,17,ES_AUTOHSCROLL
PUSHBUTTON "清除",IDC_CLEAR_BUTTON,316,30,45,18
GROUPBOX "发送短消息",IDC_STATIC,29,19,361,95
LISTBOX IDC_RECVSMS_LIST,43,137,331,127,LBS_SORT |
LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP
PUSHBUTTON "接收",IDC_RECV_BUTTON,77,269,55,16
PUSHBUTTON "清空",IDC_DELETEALL_BUTTON,273,268,45,14
END
对话框类的消息映射为:
BEGIN_MESSAGE_MAP(CSMSControlDlg, CDialog)
//{{AFX_MSG_MAP(CSMSControlDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_CLEAR_BUTTON, OnClearButton)
ON_BN_CLICKED(IDC_SEND_BUTTON, OnSendButton)
ON_BN_CLICKED(IDC_RECV_BUTTON, OnRecvButton)
ON_BN_CLICKED(IDC_DELETEALL_BUTTON, OnDeleteallButton)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
下面是对本例程软件的主要数据结构和核心函数的介绍:
数据结构
// 用户信息编码方式
#define GSM_7BIT 0
#define GSM_8BIT 4
#define GSM_UCS2 8
// 短消息参数结构,编码/解码共用
// 其中,字符串以0结尾
typedef struct
{
char SCA[16]; // 短消息服务中心号码(SMSC地址)
char TPA[16]; // 目标号码或回复号码(TP-DA或TP-RA)
char TP_PID; // 用户信息协议标识(TP-PID)
char TP_DCS; // 用户信息编码方式(TP-DCS)
char TP_SCTS[16]; // 服务时间戳字符串(TP_SCTS), 接收时用到
char TP_UD[161]; // 原始用户信息(编码前或解码后的TP-UD)
char index; // 短消息序号,在读取时用到
} SM_PARAM;
发送短消息
发送按钮对应的函数为CSMSControlDlg::OnSendButton,它读取用户输出并根据目标电话号码和短信息内容形成SM_PARAM(源PDU参数)的内容,接着进行发送:
void CSMSControlDlg::OnSendButton()
{
// TODO: Add your control notification handler code here
//获得用户输入
CString desPhoneNum;
CString smsContent;
GetDlgItemText(IDC_PHONENUM_EDIT,desPhoneNum);
GetDlgItemText(IDC_SMSCONTENT_EDIT,smsContent);
//填充SM_PARAM结构体内容
SM_PARAM smParam;
smParam = CreateSMPARAMStruct(desPhoneNum,smsContent);
//发送短信息
gsmSendMessage(smParam);
}
其中调用的gsmSendMessage函数体现了串口通信的核心内容,它按照第1节阐述的GSM模块发送短消息的串口控制流程进行短信的发送:
BOOL gsmSendMessage(const SM_PARAM *pSrc // pSrc: 源PDU参数指针)
{
int nPduLength; // PDU串长度
unsigned char nSmscLength; // SMSC串长度
int nLength; // 串口收到的数据长度
char cmd[16]; // 命令串
char pdu[512]; // PDU串
char ans[128]; // 应答串
nPduLength = gsmEncodePdu(pSrc, pdu); // 根据PDU参数,编码PDU串
strcat(pdu, "\x01a"); // 以Ctrl-Z结束
gsmString2Bytes(pdu, &nSmscLength, 2); // 取PDU串中的SMSC信息长度
nSmscLength++; // 加上长度字节本身
// 命令中的长度,不包括SMSC信息长度,以数据字节计
sprintf(cmd, "AT+CMGS=%d\r", nPduLength / 2-nSmscLength); // 生成命令
WriteComm(cmd, strlen(cmd)); // 先输出命令串
nLength = ReadComm(ans, 128); // 读应答数据
// 根据能否找到"\r\n> "决定成功与否
if (nLength == 4 && strncmp(ans, "\r\n> ", 4) == 0)
{
WriteComm(pdu, strlen(pdu)); // 得到肯定回答,继续输出PDU串
nLength = ReadComm(ans, 128); // 读应答数据
// 根据能否找到"+CMS ERROR"决定成功与否
if (nLength > 0 && strncmp(ans, "+CMS ERROR", 10) != 0)
{
return TRUE;
}
}
return FALSE;
}
读取短消息
点击"接收"按钮会通过gsmReadMessage函数的调用获得所有短消息,最后在列表控件中显示所有短信:
void CSMSControlDlg::OnRecvButton()
{
// TODO: Add your control notification handler code here
SM_PARAM smParam[100];//短信缓冲区
int smsNum;//短信条数
smsNum = gsmReadMessage(smParam);//读取短信
//显示短信
for(int i=0;i<smsNum;i++)
{
m_recvlist.AddString(CString(smsNum[i].TPA)+smsNum[i].TP_UD);
}
}
其中调用的gsmReadMessage函数完成最核心的短信接收功能,它按照第1节阐述的GSM模块接收短消息的串口控制流程进行短信的接收:
// 参数:pMsg 短消息缓冲区,必须足够大
// 返回:短消息条数
int gsmReadMessage(SM_PARAM* pMsg)
{
int nLength; // 串口收到的数据长度
int nMsg; // 短消息计数值
char* ptr; // 内部用的数据指针
char cmd[16]; // 命令串
char ans[1024]; // 应答串
nMsg = 0;
ptr = ans;
sprintf(cmd, "AT+CMGL\r"); // 生成命令,用+CMGL可一次性读出全部短消息
WriteComm(cmd, strlen(cmd)); // 输出命令串
nLength = ReadComm(ans, 1024); // 读应答数据
// 根据能否找到"+CMS ERROR"决定成功与否
if(nLength > 0 && strncmp(ans, "+CMS ERROR", 10) != 0)
{
// 循环读取每一条短消息, 以"+CMGL:"开头
while((ptr = strstr(ptr, "+CMGL:")) != NULL)
{
ptr += 6; // 跳过"+CMGL:"
sscanf(ptr, "%d", &pMsg->index); // 读取序号
ptr = strstr(ptr, "\r\n"); // 找下一行
ptr += 2; // 跳过"\r\n"
gsmDecodePdu(ptr, pMsg); // PDU串解码
pMsg++; // 准备读下一条短消息
nMsg++; // 短消息计数加1
}
}
return nMsg;
}
删除短消息
我们可以在读取完所有短信息后调用gsmDeleteMessage函数在GSM模块上删除那些已经被接收到PC上的短信息,它按照第1节阐述的GSM模块删除短消息的串口控制流程进行短信的删除:
// index: 短消息序号,从1开始
BOOL gsmDeleteMessage(const int index)
{
int nLength; // 串口收到的数据长度
char cmd[16]; // 命令串
char ans[128]; // 应答串
sprintf(cmd, "AT+CMGD=%d\r", index); // 生成命令
// 输出命令串
WriteComm(cmd, strlen(cmd));
// 读应答数据
nLength = ReadComm(ans, 128);
// 根据能否找到"+CMS ERROR"决定成功与否
if (nLength > 0 && strncmp(ans, "+CMS ERROR", 10) != 0)
{
return TRUE;
}
return FALSE;
}
在PC控制软件的短信列表框中删除所有短消息的"清空"按钮函数为:
void CSMSControlDlg::OnDeleteallButton()
{
// TODO: Add your control notification handler code here
m_recvlist.ResetContent();
}
设置/读/写串口
在应用程序启动与退出及gsmSendMessage、gsmReadMessage和gsmDeleteMessage函数中广泛使用的串口相关函数用WIN32 API实现:
// 串口设备句柄
HANDLE hComm;
// 打开串口
// pPort: 串口名称或设备路径,可用"COM1"或"\\.\COM1"两种方式,建议用后者
// nBaudRate: 波特率
// nParity: 奇偶校验
// nByteSize: 数据字节宽度
// nStopBits: 停止位
BOOL OpenComm(const char *pPort, int nBaudRate, int nParity, int nByteSize, int
nStopBits)
{
DCB dcb; // 串口控制块
COMMTIMEOUTS timeouts =
{
// 串口超时控制参数
100, // 读字符间隔超时时间: 100 ms
1, // 读操作时每字符的时间: 1 ms (n个字符总共为n ms)
500, // 基本的(额外的)读超时时间: 500 ms
1, // 写操作时每字符的时间: 1 ms (n个字符总共为n ms)
100
}; // 基本的(额外的)写超时时间: 100 ms
hComm = CreateFile(pPort, // 串口名称或设备路径
GENERIC_READ | GENERIC_WRITE, // 读写方式
0, // 共享方式:独占
NULL, // 默认的安全描述符
OPEN_EXISTING, // 创建方式
0, // 不需设置文件属性
NULL); // 不需参照模板文件
if (hComm == INVALID_HANDLE_VALUE)
return FALSE;
// 打开串口失败
GetCommState(hComm, &dcb); // 取DCB
dcb.BaudRate = nBaudRate;
dcb.ByteSize = nByteSize;
dcb.Parity = nParity;
dcb.StopBits = nStopBits;
SetCommState(hComm, &dcb); // 设置DCB
SetupComm(hComm, 4096, 1024); // 设置输入输出缓冲区大小
SetCommTimeouts(hComm, &timeouts); // 设置超时
return TRUE;
}
// 关闭串口
BOOL CloseComm()
{
return CloseHandle(hComm);
}
// 写串口
// pData: 待写的数据缓冲区指针
// nLength: 待写的数据长度
void WriteComm(void *pData, int nLength)
{
DWORD dwNumWrite; // 串口发出的数据长度
WriteFile(hComm, pData, (DWORD)nLength, &dwNumWrite, NULL);
}
// 读串口
// pData: 待读的数据缓冲区指针
// nLength: 待读的最大数据长度
// 返回: 实际读入的数据长度
int ReadComm(void *pData, int nLength)
{
DWORD dwNumRead; // 串口收到的数据长度
ReadFile(hComm, pData, (DWORD)nLength, &dwNumRead, NULL);
return (int)dwNumRead;
}
编/解码GSM短消息
陷于本文的篇幅,这里只给出编解码函数的原型,具体请参看GSM标准及《通过串口收发短消息》一文。
// UCS2编码 返回: 目标编码串长度
int gsmEncodeUcs2(const char *pSrc, // 源字符串指针
unsigned char *pDst, // pDst: 目标编码串指针
int nSrcLength // nSrcLength: 源字符串长度
);
// UCS2解码 返回: 目标字符串长度
int gsmDecodeUcs2(const unsigned char *pSrc, //源编码串指针
char *pDst, // pDst: 目标字符串指针
int nSrcLength // nSrcLength: 源编码串长度
);
//可打印字符串转换为字节数据 返回: 目标数据长度
//如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
int gsmString2Bytes(const char *pSrc, // pSrc: 源字符串指针
unsigned char *pDst, // pDst: 目标数据指针
int nSrcLength // nSrcLength: 源字符串长度
);
// 字节数据转换为可打印字符串 返回: 目标字符串长度
// 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01"
int gsmBytes2String(const unsigned char *pSrc, // pSrc: 源数据指针
char *pDst, // pDst: 目标字符串指针
int nSrcLength // nSrcLength: 源数据长度;
--->>>返回首页