原创不易,转载注明出处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)
接收成功!就不上图了