MSP430与GPRS模块的串口通信硬件流控制

msp430与GPRS模块的连接例程(含代码) msp430与GPRS模块的连接例程(含代码),内容十分详细 立即下载
我选用的GPRS模块是西门子的MC52I,由于降低功耗要用到该模块的休眠模式(AT+CFUN=设置具体的休眠模式)。而休眠模式必须先使能RTS/CTS流控制(AT\Q3设置)。MC52I的RTS和CTS引脚直接连在MSP430F149的I/O口上,具体怎么实现流控制还不太明白,请大家多多指教

经过自己研究终于弄懂是怎么个回事了
现在发出来,有不对的地方望大家指正
    MC52I可以通过
AT\Q[num] (num=0/1/2/3)选择不使能流控制(num=0),XON/XOFF软件流控制(num=1),仅模块的CTS有效(num=2)和RTS/CTS硬件流控制四种方式。值得注意的是通常情况下MC52I不需要进行这方面的设置,直接默认为不使能流控制方式,但是当你需要使用MC52I的休眠模式时就必须要设置为RTS/CTS硬件流控制即发送AT指令AT\Q3。此时再发送AT指令AT+CFUN=[num] (num=0/5/6/7/8/9 休眠状态, 1表示全功能状态)设置成相关休眠模式即可。如果仅这样做,当你调试时会发现单片机串口收不到MC52I发送过来的数据,也就是说无法进行通信。这跟RTS/CTS没有设置好有关系。
    下面介绍下modem下的RTS和CTS定义:
    RTS有效(低电平)表示DTE(这里就是单片机)可以收,CTS有效表示modem可以收,这两个信号互相独立,分别表示一个方向的流量情况。具体处理如下(借鉴了别人的描述 dengm 发表于 2005-1-14 07:52 侃单片机)
    单片机端:
        发送数据—— 当发现(不一定及时发现)CTS无效时,停止发送;
        当发现(不一定及时发现)CTS有效时,恢复发送;

        接收数据—— 0<M<N<LEN_OF_RX_BUFFERS
        当接收buffers中的bytes<M 时,给 RTS 有效信号;
        当接收buffers中的bytes>N 时,给 RTS 无效信号;
    modem端:
        同上,但RTS与CTS交换
    在这里modem端我们无需处理,只需要监测CTS的电平即可,针对上述的单片机串口无法接收到数据的问题,使连接RTS的I/O口输出低电平(如果一直设为低电平表示单片机一直允许接收数据,当传输数据非常大的时候会造成数据丢失,因此需要按照上面给出的bytes>N时,使RTS无效),然后再调试就能够发现单片机接收到modem返回的数据了。
 
 
MC52I和单片机串口连接图
图中TXD、RXD直接连到430单片机上的串口即可,这里需要注意的是MC52I的RXD是发送数据的,TXD是接收数据的。所以要按照图中的RXD连接到单片机的RXD,TXD连接到单片机的TXD。我当时就是没注意连错了害的最后跳线,呵呵。RTS、CTS、DTR、DSR、DCD、RING都直接连到单片机的I/O口上即可,RING最好是连到具有中断功能的I/O口上,因为当MC52I接收到来电信号、短信以及上网传过来的数据时都会引起这个引脚产生中断,可以方便处理。RTS/CTS就是上面用的情况,DTR/DSR、DCD没用过,不过最好也连上,防止以后用到。下图为各个管脚的输入输出状态:
  
