OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2049|回复: 2

以下是代码 我实在是看不懂了

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2019-6-12
在线时间
4 小时
发表于 2019-7-26 16:05:26 | 显示全部楼层 |阅读模式

就是我是在做gps定位模块,连接OneNET服务器,现在用的是32最小系统+MC20 在32控制mc20发送AT指令的代码编写上,我实在是头痛,这个东西到底怎么写啊 ,不知道从哪开始写,我在网络上找了很久的资源 有例程但是看不懂,没有系统的教法,唉 好难开始。 大伙们,我只好发帖问问你们了!!你们大伙有谁做过或者见过类似的请帮帮我,有偿也行下面是主程序。
ps:我找不到怎么添加程序,只好复制了




#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "usart2.h"


//常量
#define Success 1U
#define Failure 0U

//定义变量
unsigned long  Time_Cont = 0;       //定时器计数器


char OneNetServer[] = "183.230.40.33";       //不需要修改


char device_id[] = "536599539";    //修改为自己的设备ID
char API_KEY[] = "rLTUlXKBxXuHuNLJyTqZOK7PQsY=";    //修改为自己的API_KEY
char sensor_gps[] = "location";                                //不需要修改

unsigned int count = 0;

void errorLog(int num);
void phone(char *number);
unsigned int sendCommand(char *Command, char *Response, unsigned long Timeout, unsigned char Retry);
void sendMessage(char *number,char *msg);
void Sys_Soft_Reset(void);
void parseGpsBuffer(void);
void printGpsBuffer(void);
void postGpsDataToOneNet(char* API_VALUE_temp, char* device_id_temp, char* sensor_id_temp, char* lon_temp, char* lat_temp);
char* longitudeToOnenetFormat(char *lon_str_temp);
char* latitudeToOnenetFormat(char *lat_str_temp);
int Digcount(long num);

int main(void)
{       
        delay_init();
       
        NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        uart_init(9600);         //串口初始化为9600
        USART2_Init(9600);        //串口2波特率9600
        u2_printf("AT\r\n");
        Init_LEDpin();
       
       
       
        printf("Welcome to use!\r\n");
        printf("ILoveMcu.taobao.com!\r\n");
       
        if (sendCommand("AT\r\n", "OK\r\n", 3000, 10) == Success);//命令解释:检测 Module 与串口是否连通,能否接收 AT 命令;
        else errorLog(1);
        delay_ms(10);

        if (sendCommand("AT+CPIN?\r\n", "READY", 3000, 10) == Success);//检查登入移动设备(ME)的密码.READY表示SIM卡正常,同时不需要登入密码

        else errorLog(3);
       
        delay_ms(10);

        if (sendCommand("AT+CREG?\r\n", ",1", 3000, 10) == Success);        //本地SIM卡//网络注册及状态查询指令最长时间等待3000ms,重复次数
        else if(sendCommand("AT+CREG?\r\n", ",5", 3000, 10) == Success        );//漫游SIM卡
        else        errorLog(3);
        delay_ms(10);

        if (sendCommand("AT+QGNSSC?\r\n", "+QGNSSC: 1", 5000, 1) == Success);//开启功GNSSC功能启动模块的GPS功能,此时PPS指示灯会点亮
        else if (sendCommand("AT+QGNSSC=1\r\n", "OK\r\n", 5000, 10) == Success);
        else errorLog(5);

        clrStruct();
        while(1)
        {
                if (sendCommand("AT+QGNSSRD=\"NMEA/RMC\"\r\n", "OK\r\n", 2000, 10) == Success);//获取GPS的NMEA协议数据
                else errorLog(6);

                Save_Data.isGetData = true;
                memset(Save_Data.GPS_Buffer, 0, GPS_Buffer_Length);      //清空
                memcpy(Save_Data.GPS_Buffer, USART2_RX_BUF, point2);
               
                printf("\r\n==========Save_Data.GPS_Buffer==========\r\n");
                printf(Save_Data.GPS_Buffer); //输出接收到的信息
                printf("\r\n");
                parseGpsBuffer();
                printGpsBuffer();
               
                delay_ms(300);
        }
}

void parseGpsBuffer()
{
        char *subString;
        char *subStringNext;
        char i = 0;
        if (Save_Data.isGetData)
        {
                Save_Data.isGetData = false;
                printf("**************\r\n");
                printf(Save_Data.GPS_Buffer);

               
                for (i = 0 ; i <= 6 ; i++)
                {
                        if (i == 0)
                        {
                                if ((subString = strstr(Save_Data.GPS_Buffer, ",")) == NULL)
                                        errorLog(1);        //解析错误
                        }
                        else
                        {
                                subString++;
                                if ((subStringNext = strstr(subString, ",")) != NULL)
                                {
                                        char usefullBuffer[2];
                                        switch(i)
                                        {
                                                case 1:memcpy(Save_Data.UTCTime, subString, subStringNext - subString);break;        //获取UTC时间
                                                case 2:memcpy(usefullBuffer, subString, subStringNext - subString);break;        //获取UTC时间
                                                case 3:memcpy(Save_Data.latitude, subString, subStringNext - subString);break;        //获取纬度信息
                                                case 4:memcpy(Save_Data.N_S, subString, subStringNext - subString);break;        //获取N/S
                                                case 5:memcpy(Save_Data.longitude, subString, subStringNext - subString);break;        //获取经度信息
                                                case 6:memcpy(Save_Data.E_W, subString, subStringNext - subString);break;        //获取E/W

                                                default:break;
                                        }

                                        subString = subStringNext;
                                        Save_Data.isParseData = true;
                                        if(usefullBuffer[0] == 'A')
                                                Save_Data.isUsefull = true;
                                        else if(usefullBuffer[0] == 'V')
                                                Save_Data.isUsefull = false;

                                }
                                else
                                {
                                        errorLog(2);        //解析错误
                                }
                        }


                }
        }
}

void printGpsBuffer()
{
        if (Save_Data.isParseData)
        {
                Save_Data.isParseData = false;
               
                printf("Save_Data.UTCTime = ");
                printf(Save_Data.UTCTime);
                printf("\r\n");

                if(Save_Data.isUsefull)
                {
                        Save_Data.isUsefull = false;
                        printf("Save_Data.latitude = ");
                        printf(Save_Data.latitude);
                        printf("\r\n");


                        printf("Save_Data.N_S = ");
                        printf(Save_Data.N_S);
                        printf("\r\n");

                        printf("Save_Data.longitude = ");
                        printf(Save_Data.longitude);
                        printf("\r\n");

                        printf("Save_Data.E_W = ");
                        printf(Save_Data.E_W);
                        printf("\r\n");
                       
                       
                        postGpsDataToOneNet(API_KEY, device_id, sensor_gps, Save_Data.longitude, Save_Data.latitude);                //发送数据到Onenet
                       
                        LED1 = 0;
                        delay_ms(100);
                        LED1 = 1;
                }
                else
                {
                        printf("GPS DATA is not usefull!\r\n");
                }
               
        }
}

int Digcount(long num)
{
        int i=0;       
        while(num>0)
        {
                i++;
                num=num/10;
        }
  return i;
}

char* longitudeToOnenetFormat(char *lon_str_temp)                 //经度
{
        unsigned long lon_Onenet = 0;
        unsigned int dd_int = 0;
        unsigned long mm_int = 0;
        float lon_Onenet_double = 0;
        int i = 0;

        unsigned long tempInt = 0;
        unsigned long tempPoint = 0;
        static char result[20];
        char point_result[20];
        int pointLength = 0;

        //51单片机没有double,double和float,精度不够,这里只能分开整数和小数换算。
        sscanf(lon_str_temp, "%ld.%ld", &tempInt,&tempPoint);
        lon_Onenet = tempInt%100;
        pointLength = strlen(lon_str_temp) - 1 - Digcount(tempInt);               
        for( i = 0 ; i < pointLength ; i++)        //小数点几位,整数部分就放大10的几次方
        {
                lon_Onenet *= 10;        
        }

        dd_int = tempInt / 100; //取出dd

        mm_int = lon_Onenet + tempPoint; //取出MM部分

        mm_int = mm_int*10/6;                         //本来是除以60,这里*10/6为了多2位小数点有有效数字


           sprintf(result,"%d.",dd_int);
        for( i = 0 ; i < pointLength + 2 - Digcount(mm_int) ; i++)
        {
                strcat(result, "0");       
        }
        sprintf(point_result,"%ld",mm_int);
        strcat(result, point_result);

//        SendString("\r\n==========ONENET FORMART==========\r\n");
//        SendString(result);
        return result;
}



