簡體   English   中英

如何將python字節數組附加到C++

[英]How to translate python byte array append to C++

我對 ROS 和嵌入式 C++ 編程非常陌生。 我討厭 Python,我希望將最初用 Python 編寫的節點轉換為 C++。 我不會詳細介紹這種轉換我對我采用的 OOP 方法感到滿意(將訂閱者回調放入一個類中,將發布者作為類成員),但是主要問題是 Python 中處理所需字節數組的一段代碼用於與 Arduino 通信。 我從來沒有在 C++ 中使用過字節和位,結果證明人們使用 Python 作為其友好的 Pyserial 庫,而 C++ 中的等效方法非常黑暗,特別是在 Linux 操作系統上。

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)

我知道這需要 my_data 是 ROS std_msgs/ByteMultiArray 類型,將來自該消息的實際數據傳遞到數組 my_array,現在該數組中的元素被讀取為 ASCI 而不是位,因此 for 循環將 48 添加到每個元素以獲得它們的十進制值。 最后兩個附加是 Arduino 中需要的一些特殊字節。

在 C++ 中,我不知道如何做到這一點。 我在這里找到了說明並創建了一個類 SerialComm 本質上模仿該代碼,該類中最重要的方法應該是:

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

我不確定參數是否應該具有 unsigned char* 數據類型,但似乎 unistd.h 中的 write 函數支持這一點。

總的來說,我如何准備“數據包”並將其發送到端口?

更具體地說,我需要寫入的數據是 ROS 中的 std_msgs/ByteMultiArray 類型,我檢查了它,實際數據是 std::vector<signed char> 類型,我嘗試將其作為解決方案:

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 變量的地址而沒有別的,但我主要是試圖以某種方式將 unsigned char* 傳遞給該 write 函數以將數據寫入端口。 當然,主要問題是如何將從 std_msgs/ByteMultiArray 獲得的 std::vector 數組轉換為寫入 arduino 端口所需的任何內容,並基本上模仿 Python 解決方案中發送的數據包。 我想我在這里主要是在理解字符數據類型方面掙扎,因為我從未真正使用過它們,我只記得它們很重要,因為它們具有單位位內存大小。

最直接的解決辦法:

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衰減為一個指針,返回該指針,並且retval超出范圍並被銷毀,留下一個指向無效內存的指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM