Newer
Older
casic_unitree_dog / src / robotic_arm_serial_port.cpp
//
// Created by pengx on 2025/3/18.
//

#include "robotic_arm_serial_port.hpp"
#include <iomanip>
#include <iostream>

RoboticArmSerialPort::RoboticArmSerialPort(
    boost::asio::io_service &io_service, const std::string &port_name, const int baud_rate
): io_service_(io_service), port_(io_service, port_name) {
    port_.set_option(serial_port_base::baud_rate(baud_rate));
    port_.set_option(serial_port_base::character_size(8));
    port_.set_option(serial_port_base::parity(serial_port_base::parity::none));
    port_.set_option(serial_port_base::stop_bits(serial_port_base::stop_bits::one));

    read_from_port();
}

void RoboticArmSerialPort::read_from_port() {
    async_read_until(
        port_, buffer_, 0xFA,
        [this](const boost::system::error_code &error, const size_t bytes_transferred) mutable {
            if (!error) {
                // 获取接收到的数据
                std::istream is(&buffer_);
                std::vector<uint8_t> received_data(static_cast<std::streamsize>(bytes_transferred));
                is.read(
                    reinterpret_cast<char *>(received_data.data()), static_cast<std::streamsize>(bytes_transferred)
                );

                std::cout << "received " << bytes_transferred << " bytes: ";
                for (size_t i = 0; i < bytes_transferred; ++i) {
                    std::cout << std::hex
                            << std::uppercase
                            << std::setw(2)
                            << std::setfill('0')
                            << static_cast<int>(received_data[i])
                            << " ";
                }
                std::cout << std::endl;
            } else {
                std::cerr << "error: " << error.message() << std::endl;
            }
        });
}

void RoboticArmSerialPort::write(std::vector<uint8_t> command) {
    for (const uint8_t i: command) {
        std::cout << std::hex
                << std::uppercase
                << std::setw(2)
                << std::setfill('0')
                << static_cast<int>(static_cast<uint8_t>(i))
                << " ";
    }
    std::cout << std::endl;
    boost::asio::write(port_, boost::asio::buffer(command));
}