char* latitudeToOnenetFormat(char *lat_str_temp)                 //纬度
{
        unsigned long lat_Onenet = 0;
        int dd_int = 0;
        unsigned long mm_int = 0;

        int i = 0;

        unsigned long tempInt = 0;
        unsigned long tempPoint = 0;
        static char result[20];
        char  point_result[20];
        int pointLength = 0;
//        char xdata debugTest[30];
       
        //51单片机没有double,double和float,精度不够,这里只能分开整数和小数换算。
        sscanf(lat_str_temp, "%ld.%ld", &tempInt,&tempPoint);
        lat_Onenet = tempInt%100;
       
//        SendString("\r\n==========ONENET FORMART strlen(lat_str_temp)==========\r\n");
//        sprintf(debugTest,"%d",strlen(lat_str_temp));
//        SendString(debugTest);

        pointLength = strlen(lat_str_temp) - 1 - Digcount(tempInt);       

//        SendString("\r\n==========ONENET FORMART pointLength==========\r\n");
//        sprintf(debugTest,"%d",pointLength);
//        SendString(debugTest);
        for( i = 0 ; i < pointLength ; i++)        //小数点几位,整数部分就放大10的几次方
        {
                lat_Onenet *= 10;        
        }

//        SendString("\r\n==========ONENET FORMART tempPoint==========\r\n");
//        sprintf(debugTest,"%ld",tempPoint);
//        SendString(debugTest);
//
//        SendString("\r\n==========ONENET FORMART tempInt==========\r\n");
//        sprintf(debugTest,"%ld",tempInt);
//        SendString(debugTest);
//
//        SendString("\r\n==========ONENET FORMART lat_Onenet==========\r\n");
//        sprintf(debugTest,"%ld",lat_Onenet);
//        SendString(debugTest);

        dd_int = tempInt / 100; //取出dd

        mm_int = lat_Onenet + tempPoint; //取出MM部分

        mm_int = mm_int*10/6;                         //本来是除以60,这里*10/6为了多2位小数点有有效数字

//        SendString("\r\n==========ONENET FORMART mm_int==========\r\n");
//        sprintf(debugTest,"%ld",mm_int);
//        SendString(debugTest);

       
        sprintf(result,"%d.",dd_int);
        for( i = 0 ; i < pointLength + 2 - Digcount(mm_int) ; i++)
        {
                strcat(result, "0");       
        }
        sprintf(point_result,"%ld",mm_int);
        strcat(result, point_result);

//        SendString("\r\n==========ONENET FORMART==========\r\n");
//        SendString(result);
        return result;
}

void postGpsDataToOneNet(char* API_VALUE_temp, char* device_id_temp, char* sensor_id_temp, char* lon_temp, char* lat_temp)
{
        char send_buf[400] = {0};
        char text[200] = {0};
        char tmp[25] = {0};

        char lon_str_end[15] = {0};
        char lat_str_end[15] = {0};

        char sendCom[2] = {0x1A};

//        dtostrf(longitudeToOnenetFormat(lon_temp), 3, 6, lon_str_end); //转换成字符串输出
//        dtostrf(latitudeToOnenetFormat(lat_temp), 2, 6, lat_str_end); //转换成字符串输出

//        lon_temp = "11224.4992";
//        lat_temp = "3438.1633";

        sprintf(lon_str_end,"%s", longitudeToOnenetFormat(lon_temp));
        sprintf(lat_str_end,"%s", latitudeToOnenetFormat(lat_temp));

        //连接服务器
        memset(send_buf, 0, 400);    //清空
        strcpy(send_buf, "AT+QIOPEN=\"TCP\",\"");
        strcat(send_buf, OneNetServer);
        strcat(send_buf, "\",\"80\"\r\n");
        if (sendCommand(send_buf, "CONNECT", 10000, 3) == Success);
        else errorLog(7);

        //发送数据
        if (sendCommand("AT+QISEND\r\n", ">", 3000, 1) == Success);
        else errorLog(8);

        memset(send_buf, 0, 400);    //清空

        /*准备JSON串*/
        //ARDUINO平台不支持sprintf的double的打印,只能转换到字符串然后打印
        sprintf(text, "{\"datastreams\":[{\"id\":\"%s\",\"datapoints\":[{\"value\":{\"lon\":%s,\"lat\":%s}}]}]}"
                , sensor_id_temp, lon_str_end, lat_str_end);

        /*准备HTTP报头*/
        send_buf[0] = 0;
        strcat(send_buf, "OST /devices/");
        strcat(send_buf, device_id_temp);
        strcat(send_buf, "/datapoints HTTP/1.1\r\n"); //注意后面必须加上\r\n
        strcat(send_buf, "api-key:");
        strcat(send_buf, API_VALUE_temp);
        strcat(send_buf, "\r\n");
        strcat(send_buf, "Host:");
        strcat(send_buf, OneNetServer);
        strcat(send_buf, "\r\n");
        sprintf(tmp, "Content-Length:%d\r\n\r\n", strlen(text)); //计算JSON串长度
        strcat(send_buf, tmp);
        strcat(send_buf, text);

        if (sendCommand(send_buf, send_buf, 3000, 1) == Success);
        else errorLog(9);

       
        if (sendCommand(sendCom, "\"succ\"}", 3000, 1) == Success);
        else errorLog(10);

        delay_ms(100);
        if (sendCommand("AT+QICLOSE\r\n", "OK\r\n", 3000, 1) == Success);
        else errorLog(11);
        delay_ms(100);

        if (sendCommand("AT+QIDEACT\r\n", "OK\r\n", 3000, 1) == Success);
        else errorLog(11);
        delay_ms(100);

}


