標(biāo)題:
STM32用GPRS模塊進(jìn)行TCP連接發(fā)送數(shù)據(jù)源碼-使用IP地址的方式
[打印本頁]
作者:
runkey
時(shí)間:
2018-5-4 23:36
標(biāo)題:
STM32用GPRS模塊進(jìn)行TCP連接發(fā)送數(shù)據(jù)源碼-使用IP地址的方式
1.按鍵按鍵KEY1,就會(huì)自動(dòng)向指定的服務(wù)器發(fā)送一條信息。--->通過IP地址的方式
2.按鍵的定義引腳,請(qǐng)參考程序main.c開頭的注釋說明。
單片機(jī)源程序如下:
/**********************************************************************************
STM32F103C8T6
* 硬件連接說明
使用單片串口2與GPRS模塊通信 注:使用串口2可以避免下載和通信不會(huì)沖突
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)--->調(diào)試信息端口
PA10(RXD1)-->調(diào)試信息端口
設(shè)計(jì):
(1)LED0-7設(shè)置的引腳為:PB4-7 PB12-15
(2)KEY0-3設(shè)置的引腳為:PA4-7
果云技術(shù):杜工
**********************************************************************************/
#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緩存長(zhǎng)度
#define STABLE_TIMES 10 //等待系統(tǒng)上電后的穩(wěn)定
/************* 本地常量聲明 **************/
/************* 本地變量聲明 **************/
char Uart2_Buf[Buf2_Max];//串口2接收緩存
u8 First_Int = 0;
char error_result[20];
char server_ip_port_cmd[45];
/************* 本地函數(shù)聲明 **************/
void CLR_Buf(void); //清除串口2接收緩存
u8 Wait_CREG(u8 query_times); //等待模塊注冊(cè)成功
u8 Find(char *a);
/************* 外部函數(shù)和變量聲明*****************/
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);//測(cè)試通信是否成功
if(ret == 0)
{
UART2_SendString(esc_char);//萬一進(jìn)入>狀態(tài),那么久發(fā)送一個(gè)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);//查詢卡是否注冊(cè)到網(wǎng)絡(luò)
if(ret == 0)
{
return SIM_CARD_NO_REG_ERROR;
}
ret = UART2_Send_AT_Command("ATE0","OK",2,50);//關(guān)閉回顯功能
if(ret == 0)
{
return EAT0_ERROR;
}
return 1;
}
/***************************************************************
注:當(dāng)然你可以返回其他值,來確定到底是哪一步發(fā)送指令出現(xiàn)失敗了。
****************************************************************/
int send_data_to_server(char *server_IP_and_port,char *content)
{
u8 ret;
char end_char[2];
end_char[0] = 0x1A;//結(jié)束字符
end_char[1] = '\0';
ret = UART2_Send_AT_Command("AT+CIPSTATUS","CONNECT OK",3,50*2);//查詢連接狀態(tài)
if(ret == 1)//說明服務(wù)器處于連接狀態(tài)
{
ret = UART2_Send_AT_Command("AT+CIPSEND",">",3,50);//開發(fā)發(fā)送數(shù)據(jù)
if(ret == 0)
{
return AT_CIPSEND_ERROR;
}
UART2_SendString(content);
ret = UART2_Send_AT_Command_End(end_char,"SEND OK",1,250);//發(fā)送結(jié)束符,等待返回ok,等待5S發(fā)一次,因?yàn)榘l(fā)送數(shù)據(jù)時(shí)間可能較長(zhǎng)
if(ret == 0)
{
return END_CHAR_ERROR;
}
return 1;
}
ret = UART2_Send_AT_Command("AT+CGATT=1","OK",3,50*7);//附著網(wǎng)絡(luò)
if(ret == 0)
{
return AT_CGATT_ERROR;
}
ret = UART2_Send_AT_Command("AT+CGACT=1,1","OK",3,50*2);//激活網(wǎng)絡(luò)
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);//連接服務(wù)器
if(ret == 0)
{
return AT_CIPSTART_ERROR;
}
ret = UART2_Send_AT_Command("AT+CIPSEND",">",3,50);//開發(fā)發(fā)送數(shù)據(jù)
if(ret == 0)
{
return AT_CIPSEND_ERROR;
}
UART2_SendString(content);
ret = UART2_Send_AT_Command_End(end_char,"SEND OK",1,250);//發(fā)送結(jié)束符,等待返回ok,等待5S發(fā)一次,因?yàn)榘l(fā)送數(shù)據(jù)時(shí)間可能較長(zhǎng)
if(ret == 0)
{
return END_CHAR_ERROR;
}
return 1;
}
/*******************************************************************************
* 函數(shù)名 : main
* 描述 : 主函數(shù)
* 輸入 :
* 輸出 :
* 返回 :
* 注意 : 串口2負(fù)責(zé)與GA6模塊通信,串口1用于串口調(diào)試,
*******************************************************************************/
int main(void)
{
u16 key_value;
u8 i;
u8 run_led_flag = 0;
int ret;
SysTick_Init_Config(); //系統(tǒng)滴答時(shí)鐘初始化
GPIO_Config(); //GPIO初始化
Key_GPIO_Config();
USART2_Init_Config(115200); //串口2初始化
Timer2_Init_Config(); //定時(shí)器2初始化
USART1_Init_Config(115200);//UART1用作串口調(diào)試信息
UART1_SendString("系統(tǒng)啟動(dòng).......................\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!");//發(fā)送數(shù)據(jù)到服務(wù)器
}
if(ret == 1)
{
sprintf(error_result,"成功發(fā)送到server\r\n");
UART1_SendString(error_result);
delay_ms(50);
UART1_SendString("收到回復(fù):\r\n"); //received:后面的內(nèi)容才是回復(fù)的真正內(nèi)容
UART1_SendString(Uart2_Buf);
UART1_SendString("\r\n");
LED1_ON();
}
else //數(shù)據(jù)發(fā)送失敗,此時(shí)可能連接時(shí)間過長(zhǎng)導(dǎo)致的失敗,這樣就斷開連接,然后就可以繼續(xù)連接上了
{
sprintf(error_result,"錯(cuò)誤代碼 : %d\r\n",ret);
UART1_SendString(error_result);
UART2_Send_AT_Command("AT+CIPCLOSE","OK",3,150);//關(guān)閉鏈接
LED1_OFF();
}
break;
}
default:
break;
}
}
}
/*******************************************************************************
* 函數(shù)名 : USART2_IRQHandler
* 描述 : 串口1中斷服務(wù)程序
* 輸入 : 無
* 返回 : 無
* 說明 :
*******************************************************************************/
void USART2_IRQHandler(void)
{
u8 Res=0;
Res = USART_ReceiveData(USART2);
Uart2_Buf[First_Int] = Res; //將接收到的字符串存到緩存中
First_Int++; //緩存指針向后移動(dòng)
if(First_Int > Buf2_Max) //如果緩存滿,將緩存指針指向緩存的首地址
{
First_Int = 0;
}
}
/*******************************************************************************
* 函數(shù)名 : TIM2_IRQHandler
* 描述 : 定時(shí)器2中斷斷服務(wù)函數(shù)
* 輸入 : 無
* 輸出 : 無
* 返回 : 無
* 說明 : 無
*******************************************************************************/
void TIM2_IRQHandler(void) //TIM2中斷
{
static u8 flag =1;
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //檢查TIM2更新中斷發(fā)生與否
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除TIM2更新中斷標(biāo)志
if(flag)
{
//LED4_ON();
flag=0;
}
else
{
//LED4_OFF();
flag=1;
}
}
}
/*******************************************************************************
* 函數(shù)名 : CLR_Buf
* 描述 : 清除串口2緩存數(shù)據(jù)
* 輸入 :
* 輸出 :
* 返回 :
* 注意 :
*******************************************************************************/
void CLR_Buf(void)
{
u16 k;
for(k=0;k<Buf2_Max;k++) //將緩存內(nèi)容清零
{
Uart2_Buf[k] = 0x00;
}
First_Int = 0; //接收字符串的起始存儲(chǔ)位置
}
/*******************************************************************************
* 函數(shù)名 : Wait_CREG
* 描述 : 等待模塊注冊(cè)成功
* 輸入 :
* 輸出 :
* 返回 :
* 注意 :
*******************************************************************************/
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;
}
……………………
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
進(jìn)行TCP連接發(fā)送數(shù)據(jù)-使用IP地址的方式.rar
(347.18 KB, 下載次數(shù): 183)
2018-5-5 00:35 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
袁潔棟
時(shí)間:
2018-12-11 09:11
謝謝分享,謝謝
作者:
oyfmzyf
時(shí)間:
2019-1-19 16:58
十分感謝,現(xiàn)在正在學(xué)這方面的東西。
作者:
er555
時(shí)間:
2019-3-26 09:22
感謝樓主分享,我這邊有一個(gè)小問題想請(qǐng)教一下在程序看到用的是GA6通訊模塊,這個(gè)的程序流程可以同樣M26的模塊的流程嗎?
作者:
l59123
時(shí)間:
2019-6-14 15:03
很好正是我要學(xué)習(xí)的
作者:
alaala
時(shí)間:
2019-6-15 00:03
非常感謝樓主分享
作者:
1112545
時(shí)間:
2022-9-17 16:20
感謝樓主分享,正在學(xué)習(xí)這部分內(nèi)容
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1