基于ROS的串口底层写法

serial_device.cpp

#include "serial_device.h"

namespace roborts_sdk {
SerialDevice::SerialDevice(std::string port_name,
                           int baudrate) :
    port_name_(port_name),
    baudrate_(baudrate),
    data_bits_(8),
    parity_bits_('N'),
    stop_bits_(1) {}

SerialDevice::~SerialDevice() {
  CloseDevice();
}

bool SerialDevice::Init() {

  DLOG_INFO << "Attempting to open device " << port_name_ << " with baudrate " << baudrate_;
  if (port_name_.c_str() == nullptr) {
    port_name_ = "/dev/ttyUSB0";
  }
  if (OpenDevice() && ConfigDevice()) {
    FD_ZERO(&serial_fd_set_);
    FD_SET(serial_fd_, &serial_fd_set_);
    DLOG_INFO << "...Serial started successfully.";
    return true;
  } else {
    DLOG_ERROR << "...Failed to start serial "<

serial_device.h

#ifndef ROBORTS_SDK_SERIAL_DEVICE_H
#define ROBORTS_SDK_SERIAL_DEVICE_H
#include 
#include 

#include 
#include 
#include 

#include "../utilities/log.h"
#include "hardware_interface.h"

namespace roborts_sdk {
/**
 * @brief serial device class inherited from hardware interface
 */
class SerialDevice: public HardwareInterface {
 public:
  /**
   * @brief Constructor of serial device
   * @param port_name port name, i.e. /dev/ttyUSB0
   * @param baudrate serial baudrate
   */
  SerialDevice(std::string port_name, int baudrate);
  /**
   * @brief Destructor of serial device to close the device
   */
  ~SerialDevice();
  /**
   * @brief Initialization of serial device to config and open the device
   * @return True if success
   */
  virtual bool Init() override ;
  /**
   * @brief Serial device read function
   * @param buf Given buffer to be updated by reading
   * @param len Read data length
   * @return -1 if failed, else the read length
   */
  virtual int Read(uint8_t *buf, int len) override ;
  /**
   * @brief Write the buffer data into device to send the data
   * @param buf Given buffer to be sent
   * @param len Send data length
   * @return < 0 if failed, else the send length
   */
  virtual int Write(const uint8_t *buf, int len) override ;

 private:
  /**
   * @brief Open the serial device
   * @return True if open successfully
   */
  bool OpenDevice();
  /**
   * @brief Close the serial device
   * @return True if close successfully
   */
  bool CloseDevice();

  /**
   * @brief Configure the device
   * @return True if configure successfully
   */
  bool ConfigDevice();

  //! port name of the serial device
  std::string port_name_;
  //! baudrate of the serial device
  int baudrate_;
  //! stop bits of the serial device, as default
  int stop_bits_;
  //! data bits of the serial device, as default
  int data_bits_;
  //! parity bits of the serial device, as default
  char parity_bits_;
  //! serial handler
  int serial_fd_;
  //! set flag of serial handler
  fd_set serial_fd_set_;
  //! termios config for serial handler
  struct termios new_termios_, old_termios_;
};
}
#endif //ROBORTS_SDK_SERIAL_DEVICE_H
//简单初始化
device_ = std::make_shared("/dev/ttyUSB0", 921600);
device_ ->Init();

你可能感兴趣的:(基于ROS的串口底层写法)