void sendMessage(char *number,char *msg)
{
        char send_buf[20] = {0};
        memset(send_buf, 0, 20);    //清空
        strcpy(send_buf, "AT+CMGS=\"");
        strcat(send_buf, number);
        strcat(send_buf, "\"\r\n");
        if (sendCommand(send_buf, ">", 3000, 10) == Success);
        else errorLog(6);


        if (sendCommand(msg, msg, 3000, 1) == Success);
        else errorLog(7);
        delay_ms(100);

        memset(send_buf, 0, 100);    //清空
        send_buf[0] = 0x1a;
        if (sendCommand(send_buf, "OK\r\n", 10000, 5) == Success);
        else errorLog(8);
        delay_ms(100);
}

void errorLog(int num)
{
        printf("ERROR%d\r\n",num);
        while (1)
        {
                if (sendCommand("AT\r\n", "OK", 100, 10) == Success)
                {
                        Sys_Soft_Reset();
                }
                delay_ms(200);
        }
}

void Sys_Soft_Reset(void)
{  
    SCB->AIRCR =0X05FA0000|(u32)0x04;      
}

void phone(char *number)
{
        char send_buf[20] = {0};
        memset(send_buf, 0, 20);    //清空
        strcpy(send_buf, "ATD");
        strcat(send_buf, number);
        strcat(send_buf, ";\r\n");

        if (sendCommand(send_buf, "SOUNDER", 10000, 10) == Success);
        else errorLog(4);
}

unsigned int sendCommand(char *Command, char *Response, unsigned long Timeout, unsigned char Retry)
{
        unsigned char n;
        USART2_CLR_Buf();
        for (n = 0; n < Retry; n++)
        {
                u2_printf(Command);                 //发送GPRS指令
               
                printf("\r\n***************send****************\r\n");
                printf(Command);
               
                Time_Cont = 0;
                while (Time_Cont < Timeout)
                {
                        delay_ms(100);
                        Time_Cont += 100;
                        if (strstr(USART2_RX_BUF, Response) != NULL)
                        {                               
                                printf("\r\n***************receive****************\r\n");
                                printf(USART2_RX_BUF);
                                return Success;
                        }
                       
                }
                Time_Cont = 0;
        }
        printf("\r\n***************receive****************\r\n");
        printf(USART2_RX_BUF);
        USART2_CLR_Buf();
        return Failure;
}








正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

35

主题

560

帖子

2

精华

资深版主

Rank: 8Rank: 8

积分
17753
金钱
17753
注册时间
2018-3-3
在线时间
523 小时
发表于 2019-7-27 10:06:43 | 显示全部楼层
回复 支持 反对

使用道具 举报

6

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
196
金钱
196
注册时间
2017-7-18
在线时间
31 小时
发表于 2019-7-29 16:25:59 | 显示全部楼层
没有你想的那么难(当然可能也没我想的这么简单),,看样子应该是使用的AT指令的模块,
1、先把模块手册看下,每个AT指令干啥的,
2、通过串口连接模块到电脑上发送指令试试,会用到的多试试
3、在单片机里实现指令的发送,比如:uint8_t cmd[]="AT\r\n";XXX_SendCMD(cmd,4);看看串口接收的正常不,
4、综合自己的流程啊,先发什么指令,后发什么指令,接收到的数据怎么判断,使用,
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-1 02:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表