久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10750|回復: 6
收起左側

STM32用GPRS模塊進行TCP連接發送數據源碼-使用IP地址的方式

  [復制鏈接]
ID:313658 發表于 2018-5-4 23:36 | 顯示全部樓層 |閱讀模式
1.按鍵按鍵KEY1,就會自動向指定的服務器發送一條信息。--->通過IP地址的方式

2.按鍵的定義引腳,請參考程序main.c開頭的注釋說明。

單片機源程序如下:
  1. /**********************************************************************************
  2.    STM32F103C8T6           
  3. * 硬件連接說明
  4.          使用單片串口2與GPRS模塊通信  注:使用串口2可以避免下載和通信不會沖突
  5.          STM32      GPRS模塊
  6.          打板子接線方法:               mini板子接線方法:
  7.      PA3 (RXD2)->U_RX               PA3 (RXD2)->U_TX
  8.          PA2 (TXD2)->U_TX               PA2 (TXD2)->U_RX
  9.          GND           ->GND                GND           ->GND
  10.          
  11.          PA9(TXD1)--->調試信息端口
  12.          PA10(RXD1)-->調試信息端口
  13. 設計:
  14. (1)LED0-7設置的引腳為:PB4-7 PB12-15
  15. (2)KEY0-3設置的引腳為:PA4-7

  16. 果云技術:杜工
  17.   
  18. **********************************************************************************/
  19. #include "stm32f10x.h"
  20. #include "usart.h"
  21. #include "Led.h"
  22. #include "SysTick.h"
  23. #include "timer.h"
  24. #include "string.h"
  25. #include "key.h"
  26. #include "GA6_module_errors.h"
  27. #include <stdio.h>

  28. #define Buf2_Max           100 //串口2緩存長度
  29. #define STABLE_TIMES  10  //等待系統上電后的穩定

  30. /*************        本地常量聲明        **************/

  31. /*************  本地變量聲明        **************/
  32. char Uart2_Buf[Buf2_Max];//串口2接收緩存
  33. u8 First_Int = 0;
  34. char error_result[20];

  35. char server_ip_port_cmd[45];


  36. /*************        本地函數聲明        **************/
  37. void CLR_Buf(void);     //清除串口2接收緩存
  38. u8 Wait_CREG(u8 query_times);    //等待模塊注冊成功
  39. u8 Find(char *a);

  40. /*************  外部函數和變量聲明*****************/

  41. int check_status(void)
  42. {
  43.         int ret;
  44.         char esc_char[2];
  45.         
  46.         esc_char[0] = 0x1B;//退出字符
  47.         esc_char[1] = '\0';
  48.         
  49.         ret = UART2_Send_AT_Command("AT","OK",5,50);//測試通信是否成功
  50.         if(ret == 0)
  51.         {
  52.                 UART2_SendString(esc_char);//萬一進入>狀態,那么久發送一個ESC字符
  53.                 return COMMUNITE_ERROR;
  54.         }
  55.         
  56.         ret = UART2_Send_AT_Command("AT+CPIN?","READY",2,50);//查詢卡是否插上
  57.         if(ret == 0)
  58.         {
  59.                 return NO_SIM_CARD_ERROR;
  60.         }
  61.         
  62.         ret = Wait_CREG(3);//查詢卡是否注冊到網絡
  63.         if(ret == 0)
  64.         {
  65.                 return SIM_CARD_NO_REG_ERROR;
  66.         }
  67.    
  68.     ret = UART2_Send_AT_Command("ATE0","OK",2,50);//關閉回顯功能
  69.         if(ret == 0)
  70.         {
  71.                 return EAT0_ERROR;
  72.         }
  73.    
  74.         return 1;
  75. }

  76. /***************************************************************
  77. 注:當然你可以返回其他值,來確定到底是哪一步發送指令出現失敗了。
  78. ****************************************************************/
  79. int send_data_to_server(char *server_IP_and_port,char *content)
  80. {
  81.         u8 ret;
  82.         char end_char[2];
  83.         
  84.         
  85.         end_char[0] = 0x1A;//結束字符
  86.         end_char[1] = '\0';
  87.         
  88.         ret = UART2_Send_AT_Command("AT+CIPSTATUS","CONNECT OK",3,50*2);//查詢連接狀態
  89.         if(ret == 1)//說明服務器處于連接狀態
  90.         {
  91.                 ret = UART2_Send_AT_Command("AT+CIPSEND",">",3,50);//開發發送數據
  92.                 if(ret == 0)
  93.                 {
  94.                         return AT_CIPSEND_ERROR;
  95.                 }
  96.                
  97.                 UART2_SendString(content);
  98.                
  99.                 ret = UART2_Send_AT_Command_End(end_char,"SEND OK",1,250);//發送結束符,等待返回ok,等待5S發一次,因為發送數據時間可能較長
  100.                 if(ret == 0)
  101.                 {
  102.                         return END_CHAR_ERROR;
  103.                 }
  104.                
  105.                 return 1;
  106.         }
  107.         
  108.         ret = UART2_Send_AT_Command("AT+CGATT=1","OK",3,50*7);//附著網絡
  109.         if(ret == 0)
  110.         {
  111.                 return AT_CGATT_ERROR;
  112.         }
  113.         
  114.         ret = UART2_Send_AT_Command("AT+CGACT=1,1","OK",3,50*2);//激活網絡
  115.         if(ret == 0)
  116.         {
  117.                 return AT_CGATT1_ERROR;
  118.         }

  119.         memset(server_ip_port_cmd,'\0',45);
  120.         strcpy(server_ip_port_cmd,"AT+CIPSTART=\"TCP\",");
  121.         strcat(server_ip_port_cmd,server_IP_and_port);
  122.         
  123.         ret = UART2_Send_AT_Command(server_ip_port_cmd,"CONNECT OK",3,50*2);//連接服務器
  124.         if(ret == 0)
  125.         {
  126.                 return AT_CIPSTART_ERROR;
  127.         }
  128.         
  129.         ret = UART2_Send_AT_Command("AT+CIPSEND",">",3,50);//開發發送數據
  130.         if(ret == 0)
  131.         {
  132.                 return AT_CIPSEND_ERROR;
  133.         }
  134.         
  135.         UART2_SendString(content);
  136.         ret = UART2_Send_AT_Command_End(end_char,"SEND OK",1,250);//發送結束符,等待返回ok,等待5S發一次,因為發送數據時間可能較長
  137.    
  138.     if(ret == 0)
  139.         {
  140.                 return END_CHAR_ERROR;
  141.         }
  142.         
  143.         return 1;
  144. }

  145. /*******************************************************************************
  146. * 函數名 : main
  147. * 描述   : 主函數
  148. * 輸入   :
  149. * 輸出   :
  150. * 返回   :
  151. * 注意   : 串口2負責與GA6模塊通信,串口1用于串口調試,
  152. *******************************************************************************/
  153. int main(void)
  154. {
  155.         u16 key_value;
  156.         u8  i;
  157.         u8  run_led_flag = 0;
  158.         int  ret;
  159.         
  160.         SysTick_Init_Config();   //系統滴答時鐘初始化
  161.         GPIO_Config();           //GPIO初始化
  162.         Key_GPIO_Config();
  163.         USART2_Init_Config(115200);  //串口2初始化
  164.         Timer2_Init_Config();        //定時器2初始化
  165.         
  166.         USART1_Init_Config(115200);//UART1用作串口調試信息
  167.         
  168.         UART1_SendString("系統啟動.......................\r\n");
  169.         
  170.         for(i = 0;i < STABLE_TIMES;i++)
  171.         {
  172.                 delay_ms(50);
  173.         }
  174.         
  175.         memset(error_result,'\0',20);
  176.         
  177.         while(1)
  178.         {
  179.                 delay_ms(50);
  180.                
  181.                 if(run_led_flag == 0)
  182.                 {
  183.                         LED0_ON();
  184.                         UART1_SendString("LED0_ON\r\n");
  185.                         run_led_flag = 1;
  186.                 }
  187.                 else
  188.                 {
  189.                         LED0_OFF();
  190.                         UART1_SendString("LED0_OFF\r\n");
  191.                         run_led_flag = 0;
  192.                 }
  193.                 key_value = Key_Down_Scan();
  194.                 switch (key_value)
  195.                 {
  196.                         case (0x0001 << 5):
  197.                         {
  198.                                 ret = check_status();
  199.                                 if(ret == 1)
  200.                                 {
  201.                                         ret = send_data_to_server("\"182.254.216.22\",8687","GA6 tcp test!");//發送數據到服務器                                       
  202.                                 }
  203.                                 
  204.                 if(ret == 1)
  205.                                 {
  206.                                         sprintf(error_result,"成功發送到server\r\n");
  207.                                         UART1_SendString(error_result);
  208.                                         delay_ms(50);
  209.                                         UART1_SendString("收到回復:\r\n");  //received:后面的內容才是回復的真正內容
  210.                                         UART1_SendString(Uart2_Buf);
  211.                                         UART1_SendString("\r\n");
  212.                                        
  213.                                         LED1_ON();
  214.                                 }
  215.                                 else //數據發送失敗,此時可能連接時間過長導致的失敗,這樣就斷開連接,然后就可以繼續連接上了
  216.                                 {
  217.                                         sprintf(error_result,"錯誤代碼 : %d\r\n",ret);
  218.                                         UART1_SendString(error_result);
  219.                                         UART2_Send_AT_Command("AT+CIPCLOSE","OK",3,150);//關閉鏈接
  220.                                         LED1_OFF();
  221.                                        
  222.                                 }
  223.                                                                
  224.                                 break;
  225.                         }
  226.                         
  227.                         default:
  228.                                 break;
  229.                         
  230.                 }               
  231.         }
  232. }

  233. /*******************************************************************************
  234. * 函數名  : USART2_IRQHandler
  235. * 描述    : 串口1中斷服務程序
  236. * 輸入    : 無
  237. * 返回    : 無
  238. * 說明    :
  239. *******************************************************************************/
  240. void USART2_IRQHandler(void)                        
  241. {
  242.         u8 Res=0;
  243.         Res = USART_ReceiveData(USART2);
  244.         Uart2_Buf[First_Int] = Res;            //將接收到的字符串存到緩存中
  245.         First_Int++;                          //緩存指針向后移動
  246.         if(First_Int > Buf2_Max)                 //如果緩存滿,將緩存指針指向緩存的首地址
  247.         {
  248.                 First_Int = 0;
  249.         }
  250. }         

  251. /*******************************************************************************
  252. * 函數名  : TIM2_IRQHandler
  253. * 描述    : 定時器2中斷斷服務函數
  254. * 輸入    : 無
  255. * 輸出    : 無
  256. * 返回    : 無
  257. * 說明    : 無
  258. *******************************************************************************/
  259. void TIM2_IRQHandler(void)   //TIM2中斷
  260. {
  261.         static u8 flag =1;

  262.         if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)  //檢查TIM2更新中斷發生與否
  263.         {
  264.                
  265.                 TIM_ClearITPendingBit(TIM2, TIM_IT_Update);  //清除TIM2更新中斷標志
  266.         
  267.                 if(flag)
  268.                 {
  269.                         //LED4_ON();
  270.                         flag=0;
  271.                 }
  272.                 else
  273.                 {
  274.                         //LED4_OFF();
  275.                         flag=1;
  276.                 }
  277.         }        
  278. }

  279. /*******************************************************************************
  280. * 函數名 : CLR_Buf
  281. * 描述   : 清除串口2緩存數據
  282. * 輸入   :
  283. * 輸出   :
  284. * 返回   :
  285. * 注意   :
  286. *******************************************************************************/
  287. void CLR_Buf(void)
  288. {
  289.         u16 k;
  290.         for(k=0;k<Buf2_Max;k++)      //將緩存內容清零
  291.         {
  292.                 Uart2_Buf[k] = 0x00;
  293.         }
  294.     First_Int = 0;              //接收字符串的起始存儲位置
  295. }

  296. /*******************************************************************************
  297. * 函數名 : Wait_CREG
  298. * 描述   : 等待模塊注冊成功
  299. * 輸入   :
  300. * 輸出   :
  301. * 返回   :
  302. * 注意   :
  303. *******************************************************************************/
  304. u8 Wait_CREG(u8 query_times)
  305. {
  306.         u8 i;
  307.         u8 k;
  308.         u8 j;
  309.         i = 0;
  310.         CLR_Buf();
  311.         while(i == 0)                                
  312.         {

  313.                 UART2_Send_Command("AT+CREG?");
  314.                 delay_ms(100);
  315.                
  316.                 for(k=0;k<Buf2_Max;k++)                              
  317.                 {
  318.                         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] == ':'))
  319.                         {
  320.                                          
  321.                                 if((Uart2_Buf[k+7] == '1')&&((Uart2_Buf[k+9] == '1')||(Uart2_Buf[k+9] == '5')))
  322.                                 {
  323.                                         i = 1;
  324.                                         return 1;
  325.                                 }
  326.                                 
  327.                         }
  328.                 }
  329.                 j++;
  330.                 if(j > query_times)
  331.                 {
  332.                         return 0;
  333.                 }
  334. ……………………

  335. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