复制代码

  • #include <msp430x14x.h> 
  • #include "string.h" 
  • //GPRS管脚定义 
  • #define  GPRS_IGT_HIGH  P1DIR|=BIT6,P1OUT|=BIT6//点火引脚 高电平 
  • #define  GPRS_IGT_LOW   P1DIR|=BIT6,P1OUT&=~BIT6//点火引脚 低电平 
  • #define  GPRS_RTS_H  P1DIR|=BIT2,P1OUT|=BIT2  //RTS输出高电平 
  • #define  GPRS_RTS_L  P1DIR|=BIT2,P1OUT&=~BIT2 //RTS输出低电平 
  • #define  GPRS_CTS_FLAG  P1DIR&=~BIT4         //设置CTS线为输入线 
  • #define  GPRS_CTS  (P1IN&BIT4) 

  • #define  Len 150 
  • typedef       unsigned int uint; 
  • typedef      unsigned char uchar; 

  • char recieve_data[150]; 
  • uint count = 0; 
  • uchar send_error = 0; 
  • //****************************************************** 
  • //延时函数 
  • void delay(uint time) 
  • { 
  •   uint i,j; 
  •   for(i=0;i<1000;i++) 
  •     for(j=0;j<time;j++); 
  • } 
  • //****************************************************** 
  • //初始化时钟 
  • void int_clk() 
  • { 
  •     uchar i = 0; 
  •     BCSCTL1&=~XT2OFF;                 //打开XT振荡器 
  •     BCSCTL2|=SELM1+SELS;//MCLK 8M and SMCLK 1M   
  •     do 
  •      { 
  •         IFG1 &= ~OFIFG;                 //清除振荡错误标志 
  •         for(i = 0; i < 100; i++) 
  •        _NOP();                                   //延时等待 
  •         } 
  •     while ((IFG1 & OFIFG) != 0);                //如果标志为1继续循环等待 
  •     IFG1&=~OFIFG; 
  • } 

  • //******************************************************* 
  • //串口:初始化函数,接收中断处理函数、发送数据函数 
  • //******************************************************* 
  • //初始化串口1 
  • void init_Usart1() 
  • {   
  •   U1CTL |= SWRST;                    //复位串口 
  •   U1CTL |= CHAR;                     //8位数据 
  •   U1TCTL |= SSEL1;                    //选择SMCLK作为时钟信号 
  •   UBR01 = 0x8a;                 
  •   UBR11 = 0x00;                       //使32KHz晶振时波特率为19200bps 
  •   UMCTL1 = 0xde;                       
  •   ME2 |= 0x30;                         //UART接收模块允许 
  •   UCTL1 &= ~SWRST;                  //SWRST复位,USART允许 
  •   IE2 |= URXIE1;                       //接收中断允许 
  •   P3SEL = 0xC0;                        //P3.6 P3.7 
  •   P3DIR = 0X40;                        //P3.6 输出,P3.7 输入   
  • } 
  • //****************************************************** 
  • //串口1中断服务处理函数 
  • #pragma vector=UART1RX_VECTOR 
  • __interrupt  void UART1_RX_ISR(void) 
  • { 
  •   char data = 0; 
  •   data = U1RXBUF; 
  •   recieve_data[count++] = data; 
  •   if(count>149) 
  •   { 
  •     count=0; 
  •   } 
  • } 

  • //发送一个字符 
  • void SendByte(uchar data) 
  • { 
  •   while((IFG2&UTXIFG1)==0);//判断发送缓冲区是否结束 
  •   U1TXBUF=data;   
  • } 
  • //****************************************************** 
  • //清楚接收存储区内容 
  • void GPRS_Clearstring() 
  • { 
  •       uchar len=0; 
  •       count=0; 
  •       //关闭中断 
  •       IE2 &= ~URXIE1;//禁止接收中断 
  •       for(;len<Len;len++) 
  •        recieve_data[len]='\0'; 
  •       //使能中断 
  •       IE2|=URXIE1;//使能接收中断 
  • } 

  • //****************************************************** 
  • //将命令写入usart数据寄存器 
  • void Send_Data(char * strptr) 
  • { 
  •   uchar i,j; 
  •   j = strlen(strptr); 
  •   for(i=0;i<j;i++) 
  •   { 
  •     SendByte(strptr[I]); 
  •   }                              
  • } 

  • //******************************************************** 
  • //GPRS模块:启动函数、关闭函数、初始化函数 
  • //******************************************************** 
  • //GPRS启动函数 
  • void GPRS_Start(void) 
  • { 
  •   GPRS_IGT_HIGH; 
  •   delay(1); 
  •   GPRS_IGT_LOW; 
  •   delay(100); 
  •   GPRS_IGT_HIGH; 
  • } 

  • //****************************************************** 
  • //GPRS关闭函数 
  • void GPRS_Close(void) 
  • { 
  •   delay(100); 
  •   Send_Data("AT^SMSO\r\n"); 
  •   delay(100); 
  • } 

  • //****************************************************** 
  • //GPRS初始化函数 
  • void GPRS_Init(void) 
  • { 
  •   Send_Data("AT\\Q3\r\n");//设置成RTS/CTS硬件流控制模式 
  •   delay(1000); 
  •   Send_Data("ATE0\r\n"); //关闭回显 
  •   delay(100); 
  •   Send_Data("AT+CMGF=1\r\n");//采用文本方式 
  •   delay(100); 
  •   Send_Data("AT+CFUN=7\r\n");//设置循环功耗节省模式7 
  •   delay(100); 
  •   Send_Data("AT+CFUN\?\r\n");//用于查询设置模式是否成功 
  •   delay(100); 
  • } 

  • //****************************************************** 
  • //发送短信函数 
  • //****************************************************** 
  • void SendMessage(char *num,char *massge) 
  • { 
  •   char instuct[]="AT+CMGS=\""; 
  •   char numinstuct[27]; 
  •   strcpy(numinstuct,instuct);       //字符串拷贝函数 
  •   strcat(numinstuct,num);           //字符串连接函数 
  •   strcat(numinstuct,"\"\r\n"); 
  •   Send_Data(numinstuct);            //AT+CMGS=\"13607088025\" 发送接收终端号码 
  •   Send_Data(massge);                //发送短信内容 
  •   SendByte(0x1a);                   //相当于Ctrl+Z 
  • } 

  • //*********************************************************** 
  • //主函数:启动GPRS模块,设置为循环低功耗 
  • //模式(AT+CFUN=8),发送一条短信,关闭GPRS模块 
  • //*********************************************************** 
  • void main() 
  • { 
  •   WDTCTL=WDTPW+WDTHOLD;//关闭看门狗 
  •   int_clk();           //系统时钟初始化 
  •   init_Usart1();       //初始化串口 

  •   GPRS_RTS_L;          //设置RTS为低电平,表示单片机一直可以接收数据 
  •                        //如果发送数据很大,请按照之前描述的对RTS进行适当处理 
  •   GPRS_Start(); 
  •   _EINT();//使能中断 
  •   delay(2000); 
  •   GPRS_Init(); 
  •   Send_Data("AT\r\n");//发送个AT测试下 
  •   SendMessage("13612345678","hello");//发送短信 
  •   GPRS_Close();//关闭模块 
  •   while(1); 
  • }

