FL2440接收SF2820的GPS定位信息发送给服务器后解析显示

平台介绍

主机操作系统:Centos6.7
开发平台: FL2440
GPS模块:FIT-GPS-SF2820

编程思想

SF2820的GPS信息通过串口发送给FL2440,FL2440通过socket上报给服务器,服务器获取到GPS数据信息进行解析后显示,详细见代码。

详细代码

以下代码模块中要是不理解可以翻阅前面的博文,都有详细的解说。

服务端:

存放的文件有
这里写图片描述
gps.c 与gps.h可见博文
https://blog.csdn.net/m0_38022615/article/details/81386652
socket_server.c源代码:
功能:与客户端进行通信,接收客户端发来的数据,进行解析

/*********************************************************************************
 *      Copyright:  (C) 2018 NULL
 *                  All rights reserved.
 *
 *       Filename:  socket_server.c
 *    Description:  This file 
 *                 
 *        Version:  1.0.0(2018年08月05日)
 *         Author:  DingHuanhuan <[email protected]>
 *      ChangeLog:  1, Release initial version on "2018年08月05日 19时30分27秒"
 *                 
 ********************************************************************************/


#include "gps.h"


#include <string.h>
#include <stdlib.h>
#include <stdio.h>

/*   sockaddr_in{} and other Internet define */ 
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
/*    strerror(),perror(), errno head file   */
#include <errno.h>  

#define  BUF_SIZE    1024
#define  port        12345

int main(int argc, char **argv)
{
    int        listen_fd,accept_fd;    //创建两个套接字,一个开启连接,一个通信
    struct     sockaddr_in    server_addr;//服务器端地址,是一个结构体,等下要填充ipV4或者ipV6的结构
    char       buf[BUF_SIZE];
    GPRMC      gprmc_data;
    listen_fd = socket(AF_INET,SOCK_STREAM,0);
    if(listen_fd < 0)
    {
        printf("Creat socket failure:%s\n",strerror(errno));
        return -1;
    }
    printf("Socket creat fd is %d\n",listen_fd);

    /*服务器设置,设置server地址和端口号,用于接受任何client端*/
    memset(&server_addr,0,sizeof(server_addr));       //清空再设置ipV4地址
    server_addr.sin_family = AF_INET;                //设置为ipV4地址
    server_addr.sin_port = htons(port);             //端口号,主机字节序转网络字节序,short是16位
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY); //设置host主机地址
    if(bind(listen_fd,(struct sockaddr *)&server_addr,sizeof(server_addr))<0)
    {
        printf("Bind socket failure %s\n",strerror(errno));
        return -2;
    }
    printf("socket bind ok\n");

    listen(listen_fd,15);//等待连接,最大连接数设为15
    printf("socket listen ok\n");
    printf("Start accept %d\n",listen_fd);
    accept_fd = accept(listen_fd,NULL,NULL);
    //accept接受的参数必须经过listen和bing处理过,返回一个新的socket码
    //新的socket传送数据,旧的socket还能继续用accept接受请
    //后面两个参数设置为NULL,那么会在系统连接时自动根据客户端信息填入

    if(accept_fd <0)
    {
        printf("Listen socket failure: %s\n", strerror(errno));  //如果监听失败,打印错误信息
        return -3;
    }
    printf("socked accept fd is %d\n",accept_fd);


    while(1)
    {
        sleep(2);
        memset(buf,0,BUF_SIZE);
        if(recv(accept_fd,buf, BUF_SIZE,0)<0)
        {
           printf("recv failure:%s\n",strerror(errno));
           return -4;
        }
         //printf("gps_buff: %s\n",buf);
         memset(&gprmc_data,0,sizeof(gprmc_data));

         Analyse_GPRMC(buf,&gprmc_data);
         Print_GPRMC(&gprmc_data);


    }
    close(accept_fd);
    close(listen_fd);


    return 0;
}

makefile编译

#This Makefile used to call function to compile all the C source in current folder and links all the objects file into a excutable binary file.  

PWD=$(shell pwd)

prom = server

export CC=gcc

VPATH= .
SRCS = $(wildcard ${VPATH}/*.c)
DEPS = $(shell find ${VPATH}/*.h)
OBJS = $(patsubst %.c,%.o,$(SRCS))


$(prom): $(OBJS)
    @$(CC) -o $(prom) $(OBJS)
    @rm -rf *.o
clean:
    @rm -rf *.o

编译后生成server的可执行文件。

FL2440上:

编译FL2440上可执行的文件所存放的文件夹见如图:
这里写图片描述
comport.c 和comport.h 见博文
https://blog.csdn.net/m0_38022615/article/details/81294028

socket_cilent.c源代码:

/*********************************************************************************
 *      Copyright:  (C) 2018 NULL
 *                  All rights reserved.
 *
 *       Filename:  socket_server.c
 *    Description:  This file 
 *                 
 *        Version:  1.0.0(2018年08月04日)
 *         Author:  DingHuanhuan <[email protected]>
 *      ChangeLog:  1, Release initial version on "2018年08月04日 19时18分17秒"
 *                 
 ********************************************************************************/


#include <string.h>
#include <stdlib.h>
#include <stdio.h>
/*  sockaddr_in{} and other Internet define */ 
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
/*   strerror(),perror(), errno head file   */
#include <errno.h>


#include "comport.h"

#define  BUF_SIZE   1024
#define  Serv_IP    "192.168.0.5"
#define  port        12345
int main(int argc, char **argv)
{
    int                 sockfd  = -1;           //创建一个套接字
    int                 read_fd = 0;
    struct sockaddr_in  serv_addr;//定义网络通信通用兼容的IPV4/IPV6结构体
    char                buf[BUF_SIZE];          //定义缓冲区
    char                *devname = "/dev/ttyS1";
    unsigned long       baudrate = 4800;
    COM_PORT            *comport;


    comport = Comport_Init(devname, baudrate, "8N1");
    if(NULL == comport)
    {   
        printf("init serial port failure\n");
        return -1;                           
     }   

     Comport_open(comport);
     if(comport->fd <0)
     {
         printf("open error :%s\n",strerror(errno));
         exit(1);

     }

      printf("OPEN THE DEVICE\n");

    sockfd  =  socket(AF_INET,SOCK_STREAM,0);//创建一个套接字,IPV4面向TCP连接

    if(sockfd < 0)         //若创建套接字出错
    {
      printf("creat socket failure:%s\n",strerror(errno));
      return -1;
    }

    printf("socket create fd is %d \n",sockfd); //打印套接字的文件描述符

    /* 连接服务器的准备,设置要连接的服务器的IP地址和端口号 */
    memset(&serv_addr,0,sizeof(serv_addr));//清空处理网络通信的地址的结构体
    serv_addr.sin_family = AF_INET;        //设置为IPV4地址
    serv_addr.sin_port   = htons(port);    //端口号,主机字节序转网络字节序
    //inet_aton(Serv_IP,&serv_addr.sin_addr);//把字符串IP地址转换为一个32位网络序列IP地址
    //printf ("设置 IP地址端口号成功\n");

    if(inet_pton(AF_INET, Serv_IP, &serv_addr.sin_addr) <=0)
    {
        printf("inet_pton error for %s\n",strerror(errno));
        return -2;
    }
    printf("inet_pton : %s\n",Serv_IP); 
    /* 连接服务端 */
    if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr))<0)
    {
      printf("connect to the server failure:%s\n",strerror(errno));
      return -3;
    }


    while(1)
    {

      sleep(2);
      memset(buf, 0, BUF_SIZE);
      //printf("start to read\n");
      if(read(comport->fd, buf ,sizeof(buf))<0)//分段
      {
          printf ("read failure :%s\n",strerror(errno));
          return -4;
      }
      printf ("read from the comport:%s\n",buf);
      sleep(2);

     // printf("start to send\n");
      if(send(sockfd,buf,strlen(buf),0)<0)
      {
          printf ("send failure :%s\n",strerror(errno));
          return -3;
      }
      //printf ("send  is ok\n");

    }

   close(sockfd);
   close(comport->fd);
   free(comport);
    return 0;
}

makefile编译:(因为要在FL2440上运行,用到交叉编译器)

#This Makefile used to call function to compile all the C source in current folder and links all the objects file into a excutable binary file.  

PWD=$(shell pwd)

prom = comport

CROSS_COMPILE=/opt/xtools/arm920t/bin/arm-linux-
export CC=${CROSS_COMPILE}gcc
export CXX=${CROSS_COMPILE}g++
export AR=${CROSS_COMPILE}ar
export AS=${CROSS_COMPILE}as
export RANLIB=${CROSS_COMPILE}ranlib
export STRIP=${CROSS_COMPILE}strip


VPATH= .
SRCS = $(wildcard ${VPATH}/*.c)
DEPS = $(shell find ${VPATH}/*.h)
OBJS = $(patsubst %.c,%.o,$(SRCS))


$(prom): $(OBJS)
    @$(CC) -o $(prom) $(OBJS)
    @rm -rf *.o
clean:
    @rm -rf *.o

生成可执行文件comport,将其发到PC 端,后连接FL2440,通过命令下载此文件:
tftp -gr comport 192.168.0.192

然后在服务端运行server文件: ./server
在FL2440上运行 :./comport
执行结果如图(左为服务端,右为FL2440执行端)
这里写图片描述

此篇文章的代码必须先执行服务端后再运行客户端(FL2440)才可正常运行。

猜你喜欢

转载自blog.csdn.net/m0_38022615/article/details/81459017