串口通讯之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\n");
      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 '\0'
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)

 

posted @ 2020-11-26 21:05  胖白白  阅读(1864)  评论(0编辑  收藏  举报