• 串口通讯之rs232 c++版本


    rs232.cpp

    #ifndef kranfix_rs232_rs232_cc
    #define kranfix_rs232_rs232_cc
    
    #include "rs232.h"
    
    static int error;
    static struct termios nps;
    
    kfx::RS232::RS232(char *dev_name, int baudrate) : available(false) {
      // asigning device name
      strcpy(devname, dev_name);
    
      // Chossing baudrate
      switch (baudrate) {
        case 50 : baudr = B50;
          break;
        case 75 : baudr = B75;
          break;
        case 110 : baudr = B110;
          break;
        case 134 : baudr = B134;
          break;
        case 150 : baudr = B150;
          break;
        case 200 : baudr = B200;
          break;
        case 300 : baudr = B300;
          break;
        case 600 : baudr = B600;
          break;
        case 1200 : baudr = B1200;
          break;
        case 1800 : baudr = B1800;
          break;
        case 2400 : baudr = B2400;
          break;
        case 4800 : baudr = B4800;
          break;
        case 9600 : baudr = B9600;
          break;
        case 19200 : baudr = B19200;
          break;
        case 38400 : baudr = B38400;
          break;
        case 57600 : baudr = B57600;
          break;
        case 115200 : baudr = B115200;
          break;
        case 230400 : baudr = B230400;
          break;
        case 460800 : baudr = B460800;
          break;
        case 500000 : baudr = B500000;
          break;
        case 576000 : baudr = B576000;
          break;
        case 921600 : baudr = B921600;
          break;
        case 1000000 : baudr = B1000000;
          break;
        default      : printf("invalid baudrate
    ");
          return;
      }
    
      port = open(devname, O_RDWR | O_NOCTTY | O_NDELAY);
      if (port == -1) {
        perror("unable to open comport ");
        return;
      }
    
      error = tcgetattr(port, &ops);
      if (error == -1) {
        close(port);
        perror("unable to read portsettings ");
        return;
      }
      memset(&nps, 0, sizeof(nps));  /* clear the new struct */
    
      nps.c_cflag = baudr | CS8 | CLOCAL | CREAD;
      nps.c_iflag = IGNPAR;
      nps.c_oflag = 0;
      nps.c_lflag = 0;
      nps.c_cc[VMIN] = 0;      /* block untill n bytes are received */
      nps.c_cc[VTIME] = 0;     /* block untill a timer expires (n * 100 mSec.) */
      error = tcsetattr(port, TCSANOW, &nps);
      if (error == -1) {
        close(port);
        perror("unable to adjust portsettings ");
        return;
      }
    
      available = true;
    }
    
    int kfx::RS232::Read(unsigned char byte) {
      return read(port, &byte, 1);
    }
    
    int kfx::RS232::Read(unsigned char *buf, int size) {
    #ifndef __STRICT_ANSI__                       /* __STRICT_ANSI__ is defined when the -ansi option is used for gcc */
      if (size > SSIZE_MAX) size = (int) SSIZE_MAX;  /* SSIZE_MAX is defined in limits.h */
    #else
      if(size>4096)  size = 4096;
    #endif
    
      return read(port, buf, size);
    }
    
    int kfx::RS232::Write(unsigned char byte) {
      return write(port, &byte, 1);
    }
    
    int kfx::RS232::Write(unsigned char *buf, int size) {
      return write(port, buf, size);
    }
    
    void kfx::RS232::Close() {
      close(port);
      tcsetattr(port, TCSANOW, &ops);
    }
    
    /*
    Constant    Description
    --------------------------------------------
    TIOCM_LE    DSR (data set ready/line enable)
    TIOCM_DTR   DTR (data terminal ready)
    TIOCM_RTS   RTS (request to send)
    TIOCM_ST    Secondary TXD (transmit)
    TIOCM_SR    Secondary RXD (receive)
    TIOCM_CTS   CTS (clear to send)
    TIOCM_CAR   DCD (data carrier detect)
    TIOCM_CD    Synonym for TIOCM_CAR
    TIOCM_RNG   RNG (ring)
    TIOCM_RI    Synonym for TIOCM_RNG
    TIOCM_DSR   DSR (data set ready)
    */
    int kfx::RS232::IsCTSEnabled() {
      int status;
      status = ioctl(port, TIOCMGET, &status);
      return (status & TIOCM_CTS) ? 1 : 0;
    }
    
    // Sends a string to serial port till finding a ''
    void kfx::RS232::Print(const char *text) {
      while (*text != 0) Write(*(text++));
    }
    
    #endif // kranfix_rs232_rs232_cc

    rs232.h

    #ifndef github_com_kranfix_rs232_rs232_h
    #define github_com_kranfix_rs232_rs232_h
    
    #include <stdio.h>
    #include <string.h>
    
    #include <termios.h>
    #include <sys/ioctl.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <limits.h>
    
    namespace kfx {
    
    const char Comports[22][13] = {"/dev/ttyACM0",
                                   "/dev/ttyS1", "/dev/ttyS2", "/dev/ttyS3",
                                   "/dev/ttyS4", "/dev/ttyS5", "/dev/ttyS6",
                                   "/dev/ttyS7", "/dev/ttyS8", "/dev/ttyS9",
                                   "/dev/ttyS10", "/dev/ttyS11", "/dev/ttyS12",
                                   "/dev/ttyS13", "/dev/ttyS14", "/dev/ttyS15",
                                   "/dev/ttyUSB0", "/dev/ttyUSB1", "/dev/ttyUSB2",
                                   "/dev/ttyUSB3", "/dev/ttyUSB4", "/dev/ttyUSB5"};
    
    class RS232 {
      char devname[13];   // Device Name
      int baudr, port;    // Baudrate and Port Number
      bool available;
      struct termios ops; // old port settings
     public:
      RS232(char *, int);
      int IsAvailable() { return available; }
      char *GetDeviceName() { return devname; }
      int Read(unsigned char);
      int Read(unsigned char *, int);
      int Write(unsigned char);
      int Write(unsigned char *, int);
      void Print(const char *);
      void Close();
      int IsCTSEnabled();
    };
    
    }
    
    #endif // giihub_com_kranfix_rs232_rs232_h

    Gripper.cpp

    //
    // Created by wt on 2020/6/15.
    //
    
    #include "Gripper.h"
    
    Gripper::Gripper(char *port, int bau):rs232(port,bau) {
    
    }
    
    Gripper::~Gripper() {
    
    }
    
    void Gripper::pinch(int speed, int power) {
        //数据
        unsigned char data[10];
        data[0] = 'xEB';
        data[1] = 'x90';
        data[2] = 'x01';
        data[3] = 'x05';
        data[4] = 'x10';
        data[5] = speed&0x00ff;
        data[6] = speed>>8;
        data[7] = power&0x00ff;
        data[8] = power>>8;
        data[9] = (data[2]+data[3]+data[4]+data[5]+data[6]+data[7]+data[8])&0x00ff;
        rs232.Write(data,10);
    }
    
    void Gripper::release(int speed) {
        //数据
        unsigned char data[8];
        data[0] = 'xEB';
        data[1] = 'x90';
        data[2] = 'x01';
        data[3] = 'x03';
        data[4] = 'x11';
        data[5] = speed&0x00ff;
        data[6] = speed>>8;
    
        data[7] = (data[2]+data[3]+data[4]+data[5]+data[6])&0x00ff;
        rs232.Write(data,8);
    }

    Gripper.h

    //
    // Created by wt on 2020/6/15.
    //
    
    #ifndef JAWCPP_GRIPPER_H
    #define JAWCPP_GRIPPER_H
    #include "rs232.h"
    
    class Gripper {
    private:
        kfx::RS232 rs232;
    public:
        Gripper(char *port, int bau = 115200);
    
        ~Gripper();
        //夹住
        void pinch(int speed=500,int power = 100);
        //松开
        void release(int speed=500);
    };
    
    
    #endif //JAWCPP_GRIPPER_H

    main.cpp

    #include <iostream>
    #include "Gripper.h"
    int main() {
        Gripper gripper("/dev/ttyUSB1");
        gripper.pinch(1000,300);
    //    gripper.release();
        return 0;
    }

    CMakeLists.txt

    cmake_minimum_required(VERSION 3.16)
    project(JawCpp)
    
    set(CMAKE_CXX_STANDARD 14)
    
    add_executable(JawCpp main.cpp rs232.cpp Gripper.cpp)
  • 相关阅读:
    团队项目-选题报告
    1
    第二次结对编程作业
    第2组 团队展示
    第02组 Alpha冲刺(4/6)
    第02组 Alpha冲刺(3/6)
    第02组 Alpha冲刺(2/6)
    第02组 Alpha冲刺(1/6)
    第02组 团队GIT现场编程实战
    团队项目-需求分析报告
  • 原文地址:https://www.cnblogs.com/kongweisi/p/14044557.html
Copyright © 2020-2023  润新知