串口通讯之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)
串口通讯之rs232 c++版本的更多相关文章
- 用分立元件实现串口通讯TTL/RS232电平转换
1.计算机串口通信的RS-232电平:用正负电压来表示逻辑状态.逻辑1= = -3V--15V,逻辑0=+3-+15V. 2.单片机串口通信的TTL电平:输出高电平>2.4V,输出低电平< ...
- 乐鑫esp8266的串口通讯驱动源文件,nonos和rtos版本
目录 一.前言: 二.esp8266的串口分布情况: 三.esp8266的串口通讯时候,应该怎么接线: 四.esp8266的NONOS非系统,串口编程: 五.esp8266的RTOS实时系统,串口编程 ...
- Android Studio的串口通讯开发
基于android-serialport-api实现 前言RS232标准接口UARTRS232与UART转接下载 NDK 和构建工具创建支持 C/C++ 的新项目编译C/C++代码串口通讯原理关于校验 ...
- C#串口通讯实例
本文参考<C#网络通信程序设计>(张晓明 编著) 程序界面如下图: 参数设置界面代码如下: using System; using System.Collections.Generic; ...
- 用SPCOMM 在 Delphi中实现串口通讯 转
用Delphi 实现串口通讯,常用的几种方法为:使用控件如MSCOMM和SPCOMM,使用API函数或者在Delphi 中调用其它串口通讯程序.利用API编写串口通信程序较为复杂,需要掌握大量通信 ...
- 浅析PC机串口通讯流控制
转自浅析PC机串口通讯流控制 我们在串行通讯处理中,常常看到RTS/CTS和XON/XOFF这两个选项,这就是两个流控制的选项,目前流控制主要应用于调制解调器的数据通讯中,但对普通RS232编程,了解 ...
- Java利用Rxtx进行串口通讯
最近在做传感器数据采集的工作,底层是基于Zigbee的无线传感网络,所有数据采集到Zigbee协调器上然后通知上位机数据采集完成,上位机通过USB转串口去读取数据就可以了.那么问题来了,如何进行串口通 ...
- COM口,串行通讯端口,RS-232接口 基础知识
COM口即串行通讯端口. COM口的接口标准规范和总线标准规范是RS-232,有时候也叫做RS-232口.电脑上的com口多为9针,最大速率115200bps.通常用于连接鼠标(串口)及通讯设备(如连 ...
- C#串口通讯概念以及简单实现
最近在研究串口通讯,其中有几个比较重要的概念,RS-232这种适配于上位机和PC端进行连接,RS-232只限于PC串口和设备间点对点的通信.它很简单的就可以进行连接,由于串口通讯是异步的,也就是说你可 ...
随机推荐
- python网络爬虫-解析网页(六)
解析网页 主要使用到3种方法提取网页中的数据,分别是正则表达式.beautifulsoup和lxml. 使用正则表达式解析网页 正则表达式是对字符串操作的逻辑公式 .代替任意字符 . *匹配前0个或多 ...
- mysql 相关练习题
/* 自己查询自己 把一张表看成是两张表. 表的设计. SELECT * FROM depart; SELECT d1. NAME '部门', d2. NAME '分部门' FROM depart d ...
- hr虚线
转载请注明来源:https://www.cnblogs.com/hookjc/ <hr size="1" noshade="noshade" style= ...
- NSString为何要用copy修饰,而不是strong?
NSString本身是无所谓的,但是如果一个 NSString 指针指向了一个 NSMutableString的内存空间的话,如果使用 strong 修饰的话,如果你在别处修改这个值的话,那么原来的值 ...
- Category注意事项
1.分类的使用注意事项 分类只能增加方法, 不能增加成员变量 @interface Person (NJ) { // 错误写法 // int _age; } - (void)eat; @end 分类中 ...
- new方法实现原理
new方法实现原理 完整的创建一个可用的对象:Person *p=[Person new]; new方法的内部会分别调用两个方法来完成3件事情: (1)使用alloc方法来分配存储空间(返回分配的对象 ...
- notify()和wait()
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11398563.html notify() 和 wait() 主要是用来多个线程之间的协作. 它 ...
- 线性结构和非线性结构、稀疏数组、队列、链表(LinkedList)
一.线性结构和非线性结构 线性结构: 1)线性绪构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系 2)线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构.顺序存储的线性表称为顺 ...
- API 接口的安全设计验证:ticket,签名,时间戳
一.背景 1.与前端对接的API接口,如果被第三方抓包并进行恶意篡改参数,可能会导致数据泄露,甚至会被篡改数据 2.与第三方公司的接口对接,第三方如果得到你的接口文档,但是接口确没安全校验,是十分不安 ...
- git忽略项目中的指定文件
git仓库提交原则:提交给远程仓库的只有源代码和相关的配置文件 如果是使用模板建立的仓库,会自带有.gitignore文件,无需再建立.当然如果需要在指定文件忽略,只需要在这个文件中添加指定的文件即可 ...