2016-04-15 4 views
1

ich meine Seriengerät mit hexadezimal als data = "\x35\x0d" dargestellt schreiben (die 5 und Carriage Return) mit diesem Code:Hex-String an Bytes für ASIO schreiben

boost::asio::write(
     *serial_port, 
     boost::asio::buffer(data.c_str(), data.size()), 
     boost::asio::transfer_at_least(data.size()), 
     error 
    ); 

Wie könnte ich die Zeichenfolge konvertieren „350d“ in eine Byte-Zeichenfolge für den Schreibzugriff auf meine serielle Schnittstelle? Nicht alle meine Befehle sind fest codiert. Vielen Dank.

Antwort

0

Diese Funktion ist für mich:

std::string hex_str_to_binary(std::string hex_str) 
{ 
    std::string binary_str, extract_str; 

    try 
    { 
     assert(hex_str.length() % 2 == 0); // throw exception if string length is not even 
     binary_str.reserve(hex_str.length()/2); 
     for (std::string::const_iterator pos = hex_str.begin(); pos < hex_str.end(); pos += 2) 
     { 
      extract_str.assign(pos, pos + 2); 
      binary_str.push_back(std::stoi(extract_str, nullptr, 16)); 
     } 
    } 
    catch (const std::exception &e) 
    { 
     std::cerr << "e.what() = " << e.what(); 
     throw -1; 
    } 

    return binary_str; 
} 

hex_str aussehen wird "350d". Ich verwende Kleinbuchstaben und stelle sicher, dass deine Zeichenfolge eine gerade Länge hat und das Leerzeichen mit Nullen füllt. Sie verwenden diese Zeichenfolge dann für asio write:

boost::asio::write(
     *serial_port, 
     boost::asio::buffer(binary_str.c_str(), binary_str.size()), 
     boost::asio::transfer_at_least(binary_str.size()), 
     error 
    ); 
1

Hier ist ein Code, den ich vor einiger Zeit für ein einfaches Tool zusammengestellt habe, an dem ich gerade arbeitete. Dies beinhaltet Konvertierungen in beide Richtungen. Es ist nicht die nur Weg, aber es ist ein Weg.

// Convert binary data to hex string 
std::string to_hex(const std::vector<uint8_t> & data) 
{ 
    std::ostringstream oss; 
    oss << std::hex << std::setfill('0'); 
    for(uint8_t val : data) 
    { 
    oss << std::setw(2) << (unsigned int)val; 
    } 
    return oss.str(); 
} 

// Convert hex string to binary data 
std::vector<uint8_t> from_hex(const std::string & s) 
{ 
    std::vector<uint8_t> data; 
    data.reserve(s.size()/2); 
    std::istringstream iss(s); 
    iss >> std::hex; 
    char block[3] = {0}; 
    while(iss.read(block, 2)) 
    { 
    uint8_t val = std::strtol(block, NULL, 16); 
    data.push_back(val); 
    } 
    return data; 
} 

Sie werden verschiedene Header-Dateien benötigt: <cstdint>, <iomanip>, <sstream>, <string>, <vector>.

+0

danke; Ich brauche die Funktion, um eine Zeichenfolge zurückzugeben; Ich fand sehes Antwort hier ziemlich gut: http://StackOverflow.com/a/36627615/4056146 – xinthose

+0

Es ist ein bisschen seltsam, eine 'std :: string' für Binärdaten zu verwenden, aber es funktioniert. Solange Sie wissen, dass Sie C-Funktionen wie "strlen" nicht verwenden können, wenn die Daten Nullwerte enthalten. Damit dieser Code Zeichenfolgen verwendet, müssen Sie im Grunde nur die Vektoren für Zeichenfolgen wechseln und 'char' anstelle von' uint8_t' verwenden. Die verknüpfte Lösung ist ein bisschen schöner, da sie keinen 'stringstream' verwendet. – paddy

+0

OK, ich verstehe. Ich werde mit meinen Ergebnissen bei der Arbeit berichten. – xinthose