转自:http://bbs.21ic.com/icview-285499-1-1.html

MSP430F149地址位多机通信 此程序的主要功能是实现MSP430F149单片机点对点多机通信中的地址位多级通信,给430单片机初学者提供一个很好的例程。 立即下载

相关推荐

msp430串口设计并控制GPRS的收发

msp430串口设计并控制GPRS的收发,实现拨打电话,收发信息,并联网,收发信息

什么叫硬件流控制

串口通讯流控制我们在串行通讯处理中,常常看到RTS/CTS和XON/XOFF这两个选项,这就是两个流控制的选项,目前流控制主要应用于调制解调器的数据通讯中,但对普通RS232编程,了解一点这方面的知识是有好处的。那么,流控制在串行通讯中有何作用,在编制串行通讯程序怎样应用呢?这里我们就来谈谈这个问题。 1.流控制在串行通讯中的作用这里讲到的“流”,当然指的是数据流。数据在两个串口之间传输时,常

四月的专栏 2716

基于MSP430F5438的SIM900 GPRS/GSM模块开发应用资料包

基于MSP430F5438的SIM900 GPRS/GSM模块开发应用资料包

USART 数据流控制

USART 数据流控制 也就是 USART_HardwareFlowControl。

qq_54215896的博客 5670

高校技术转移办公室人员如何提升技术成果的市场化对接效率?.docx

