📄 串口短信c51代码示例.txt
字号:
/*
//*********************************************************
//程序: 串口通信示例程序
//编制: 苏建阳 2008-3-9
//*********************************************************
说明:
本文是单片机通过串口与Modem等外部设备通信的示例,
因为不同的单片机和开发环境会有差异,要按照实际硬件进行修改。
中断方式工作逻辑:
建立自己的发送、接收缓存存储区gcRx0Buf,gcTx0Buf及其指针*gpRx0、*gpTx0
配置端口和UART波特率,设置串口接收发送中断、总中断。
发送开始向发送存储区gcTx0Buf写字符串,软件置TI触发串口中断(否则不会进入中断,需要定时查询)。
发送中断里将下一个字符送发送端口,直到发送结束
接收到字符放入接收字符串等待处理(51较慢注意接收时不要占用太多时间)
等待超过一定时间没有新数据就结束(可以进行数据处理了,但是不要在中断里做太多事)
//********************************************************
*/
//#include <MCS51.h>
#include<reg52.h>
unsigned char xdata gcRx0Buf[128]; //串口0接收缓存
unsigned char data *gpRx0 = gcRx0Buf; //接收缓存指针
unsigned char xdata gcTx0Buf[128]; //串口0发送缓存
unsigned char xdata *gpTx0 = gcTx0Buf; //发送缓存指针
unsigned char data gcRx0Busy; //接收忙
unsigned char data gcTx0Busy; //发送忙
/************************************************************
程序: CpuSet
功能: 设置CPU、端口、UART波特率和中断
参数: 无
返回:
描述:
修改:
************************************************************/
void CpuSet()
{//按照自己的CPU设置端口和UART波特率和中断
/*
//8052
TR1=1;
SM0=0;
SM1=1;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
EA=1;
ES=1;
REN=1;
PCON=0x80;
*/
//--------------中断设置-----------------
/*
8051 中断优先级寄存器IP。 其操作控制为标准8051 方式,
中断入口地址仍然如下:
0 INT0 :0003H 外部中断
1 T0 :000BH 定时/计数器T0 溢出中断
2 INT1 :0013H 外部中断INT 1
3 T1 :001BH 定时/计数器T1 溢出中断
4 UART:0023H 串行口中断UART
*/
EA = 1; //开放中断,IE 的EA 位,总中断允许设置
}
/************************************************************
程序: Uart0Int (串口0中断)
功能: 接收中断的数据缓存到gcRx0Buf,发送中断将gcTx0Buf数据到串口
参数: 无
返回:
描述: 程序分两部分,1接收,2发送.
修改:
************************************************************/
void Uart0Int(void) interrupt 4 //中断的写法要按照开发软件要求写
{ char C;
if (RI) //接收有数据
{ C = SBUF; //读取缓存到变量备用(有些CPU读后将清除缓存)
RI = 0; //接收中断标志清零
if (C > 0) //判断接收的数据是否有效(不要直接读取CPU的缓存)
{ *gpRx0 = C; //保存到接收缓存串
gpRx0 ++; //准备接收下一个数据
*gpRx0 = 0; //结尾
gcRx0Busy = 127; //置超时处理标志,超时将认为接收结束
}
}
if (TI) //发送中断
{ TI = 0; //发送中断标志清零
if (*gpTx0 > 0) //判断发送结尾
{ SBUF = *gpTx0; //取一个字符发送写到端口
gcTx0Busy = 255; //置超时处理标志,超时将认为发送失败结束
gpTx0 ++; //指向下一个空位
}
else
{ gpTx0 = gcTx0Buf; //指针到串头
*gpTx0 = 0; //标记成空串
}
}
}
/************************************************************
程序: Main
功能: 主程序
参数: 无
返回:
描述:
修改:
************************************************************/
void Main()
{ int iDelay = 0;
CpuSet(); //设置工作环境
//逐步发送下面的AT命令,注意模块休眠后第一个命令不会正常应答要发2遍
strcpy(gcTx0Buf,"AT+CMGF=1\r\n"); //准备要发送的数据
//strcpy(gcTx0Buf,"AT$NOSLEEP=1\r\n");//M22,M23,M23G用
//strcpy(gcTx0Buf,"AT+CSCS=\"GSM\"\r\n"); //GSM通信
//strcpy(gcTx0Buf,"AT+CSMP=17,168,0,0\r\n"); //通信参数
//strcpy(gcTx0Buf,"AT+CNMI=2,2\r\n"); //可选来信提示方式
//strcpy(gcTx0Buf,"AT+CSMP=AT+CSQ\r\n");//测试天线信号强度
//strcpy(gcTx0Buf,"AT+CMGR=1\r\n"); //读取第1单元数据
//strcpy(gcTx0Buf,"AT+CMGD=1\r\n"); //删除第1单元数据
//strcpy(gcTx0Buf,"AT+CMGS=\"+8613658150338\r\n"); //发送短信,等待返回"> "
//strcpy(gcTx0Buf,"This Try"); //删除第1单元数据
//strcpy(gcTx0Buf,"\0x1A"); //信息结尾
ES = 1; //串口中断使能
whule(1)
{
if(!gcTx0Busy) //发送空闲
{ if(*gpTx0) //有要发送的数据没有发完
{ TI = 1; //软件置中断标志启动发送中断过程
}
}
else
{ gcTx0Busy --; //监督发送状态
}
if(gcRxBusy) //监督接收完成状态
{ if(gcRxBusy == 1)
{ //处理接收的数据,比如收到"OK"
}
gcRxBusy --; //接收处理结束
}
while(iDelay ++); //进行其它工作或等待
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -