激光雷达数据(c++源码)通过socket传输给python处理(struct结构体数据socket传输)

原创不易,转载注明出处https://blog.csdn.net/weixin_40490238/article/details/89217585

遇到一个麻烦问题

c++跟python通信,将c++的struct 数据组发送给python去处理

看了网上的多篇攻略,发现都比较麻烦,c++和c 处理进程间通信的常用方式:共享内存,消息队列,信号量,管道,信号,socket,文件mmap等。而python中只支持上述列表中的管道,信号,socket,文件mmap。

最后我选则了socket

c++源码分析

头文件:

/*
*  3iRoboticsLIDAR System
*  Driver Interface
*
*  Copyright 2017 3iRobotics
*  All rights reserved.
*
*	Author: 3iRobotics, Data:2017-04-06
*
*/

#include "rstypes.h"
#include "rslidar_protocol.h"
#include "rslidar_driver.h"
#include "rslidar.h"
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <unistd.h>
#include <stddef.h>

#define DEG2RAD(x) ((x)*M_PI/180.)

#ifndef _countof
#define _countof(_Array) (int)(sizeof(_Array) / sizeof(_Array[0]))
#endif

using namespace std;
using namespace rs::standalone::rslidar;

// socket udp
#include <string.h>   
#include <errno.h>   
#include <sys/types.h>   
#include <sys/socket.h>   
#include <netinet/in.h>   
#include <arpa/inet.h>  
#include<iostream>
using namespace std;

#define PORT 8000
#define IP_ADDRESS "127.0.0.1"

分析其雷达保存的数据结构:

typedef struct _rslidar_signal_distance_unit_t {
	// _u8			signalValue;
	_u16		angle;
	_u16		distanceValue;
} __attribute__((packed)) RSLIDAR_SIGNAL_DISTANCE_UNIT_T;

雷达的数据采用了struct结构体,angle表示角度,distanceValue表示距离,我将其数据保存成char字符,利用socket发送给python进行处理

先建立了socket

	//建立udp socket
	int socked_fd=socket(AF_INET,SOCK_DGRAM,0);
	if(socked_fd<0)
	{
		printf("creat socket failed!\n");
		exit(1);
	}
	struct sockaddr_in addr_serv;
	int len;
	memset(&addr_serv,0,sizeof(addr_serv)); //每个字节都用0填充
	addr_serv.sin_family=AF_INET;//使用ipv4地址
	addr_serv.sin_port=htons(PORT);//端口
	addr_serv.sin_addr.s_addr=inet_addr(IP_ADDRESS);//IP地址
	len=sizeof(addr_serv);

因为雷达数据量较大,一个包发送不了,将其分成多个包发送,然后在python在将其组合

            if (IS_OK(op_result) && (eflag == 100) && count > 50)
            {
                printf("Lidar Count is %d\n",(int)count);

				string msg_send="[";
				char td1[8],td2[8];
				int send_num;
				for(int i=0;i<count;i++)
				{
					sprintf(td1,"%d",nodes[i].angle);
					sprintf(td2,"%d",nodes[i].distanceValue);
					msg_send=msg_send+td1+","+td2+",";
					//分块发送,数据大于1500,一次发送接受不到,溢出
					if(i==50||i==100||i==150||i==200||i==250||i==300||i==350||i==400)
					{
						const char *msg=msg_send.c_str();
						send_num=sendto(socked_fd,msg,strlen(msg),0,(struct sockaddr *)&addr_serv,len);
						if(send_num<0)
						{
							printf("send failed!\n");
							exit(1);
						}
						printf("send data:%s,data ssize:%d\n",msg,strlen(msg));
						msg_send="";
					}
					
				}
				msg_send=msg_send+"]";
				const char *msg=msg_send.c_str();
				send_num=sendto(socked_fd,msg,strlen(msg),0,(struct sockaddr *)&addr_serv,len);
				printf("send data:%s,data ssize:%d\n",msg,strlen(msg));
				if(send_num<0)
				{
					printf("send failed!\n");
					exit(1);
				}
            }

python测试接收端:

import socket
import time


bufSize = 1024
serverIp = '127.0.0.1'
serverPort = 8000
serverHost = (serverIp, serverPort)

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client.bind(('', 8000))

while True:
        data, addr = client.recvfrom(bufSize)
        print("data:",data,"addr:",addr)

接收成功!就不上图了

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页