高校技术转移办公室人员如何提升技术成果的市场化对接效率?

两相交错并联Boost电路仿真模型(Simulink仿真实现)

内容概要:本文详细介绍了两相交错并联Boost电路的Simulink仿真模型,属于电力电子变换器领域的核心技术研究。该模型基于Simulink平台构建,重点在于通过多相交错并联结构提升Boost电路的输出稳定性与转换效率,有效降低输入电流纹波,适用于中高功率电力变换场合。文档系统阐述了电路的工作原理、闭环控制策略设计、软启动机制实现以及关键参数的优化方法,充分展现了多相并联技术在改善动态响应、提高功率密度方面的优势。同时,提供了完整的仿真建模流程和技术路线,涵盖主电路搭建、控制器设计、系统调试与性能分析等环节,并配套提供仿真文件、设计报告及参考文献等丰富资料,便于学习者深入理解与实践复现。; 适合人群:具备电力电子技术基础知识、熟悉Simulink仿真环境,正在从事新能源发电、电动汽车、工业电源系统等相关领域研究的硕士博士研究生、科研人员及电气工程方向的工程技术人员。; 使用场景及目标:①用于深入理解多相交错并联Boost电路的拓扑结构与工作机理;②支撑科研项目中的高效DC-DC变换器性能验证与优化设计;③为实际电源产品开发提供理论依据和仿真原型;④作为高校课程设计或实验教学的参考案例,提升学生的工程仿真与系统分析能力。; 阅读建议:建议结合文档中提及的其他相关变换器模型(如LLC谐振变换器、PFC电路、Buck变换器等)进行横向对比学习,深入掌握不同拓扑的控制策略差异与适用场景,并充分利用所提供的网盘资源下载完整仿真模型,动手调试参数、观察波形,从而深化对多相并联控制、电流均流、闭环稳定性等关键技术的理解,全面提升电力电子系统的仿真与设计能力。

硬件流控制

一、硬件流控制 当接收端数据处理不过来时,就发出“不再接收”的信号,发送端就停止发送,直到收到“可以继续发送”的信号再发送数据。因此流控制可以控制数据传输的进程,防止数据的丢失。 pc机中常用的两种流控制是硬件流控制(包括rts/cts、dtr/cts等)和软件流控制xon/xoff(继续/停止) ...

niannian18的博客 3024

Cisco Packet Tracer 9.0 工业网络模拟:3步配置OT协议与Purdue模型实战

本文详细介绍了如何使用Cisco Packet Tracer 9.0进行工业网络模拟,包括Purdue模型构建、三大OT协议(Modbus TCP/IP、CIP、PROFINET IO)配置及工业网络安全防护。通过实战演练,读者可掌握工业网络设计、配置与安全防护的核心技能,适用于智能制造和能源管理等场景。

weixin_28691741的博客 352

UART中的硬件流控RTS与CTS

UART中的硬件流控RTS与CTS 5/23/2013 5:13:04 PM at rock-chips inshenzhen 最近太忙了,没时间写对Ucos-II的移植,先将工作中容易搞错的一个知识点记录下来,关于CTS与RTS的。 在RS232中本来CTS 与RTS 有明确的意义,但自从贺氏(HAYES ) 推出了聪明猫(SmartModem)后就有点混淆了,不过现在这种意义为主流意义的

zeroboundary的专栏 14万+

深度学习之基于Pytorch手指静脉识别系统(

一、项目背景与目标手指静脉识别技术是一种新兴的生物特征识别技术,它依据人类手指中流动的血液可吸收特定波长的光线这一科学原理,利用手指内的静脉分布图像来进行身份识别。与传统的生物识别技术(如指纹识别)相比,手指静脉识别技术具有不易伪造、识别精度高、非接触性等特点,因此在安全性要求较高的场景(如金融、医疗、公安等)具有广阔的应用前景。本项目旨在利用PyTorch深度学习框架,构建一套高效、准确的手指静脉识别系统。

Q1744828575的博客 833

电脑的kernelbase.dll故障怎么处理?kernelbase.dll是什么文件

kernelbase.dll​是一个系统文件,属于Microsoft Windows操作系统的一部分。该DLL(动态链接库)文件包含了许多基本且低级的系统函数,这些函数被Windows上运行的各种程序和进程调用。kernelbase.dll通常与Kernel32.dll紧密相关,它是实现许多Windows API(应用程序编程接口)的封装。这些API涉及到内存管理、输入输出操作、进程和线程管理以及其他许多核心的操作系统功能。

电脑修复君的博客 4534

硬件流控制(RTS/CTS)

摘要:硬件流控制(RTS/CTS)是串口通信中通过独立信号线实现的高效流量控制机制。RTS作为输出信号指示接收状态,CTS作为输入信号控制发送权限,二者必须交叉连接。其核心价值在于实时防止数据丢失,工作原理类似交通信号灯系统:当接收方缓冲区充足时激活RTS允许发送,缓冲区将满时则暂停传输。该机制需要双方设备同时启用硬件流控功能,并确保正确的物理连接和电平配置,特别适用于高速、高可靠性要求的通信场景。(149字)

码灵的博客 1806

企业级AI项目落地实战指南

企业级 AI 项目落地需构建“分阶段实施 + 多维度风控”的双轮驱动体系:实施端通过 POC 验证技术可行性、试点建立评估标准、规模化实现价值复制,各阶段需结合行业案例(如东阳光药、旺盈集团)提炼可复用经验;风险端则需覆盖技术(数据安全、模型稳定性)、合规(全球监管动态)、组织(人才与文化)维度,通过工具化框架(AI TRISM)与案例策略(邮储银行可解释性设计、拓斯达培训体系)实现风险可控。最终通过“场景聚焦 - 合规嵌入 - 持续优化”的循环机制,实现 AI 技术从“试点成功”到“全面价值创造”的跨越。

2509_93209761的博客 1438

SIM900A GPRS无线通信

本文简单介绍了通过SIM900A模块实现GPRS无线通信的原理,先简单介绍了SIM900A模块,又简要说明了配置步骤,最后附上程序源码,测试好用,供大家参考,谢谢!

tutu_hu的博客 9952

EDA环境下的LSF进阶调优:如何为Cadence/VCS等工具正确配置cgroups与daemon starter

本文深入探讨了在EDA环境中如何为Cadence/VCS等工具正确配置LSF的cgroups与daemon starter,解决资源分配与特殊应用兼容性问题。通过详细解析cgroups技术、daemon starter配置及混合资源管理策略,帮助提升LSF集群的效率和稳定性,特别适用于高性能计算和芯片设计场景。

weixin_33724046的博客 461

AI时代敏捷开发新范式——意图驱动开发IDD

具体的功能代码、单元测试、集成测试用例,以及最终可运行的、支持PlantUML的Markdown转Word工具新版本。:业务方(如技术文档团队)反馈,现有的Markdown转Word工具在处理包含PlantUML代码块的文档时,无法正确生成图表,导致技术方案、架构图等关键信息丢失,严重影响了文档交付质量和团队效率。这不仅带来了交付周期显著缩短、资源效能倍增的可观收益,更深远的意义在于,它描绘了未来软件工业化、智能化的新图景:一个由精准意图驱动、AI自主执行、人类智慧引领的敏捷、高效、高质的新世界。

LiuJunjiang的专栏 552

串口设置中的硬件控制流是什么意思

在串口设置中,"硬件控制流" 指的是通过硬件的方式来控制数据在串口之间的流动。这与 "软件控制流" 相反,后者是通过软件来控制数据流动的。 硬件控制流通常使用电平信号来控制数据流,比如说串口常用的 RTS/CTS 信号。而软件控制流则是通过软件来控制数据流动的,比如说使用 XON/XOFF 字符来控制数据流。 选择使用硬件控制流还是软件控制流取决于你的应用场景。一般来说,硬件控制流的响应速度更快,...

weixin_35756130的博客 1152

某招标公告网和vcaptcha验证码识别逆向

本文分析了某验证码系统的加密流程及破解思路。首先通过反混淆技术定位到加密函数,拆解了包含指纹函数、环境参数等组成的加密字符串。研究发现验证码生成涉及canvas指纹、环境检测等反爬机制,可通过模拟浏览器环境绕过。验证过程需要解密图片顺序,通过work2.js计算还原图片位置,再结合滑动轨迹、时间等参数生成验证请求。文章仅提供技术研究思路,强调需遵守法律法规,严禁非法破解信息系统。完整流程包括环境模拟、加密参数还原、图片处理和轨迹生成等步骤,成功率较高。

码王吴彦祖的博客 579

什么是硬件流控制(Hardware Flow Control)

硬件流控制(Hardware Flow Control) 是一种用于串行通信中的数据传输控制机制,它通过使用额外的硬件信号来管理发送方和接收方之间的数据流,以避免由于缓冲区溢出、数据丢失或通信错误而导致问题。硬件流控制主要依赖于一些专门的信号线来进行通信设备之间的协调。

Hello__nibuhao的博客 1389

SAP_ABAP_MM_BAPI清单案例教程——采购发票校验/预制_BAPI_INCOMINGINVOICE_PARK_MIRO

SAP ABAP BAPI_INCOMINGINVOICE_PARK BAPI 采购发票预制 采购发票校验 代码模版

java_zhong1990的专栏 1964

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

浅谈GSM/GPRS模块软硬件设计(基于有方M660+模块和单片机)

浅谈GSM/GPRS模块软硬件设计(基于有方M660+模块和单片机)   GSM/GPRS芯片是手机中负责收发短信、拨打电话以及访问GPRS网络的核心。有方M660+为深圳有方公司生产的一款超小封装的GSM/GPRS工业无线模块,可以提供高品质的语音、短信、数据业务等功能,在各种工业和民用领域得到广泛的应用。   有方M660+ GPRS模块的硬件设计   硬件设计参考附件《M66

jzj1993的专栏 7849

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

sim900a 裸AT通过GPRS网络发送接收数据

关闭之前的连接 AT+CIPSHUT 设置MS级别 AT+CGCLASS="B" OK 定义PDP上下文 AT+CGDCONT=1,"IP","CMNET" OK 附着在GPRS网络 AT+CGATT=1 OK 设置为GPRS连接模式 AT+CIPCSGP=1,"CMNET" OK 设置本地端口号 AT+CLPORT="TCP","20

openCpu 7818

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

UART中的硬件流控RTS與CTS

UART中的硬件流控RTS與CTS 5/23/2013 5:13:04 PM at rock-chips inshenzhen 最近太忙了,沒時間寫對Ucos-II的移植,先將工作中容易搞錯的一個知識點記錄下來,關於CTS與RTS的。 在RS232中本來CTS 與RTS 有明確的意義,但自從賀氏(HAYES ) 推出了聰明貓(SmartModem)後就有點混淆了,不過現在這種意義为主流意義的

Yasin Lee 9812

理解串口流控

A想要发送数据给B,那么用硬件的RTS/CTS作为硬件流控制机制的话,那么: A如果想要发送数据给B的话,A会使得RTS(Request To Send)引脚有效,表明其想要“请求发送”数据给作为接收设备的B,而A接着就会去检测对应的来自B的CTS引脚,直到CTS有效(此时意味着B已经做好了相关的准备工作了,然后设置了CTS(Clear To Send) ,表明自己准备好接受数据了),才会真正开

Periscope的专栏 1万+
上一篇: 一个失误,编译器报错Error: invalid char '[' beginning operand 2 `[ %eax]'
下一篇: 用ioctl获得本地ip地址,ifconf和ifreq
tinyhare
博客等级 码龄15年 11粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值