如何将Python字节数组附加到C++

2024-06-13 01:44:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我对ROS和嵌入式C++编程非常非常新。我讨厌Python,我希望把原来在Python写的节点转换成C++。我不会详细介绍这种转换,我对我采用的OOP方法感到满意(将订阅者回调放入类中,将发布者作为类成员),但主要问题是python中的一段代码,它处理与Arduino通信所需的字节数组。我在C++中从来没有用字节和比特工作,结果人们用Python来表示它的友好PyScript库,而C++中的等效方法非常黑暗,特别是在Linux操作系统上。p>

Python代码是:

def function_callback(my_data):
global packet
my_array=my_data.data
print(my_array)
packet = bytearray()
for byte in my_array:
    packet.append(byte+48)
packet.append(0x0A)
packet.append(0x0D)

我知道这会获取ROS std_msgs/BYTEMULITARRAY类型的my_数据,将该消息中的实际数据传递到数组my_数组,现在该数组中的元素将被读取为ASCI而不是位,因此for循环将48添加到每个元素,以获得其十进制值。最后两个附录是Arduino中需要的一些特殊字节

C++中我不知道如何做这个。我找到了指令here并创建了一个类SerialComm,该类本质上模仿了该代码,该类中最重要的方法应该是:

void SerialComm::write_port(unsigned char* msg)
{ 
  int i=write(serial_port, msg, sizeof(msg));
}

我不确定参数是否应该具有unsigned char*数据类型,但unistd.h中的write函数似乎支持这一点

总的来说,如何准备“数据包”并将其发送到端口

更具体地说,我需要在ROS中写入的数据是std_msgs/bytemultirray类型,我检查了它,实际数据是std::vector<;签名字符>;类型,我尝试将此作为解决方案:

unsigned char* make_byte_array(std::vector<signed char> array) const
{
    unsigned char retval[array.size()+2];
    int i=0;
    while (i<array.size())
    {
       retval[i]=array[i];
       i++;
    }
    retval[i+1]=0x0A;
    retval[i+2]=0x0D;
    return retval;
 }

这个函数显然是无意义的,但它是编译的,它自然不起作用,因为返回的是retval变量的地址,其他什么都没有,但我主要是试图以某种方式将无符号字符*传递给该写函数,以便将数据写入端口。当然,主要的问题是如何将从std_msgs/bytemultirray获得的std::vector数组转换为写入arduino端口所需的任何内容,并从本质上模拟Python解决方案中发送的数据包。我想我在这里主要是在理解chars数据类型方面遇到了困难,因为我从未真正使用过它们,我记得它们很重要,因为它们具有单位位内存大小


Tags: 数据方法代码data字节packetmyros
1条回答
网友
1楼 · 发布于 2024-06-13 01:44:51

最直接的解决方案:

std::vector<signed char> make_byte_array(std::vector<signed char> array) const
{
    array.push_back('\n');
    array.push_back('\r');
    return array;
}

发生的情况:array通过值传递,因此会自动复制它。我们利用此拷贝消除了在函数内部手动拷贝的需要。然后我们附加换行符和回车符,并返回结果vector

要获取存储在向量中的数组,请使用vectordata方法

signed char * data = result_vector.data();

或者在c++11之前的世界中,我从未见过这种技巧不起作用:

signed char * data = &result_vector[0];

所以。。。出了什么问题?在C++中返回数组是困难的。不同于C++中的其他任何东西,一个数组默认通过引用通过Array Decay。{}衰减为指针,指针返回,retval超出范围并被销毁,留下指向无效内存的指针

相关问题 更多 >