-
Notifications
You must be signed in to change notification settings - Fork 142
/
serial_stream_read_write.cpp
165 lines (129 loc) · 5.82 KB
/
serial_stream_read_write.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
/**
* @example serial_stream_read_write.cpp
*/
#include <libserial/SerialStream.h>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <iostream>
#include <unistd.h>
constexpr const char* const SERIAL_PORT_1 = "/dev/ttyUSB0" ;
constexpr const char* const SERIAL_PORT_2 = "/dev/ttyUSB1" ;
/**
* @brief This example demonstrates multiple methods to read and write
* serial stream data utilizing std::iostream functionality.
*/
int main()
{
using namespace LibSerial ;
// Instantiate two SerialStream objects.
SerialStream serial_stream_1 ;
SerialStream serial_stream_2 ;
try
{
// Open the Serial Ports at the desired hardware devices.
serial_stream_1.Open(SERIAL_PORT_1) ;
serial_stream_2.Open(SERIAL_PORT_2) ;
}
catch (const OpenFailed&)
{
std::cerr << "The serial ports did not open correctly." << std::endl ;
return EXIT_FAILURE ;
}
// Set the baud rates.
serial_stream_1.SetBaudRate(BaudRate::BAUD_115200) ;
serial_stream_2.SetBaudRate(BaudRate::BAUD_115200) ;
// Set the number of data bits.
serial_stream_1.SetCharacterSize(CharacterSize::CHAR_SIZE_8) ;
serial_stream_2.SetCharacterSize(CharacterSize::CHAR_SIZE_8) ;
// Turn off hardware flow control.
serial_stream_1.SetFlowControl(FlowControl::FLOW_CONTROL_NONE) ;
serial_stream_2.SetFlowControl(FlowControl::FLOW_CONTROL_NONE) ;
// Disable parity.
serial_stream_1.SetParity(Parity::PARITY_NONE) ;
serial_stream_2.SetParity(Parity::PARITY_NONE) ;
// Set the number of stop bits.
serial_stream_1.SetStopBits(StopBits::STOP_BITS_1) ;
serial_stream_2.SetStopBits(StopBits::STOP_BITS_1) ;
// Variables to store outgoing and incoming data.
std::string write_string_1 = "\"Do what you can, with what you have, where you are.\" - Theodore Roosevelt" ;
std::string write_string_2 = "\"Simplicity is prerequisite for reliability.\" - Edsger W. Dijkstra" ;
std::string read_string_1 = "" ;
std::string read_string_2 = "" ;
// Print to the terminal what will take place next.
std::cout << "\nUsing write() and read() for a specified number of "
<< "bytes of data:" << std::endl ;
// Write a specified number of bytes of data.
serial_stream_1.write(write_string_1.c_str(), write_string_1.size()) ;
serial_stream_2.write(write_string_2.c_str(), write_string_2.size()) ;
// Wait until the data has actually been transmitted.
serial_stream_1.DrainWriteBuffer() ;
serial_stream_2.DrainWriteBuffer() ;
// Char arrays to store incoming data.
char* read_array_1 = new char[write_string_2.size()] ;
char* read_array_2 = new char[write_string_1.size()] ;
// Use inheritted std::istream read() method to read the data.
serial_stream_1.read(read_array_1, write_string_2.size()) ;
serial_stream_2.read(read_array_2, write_string_1.size()) ;
// Print to the terminal what was sent and what was received.
std::cout << "\tSerial Port 1 sent:\t" << write_string_1 << std::endl
<< "\tSerial Port 2 received:\t" << read_array_2 << std::endl
<< std::endl ;
std::cout << "\tSerial Port 2 sent:\t" << write_string_2 << std::endl
<< "\tSerial Port 1 received:\t" << read_array_1 << std::endl
<< std::endl ;
// Print to the terminal what will take place next.
std::cout << "Using the \"<<\" operator and getline() for a line of data:"
<< std::endl ;
// Write a line at each serial port.
serial_stream_1 << write_string_1 << std::endl ;
serial_stream_2 << write_string_2 << std::endl ;
// Wait until the data has actually been transmitted.
serial_stream_1.DrainWriteBuffer() ;
serial_stream_2.DrainWriteBuffer() ;
// Read a line at each serial port.
std::getline(serial_stream_1, read_string_1) ;
std::getline(serial_stream_2, read_string_2) ;
// Print to the terminal what was sent and what was received.
std::cout << "\tSerial Port 1 sent:\t" << write_string_1 << std::endl
<< "\tSerial Port 2 received:\t" << read_string_2 << std::endl
<< std::endl ;
std::cout << "\tSerial Port 2 sent:\t" << write_string_2 << std::endl
<< "\tSerial Port 1 received:\t" << read_string_1 << std::endl
<< std::endl ;
// Variable to hold user input.
std::string user_input ;
user_input.clear() ;
// Prompt the user for input.
std::cout << "Type something you would like to send over serial,"
<< " (enter \"Q\" or \"q\" to quit): " << std::flush ;
while(true)
{
// Get input from the user.
std::getline(std::cin, user_input) ;
if (user_input == "q" ||
user_input == "Q" ||
user_input == "")
{
break ;
}
// Print to the terminal what will take place next.
std::cout << "Using the \"<<\" and \">>\" operators to send "
<< "and receive your data: " << std::endl ;
// Write the user input to the serial port.
serial_stream_1 << user_input << std::endl ;
// Read the data transmitted from the corresponding serial port.
// Note: The ">>" operator behavior is tricky if whitespace or
// nothing is entered by the user!
serial_stream_2 >> read_string_2 ;
// Print to the terminal what was sent and what was received.
std::cout << "\tSerial Port 1 sent:\t" << user_input << std::endl
<< "\tSerial Port 2 received:\t" << read_string_2 << std::endl ;
}
// Close the serial ports and end the program.
serial_stream_1.Close() ;
serial_stream_2.Close() ;
// Successful program completion.
std::cout << "The example program successfully completed!" << std::endl ;
return EXIT_SUCCESS ;
}