Modbus cpp 0.1
Loading...
Searching...
No Matches
connection.hpp
1// Modbus for c++ <https://github.com/Mazurel/Modbus>
2// Copyright (c) 2020 Mateusz Mazur aka Mazurel
3// Licensed under: MIT License <http://opensource.org/licenses/MIT>
4
5#pragma once
6
7#include <sstream>
8#include <stdexcept>
9#include <string>
10#include <tuple>
11#include <vector>
12
13#include <cerrno>
14#include <fcntl.h>
15#include <poll.h>
16#include <termios.h>
17#include <unistd.h>
18
19#include "MB/modbusException.hpp"
20#include "MB/modbusRequest.hpp"
21#include "MB/modbusResponse.hpp"
22#include "MB/modbusUtils.hpp"
23
24namespace MB::Serial {
26 public:
27 // Pretty high timeout
28 static const unsigned int DefaultSerialTimeout = 100;
29
30 private:
31 struct termios _termios;
32 int _fd;
33
34 int _timeout = Connection::DefaultSerialTimeout;
35
36 public:
37 constexpr explicit Connection() : _termios(), _fd(-1) {}
38 explicit Connection(const std::string &path);
39 explicit Connection(const Connection &) = delete;
40 explicit Connection(Connection &&) noexcept;
41 Connection &operator=(Connection &&);
43
44 void connect();
45
46 std::vector<uint8_t> sendRequest(const MB::ModbusRequest &request);
47 std::vector<uint8_t> sendResponse(const MB::ModbusResponse &response);
48 std::vector<uint8_t> sendException(const MB::ModbusException &exception);
49
54 std::vector<uint8_t> send(std::vector<uint8_t> data);
55
56 void clearInput();
57
58 [[nodiscard]] std::tuple<MB::ModbusResponse, std::vector<uint8_t>> awaitResponse();
59 [[nodiscard]] std::tuple<MB::ModbusRequest, std::vector<uint8_t>> awaitRequest();
60
61 [[nodiscard]] std::vector<uint8_t> awaitRawMessage();
62
63 void enableParity(const bool parity) {
64 if (parity)
65 getTTY().c_cflag |= PARENB;
66 else
67 getTTY().c_cflag &= ~PARENB;
68 }
69
70 void setEvenParity() {
71 enableParity(true);
72 getTTY().c_cflag &= ~PARODD;
73 }
74
75 void setOddParity() {
76 enableParity(true);
77 getTTY().c_cflag |= PARODD;
78 }
79
80 void setTwoStopBits(const bool two) {
81 if (two) {
82 getTTY().c_cflag |= CSTOPB;
83 } else {
84 getTTY().c_cflag &= ~CSTOPB;
85 }
86 }
87
88#define setBaud(s) \
89 case s: \
90 speed = B##s; \
91 break;
92 void setBaudRate(speed_t speed) {
93 switch (speed) {
94 setBaud(0);
95 setBaud(50);
96 setBaud(75);
97 setBaud(110);
98 setBaud(134);
99 setBaud(150);
100 setBaud(200);
101 setBaud(300);
102 setBaud(600);
103 setBaud(1200);
104 setBaud(1800);
105 setBaud(2400);
106 setBaud(4800);
107 setBaud(9600);
108 setBaud(19200);
109 setBaud(38400);
110 setBaud(57600);
111 setBaud(115200);
112 setBaud(230400);
113 default:
114 throw std::runtime_error("Invalid baud rate");
115 }
116 cfsetospeed(&_termios, speed);
117 cfsetispeed(&_termios, speed);
118 }
119#undef setBaud
120
121 termios &getTTY() { return _termios; }
122
123 int getTimeout() const { return _timeout; }
124
125 void setTimeout(int timeout) { _timeout = timeout; }
126};
127} // namespace MB::Serial
Definition modbusException.hpp:23
Definition modbusRequest.hpp:23
Definition modbusResponse.hpp:25
Definition connection.hpp:25
std::vector< uint8_t > send(std::vector< uint8_t > data)
Sends data through the serial.
Definition connection.cpp:130