标题:
STM32用GPRS模块进行TCP连接发送数据源码-使用IP地址的方式
[打印本页]
作者:
runkey
时间:
2018-5-4 23:36
标题:
STM32用GPRS模块进行TCP连接发送数据源码-使用IP地址的方式
1.按键按键KEY1,就会自动向指定的服务器发送一条信息。--->通过IP地址的方式
2.按键的定义引脚,请参考程序main.c开头的注释说明。
单片机源程序如下:
/**********************************************************************************
STM32F103C8T6
* 硬件连接说明
使用单片串口2与GPRS模块通信 注:使用串口2可以避免下载和通信不会冲突
STM32 GPRS模块
打板子接线方法: mini板子接线方法:
PA3 (RXD2)->U_RX PA3 (RXD2)->U_TX
PA2 (TXD2)->U_TX PA2 (TXD2)->U_RX
GND ->GND GND ->GND
PA9(TXD1)--->调试信息端口
PA10(RXD1)-->调试信息端口
设计:
(1)LED0-7设置的引脚为:PB4-7 PB12-15
(2)KEY0-3设置的引脚为:PA4-7
果云技术:杜工
**********************************************************************************/
#include "stm32f10x.h"
#include "usart.h"
#include "Led.h"
#include "SysTick.h"
#include "timer.h"
#include "string.h"
#include "key.h"
#include "GA6_module_errors.h"
#include <stdio.h>
#define Buf2_Max 100 //串口2缓存长度
#define STABLE_TIMES 10 //等待系统上电后的稳定
/************* 本地常量声明 **************/
/************* 本地变量声明 **************/
char Uart2_Buf[Buf2_Max];//串口2接收缓存
u8 First_Int = 0;
char error_result[20];
char server_ip_port_cmd[45];
/************* 本地函数声明 **************/
void CLR_Buf(void); //清除串口2接收缓存
u8 Wait_CREG(u8 query_times); //等待模块注册成功
u8 Find(char *a);
/************* 外部函数和变量声明*****************/
int check_status(void)
{
int ret;
char esc_char[2];
esc_char[0] = 0x1B;//退出字符
esc_char[1] = '\0';
ret = UART2_Send_AT_Command("AT","OK",5,50);//测试通信是否成功
if(ret == 0)
{
UART2_SendString(esc_char);//万一进入>状态,那么久发送一个ESC字符
return COMMUNITE_ERROR;
}
ret = UART2_Send_AT_Command("AT+CPIN?","READY",2,50);//查询卡是否插上
if(ret == 0)
{
return NO_SIM_CARD_ERROR;
}
ret = Wait_CREG(3);//查询卡是否注册到网络
if(ret == 0)
{
return SIM_CARD_NO_REG_ERROR;
}
ret = UART2_Send_AT_Command("ATE0","OK",2,50);//关闭回显功能
if(ret == 0)
{
return EAT0_ERROR;
}
return 1;
}
/***************************************************************
注:当然你可以返回其他值,来确定到底是哪一步发送指令出现失败了。
****************************************************************/
int send_data_to_server(char *server_IP_and_port,char *content)
{
u8 ret;
char end_char[2];
end_char[0] = 0x1A;//结束字符
end_char[1] = '\0';
ret = UART2_Send_AT_Command("AT+CIPSTATUS","CONNECT OK",3,50*2);//查询连接状态
if(ret == 1)//说明服务器处于连接状态
{
ret = UART2_Send_AT_Command("AT+CIPSEND",">",3,50);//开发发送数据
if(ret == 0)
{
return AT_CIPSEND_ERROR;
}
UART2_SendString(content);
ret = UART2_Send_AT_Command_End(end_char,"SEND OK",1,250);//发送结束符,等待返回ok,等待5S发一次,因为发送数据时间可能较长
if(ret == 0)
{
return END_CHAR_ERROR;
}
return 1;
}
ret = UART2_Send_AT_Command("AT+CGATT=1","OK",3,50*7);//附着网络
if(ret == 0)
{
return AT_CGATT_ERROR;
}
ret = UART2_Send_AT_Command("AT+CGACT=1,1","OK",3,50*2);//激活网络
if(ret == 0)
{
return AT_CGATT1_ERROR;
}
memset(server_ip_port_cmd,'\0',45);
strcpy(server_ip_port_cmd,"AT+CIPSTART=\"TCP\",");
strcat(server_ip_port_cmd,server_IP_and_port);
ret = UART2_Send_AT_Command(server_ip_port_cmd,"CONNECT OK",3,50*2);//连接服务器
if(ret == 0)
{
return AT_CIPSTART_ERROR;
}
ret = UART2_Send_AT_Command("AT+CIPSEND",">",3,50);//开发发送数据
if(ret == 0)
{
return AT_CIPSEND_ERROR;
}
UART2_SendString(content);
ret = UART2_Send_AT_Command_End(end_char,"SEND OK",1,250);//发送结束符,等待返回ok,等待5S发一次,因为发送数据时间可能较长
if(ret == 0)
{
return END_CHAR_ERROR;
}
return 1;
}
/*******************************************************************************
* 函数名 : main
* 描述 : 主函数
* 输入 :
* 输出 :
* 返回 :
* 注意 : 串口2负责与GA6模块通信,串口1用于串口调试,
*******************************************************************************/
int main(void)
{
u16 key_value;
u8 i;
u8 run_led_flag = 0;
int ret;
SysTick_Init_Config(); //系统滴答时钟初始化
GPIO_Config(); //GPIO初始化
Key_GPIO_Config();
USART2_Init_Config(115200); //串口2初始化
Timer2_Init_Config(); //定时器2初始化
USART1_Init_Config(115200);//UART1用作串口调试信息
UART1_SendString("系统启动.......................\r\n");
for(i = 0;i < STABLE_TIMES;i++)
{
delay_ms(50);
}
memset(error_result,'\0',20);
while(1)
{
delay_ms(50);
if(run_led_flag == 0)
{
LED0_ON();
UART1_SendString("LED0_ON\r\n");
run_led_flag = 1;
}
else
{
LED0_OFF();
UART1_SendString("LED0_OFF\r\n");
run_led_flag = 0;
}
key_value = Key_Down_Scan();
switch (key_value)
{
case (0x0001 << 5):
{
ret = check_status();
if(ret == 1)
{
ret = send_data_to_server("\"182.254.216.22\",8687","GA6 tcp test!");//发送数据到服务器
}
if(ret == 1)
{
sprintf(error_result,"成功发送到server\r\n");
UART1_SendString(error_result);
delay_ms(50);
UART1_SendString("收到回复:\r\n"); //received:后面的内容才是回复的真正内容
UART1_SendString(Uart2_Buf);
UART1_SendString("\r\n");
LED1_ON();
}
else //数据发送失败,此时可能连接时间过长导致的失败,这样就断开连接,然后就可以继续连接上了
{
sprintf(error_result,"错误代码 : %d\r\n",ret);
UART1_SendString(error_result);
UART2_Send_AT_Command("AT+CIPCLOSE","OK",3,150);//关闭链接
LED1_OFF();
}
break;
}
default:
break;
}
}
}
/*******************************************************************************
* 函数名 : USART2_IRQHandler
* 描述 : 串口1中断服务程序
* 输入 : 无
* 返回 : 无
* 说明 :
*******************************************************************************/
void USART2_IRQHandler(void)
{
u8 Res=0;
Res = USART_ReceiveData(USART2);
Uart2_Buf[First_Int] = Res; //将接收到的字符串存到缓存中
First_Int++; //缓存指针向后移动
if(First_Int > Buf2_Max) //如果缓存满,将缓存指针指向缓存的首地址
{
First_Int = 0;
}
}
/*******************************************************************************
* 函数名 : TIM2_IRQHandler
* 描述 : 定时器2中断断服务函数
* 输入 : 无
* 输出 : 无
* 返回 : 无
* 说明 : 无
*******************************************************************************/
void TIM2_IRQHandler(void) //TIM2中断
{
static u8 flag =1;
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查TIM2更新中断发生与否
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除TIM2更新中断标志
if(flag)
{
//LED4_ON();
flag=0;
}
else
{
//LED4_OFF();
flag=1;
}
}
}
/*******************************************************************************
* 函数名 : CLR_Buf
* 描述 : 清除串口2缓存数据
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
void CLR_Buf(void)
{
u16 k;
for(k=0;k<Buf2_Max;k++) //将缓存内容清零
{
Uart2_Buf[k] = 0x00;
}
First_Int = 0; //接收字符串的起始存储位置
}
/*******************************************************************************
* 函数名 : Wait_CREG
* 描述 : 等待模块注册成功
* 输入 :
* 输出 :
* 返回 :
* 注意 :
*******************************************************************************/
u8 Wait_CREG(u8 query_times)
{
u8 i;
u8 k;
u8 j;
i = 0;
CLR_Buf();
while(i == 0)
{
UART2_Send_Command("AT+CREG?");
delay_ms(100);
for(k=0;k<Buf2_Max;k++)
{
if((Uart2_Buf[k] == '+')&&(Uart2_Buf[k+1] == 'C')&&(Uart2_Buf[k+2] == 'R')&&(Uart2_Buf[k+3] == 'E')&&(Uart2_Buf[k+4] == 'G')&&(Uart2_Buf[k+5] == ':'))
{
if((Uart2_Buf[k+7] == '1')&&((Uart2_Buf[k+9] == '1')||(Uart2_Buf[k+9] == '5')))
{
i = 1;
return 1;
}
}
}
j++;
if(j > query_times)
{
return 0;
}
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
进行TCP连接发送数据-使用IP地址的方式.rar
(347.18 KB, 下载次数: 183)
2018-5-5 00:35 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
袁洁栋
时间:
2018-12-11 09:11
谢谢分享,谢谢
作者:
oyfmzyf
时间:
2019-1-19 16:58
十分感谢,现在正在学这方面的东西。
作者:
er555
时间:
2019-3-26 09:22
感谢楼主分享,我这边有一个小问题想请教一下在程序看到用的是GA6通讯模块,这个的程序流程可以同样M26的模块的流程吗?
作者:
l59123
时间:
2019-6-14 15:03
很好正是我要学习的
作者:
alaala
时间:
2019-6-15 00:03
非常感谢楼主分享
作者:
1112545
时间:
2022-9-17 16:20
感谢楼主分享,正在学习这部分内容
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1