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

edp 千1.docx

edp 千1.docx

产业园区运营负责人如何提升园区企业的技术需求对接效率和转化成功率?.docx

产业园区运营负责人如何提升园区企业的技术需求对接效率和转化成功率?

硬件流控制

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

niannian18的博客 3024

使用qt+PaddleOCR做一个OCR软件demo

文章目录使用qt+PaddleOCR做一个OCR软件demo效果展示1 建立环境1.1 vs项目环境1.2 qtcreator项目环境1.2.1 源代码整理1.2.2 依赖项整理如下1.2.3 模型文件如下1.2.4 在.pro文件中设置依赖库的模式1.2.5 pro文件中添加.h和.lib2 在工程代码中添加截图功能2.1 新建截图类并连接信号2.2 QImage转cv::Mat3 在工程代码中集成PaddleOCR3.1 初始化PaddleOCR3.2 修改文字识别类的run函数,增加一个返回结果的值的

ShareProgress的博客 9307

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万+

VM与欧姆龙PLC通讯设置:Fins TCP/UDP协议实战避坑指南

本文详细解析了VM视觉平台与欧姆龙PLC通过Fins TCP/UDP协议进行通讯的实战配置与避坑要点。文章对比了Fins TCP与Fins UDP的差异,推荐在多数工业控制场景下优先选用Fins TCP以保证可靠性,并深入讲解了网络设置、寄存器地址映射、轮询优化等核心配置步骤。同时,针对常见的多次触发拍照、数据解析错误等问题提供了具体的解决方案和调试技巧,旨在帮助工程师快速建立稳定高效的通讯连接。

e4f5g6h7的博客 596

单卡也能玩转Qwen2.5-VL微调!3090实测Grounding任务调参技巧大全

本文详细介绍了如何在单张RTX 3090显卡上,通过梯度累积、BF16混合精度训练、梯度检查点等关键技术,成功微调Qwen2.5-VL多模态大模型以完成Grounding视觉定位任务。文章提供了从数据处理、参数配置到训练监控的完整实战调参技巧,为资源有限的开发者提供了可行的解决方案。

weixin_29098117的博客 425

硬件流控制(RTS/CTS)

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

码灵的博客 1808

AquaCrop-OSPy学习笔记02:模型输入设置

AquaCrop-OSPy的输入设置

EWBA_GIS_RS_ER的博客 3696

SIM900A GPRS无线通信

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

tutu_hu的博客 9952

python数据处理(一)——如何用python实现excel功能

python如何实现excel的数据提取、指标构建,进行透视分析。

一名数据分析师 2705

Windows 11下WSL2安装CUDA避坑指南:从驱动版本匹配到环境变量配置

本文详细解析了在Windows 11的WSL2中搭建CUDA开发环境的完整流程与核心避坑要点。关键在于理解“驱动在Windows,工具链在Linux”的独特架构,并确保显卡驱动与CUDA Toolkit版本严格匹配。指南涵盖了从驱动验证、WSL-Ubuntu专用仓库安装、环境变量配置到GCC版本冲突、GPU算力不匹配等常见问题的解决方案,帮助开发者高效构建稳定的深度学习与高性能计算环境。

smartcontract5的博客 468

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

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

weixin_35756130的博客 1152

ICV:Metal Fill Insertion流程

如果不想删除先前加的metal fill,可以使用signoff_create_metal_fill -mode add命令,当使用这个mode后,工具不会fix density问题,哪怕设置了signoff.create_metal_fill.fix_density_errors,设置这个mode后可以使用以下option控制metal fill 的插入。默认情况下,signoff_create_metal_fill是会删掉已经加进去的metal/via fill再重新加的。

m0_61544122的博客 1134

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

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

Hello__nibuhao的博客 1389

ZooKeeper 实战:使用 Docker Compose 部署 ZooKeeper 集群

ZooKeeper是一个开源的分布式协调服务,用于管理大型分布式系统中的数据。它由Apache软件基金会提供,最初是Hadoop的一个子项目,但后来发展成为一个独立的顶级项目。ZooKeeper提供的一致性协调服务对于构建分布式应用和服务非常重要,特别是在需要精确的领导选举、配置管理、命名服务、分布式同步和提供分布式锁等功能时。

SmartSi 1541

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

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

jzj1993的专栏 7849

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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、付费专栏及课程。

余额充值