進行TCP連接發送數據-使用IP地址的方式.rar (347.18 KB, 下載次數: 183)
回復

使用道具 舉報

ID:64178 發表于 2018-12-11 09:11 | 顯示全部樓層
謝謝分享,謝謝
回復

使用道具 舉報

ID:407041 發表于 2019-1-19 16:58 | 顯示全部樓層
十分感謝,現在正在學這方面的東西。
回復

使用道具 舉報

ID:498449 發表于 2019-3-26 09:22 | 顯示全部樓層
感謝樓主分享,我這邊有一個小問題想請教一下在程序看到用的是GA6通訊模塊,這個的程序流程可以同樣M26的模塊的流程嗎?
回復

使用道具 舉報

ID:80799 發表于 2019-6-14 15:03 | 顯示全部樓層
很好正是我要學習的
回復

使用道具 舉報

ID:562871 發表于 2019-6-15 00:03 | 顯示全部樓層
非常感謝樓主分享
回復

使用道具 舉報

ID:967484 發表于 2022-9-17 16:20 | 顯示全部樓層
感謝樓主分享,正在學習這部分內容
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品免费 | 欧美一区二区三区在线播放 | 久久精品国产一区老色匹 | 狠狠干夜夜草 | 亚洲福利在线观看 | 久久综合99 | 亚洲综合国产 | 国产毛片久久久 | 亚洲欧美中文日韩在线v日本 | 日韩区| 国产精品一区在线 | 日韩欧美三级 | 久久激情视频 | 亚洲网站在线播放 | 成人黄色在线 | 欧美黄色网 | 久久婷婷国产 | 男女污网站 | 精品无码久久久久久国产 | av在线播放不卡 | 毛片av免费在线观看 | 国产精品久久久久9999鸭 | 国产精品一区二区视频 | 一区二区三区视频免费观看 | 欧美激情一区二区三区 | 中日韩av| 狠狠干狠狠操 | 久久网国产 | 色天堂影院 | 欧区一欧区二欧区三免费 | 99久久国产免费 | 在线天堂免费中文字幕视频 | 中文字幕av在线一二三区 | www.99精品| 成人精品一区二区三区 | 国产欧美在线视频 | 日韩精品四区 | 亚洲黄色av网站 | 日韩欧美一区二区三区免费观看 | 国产9999精品 | 九九亚洲|