From 707b24dd07236243269cf092728f85172e94e8a4 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Sun, 8 Aug 2021 22:02:52 -0400 Subject: initial commit --- source/serial/examples/serial_example.cc | 182 +++++++++++++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 source/serial/examples/serial_example.cc (limited to 'source/serial/examples') diff --git a/source/serial/examples/serial_example.cc b/source/serial/examples/serial_example.cc new file mode 100644 index 0000000..a829635 --- /dev/null +++ b/source/serial/examples/serial_example.cc @@ -0,0 +1,182 @@ +/*** + * This example expects the serial port has a loopback on it. + * + * Alternatively, you could use an Arduino: + * + *
+ *  void setup() {
+ *    Serial.begin();
+ *  }
+ *
+ *  void loop() {
+ *    if (Serial.available()) {
+ *      Serial.write(Serial.read());
+ *    }
+ *  }
+ * 
+ */ + +#include +#include +#include + +// OS Specific sleep +#ifdef _WIN32 +#include +#else +#include +#endif + +#include "serial/serial.h" + +using std::string; +using std::exception; +using std::cout; +using std::cerr; +using std::endl; +using std::vector; + +void my_sleep(unsigned long milliseconds) { +#ifdef _WIN32 + Sleep(milliseconds); // 100 ms +#else + usleep(milliseconds*1000); // 100 ms +#endif +} + +void enumerate_ports() +{ + vector devices_found = serial::list_ports(); + + vector::iterator iter = devices_found.begin(); + + while( iter != devices_found.end() ) + { + serial::PortInfo device = *iter++; + + printf( "(%s, %s, %s)\n", device.port.c_str(), device.description.c_str(), + device.hardware_id.c_str() ); + } +} + +void print_usage() +{ + cerr << "Usage: test_serial {-e|} "; + cerr << " [test string]" << endl; +} + +int run(int argc, char **argv) +{ + if(argc < 2) { + print_usage(); + return 0; + } + + // Argument 1 is the serial port or enumerate flag + string port(argv[1]); + + if( port == "-e" ) { + enumerate_ports(); + return 0; + } + else if( argc < 3 ) { + print_usage(); + return 1; + } + + // Argument 2 is the baudrate + unsigned long baud = 0; +#if defined(WIN32) && !defined(__MINGW32__) + sscanf_s(argv[2], "%lu", &baud); +#else + sscanf(argv[2], "%lu", &baud); +#endif + + // port, baudrate, timeout in milliseconds + serial::Serial my_serial(port, baud, serial::Timeout::simpleTimeout(1000)); + + cout << "Is the serial port open?"; + if(my_serial.isOpen()) + cout << " Yes." << endl; + else + cout << " No." << endl; + + // Get the Test string + int count = 0; + string test_string; + if (argc == 4) { + test_string = argv[3]; + } else { + test_string = "Testing."; + } + + // Test the timeout, there should be 1 second between prints + cout << "Timeout == 1000ms, asking for 1 more byte than written." << endl; + while (count < 10) { + size_t bytes_wrote = my_serial.write(test_string); + + string result = my_serial.read(test_string.length()+1); + + cout << "Iteration: " << count << ", Bytes written: "; + cout << bytes_wrote << ", Bytes read: "; + cout << result.length() << ", String read: " << result << endl; + + count += 1; + } + + // Test the timeout at 250ms + my_serial.setTimeout(serial::Timeout::max(), 250, 0, 250, 0); + count = 0; + cout << "Timeout == 250ms, asking for 1 more byte than written." << endl; + while (count < 10) { + size_t bytes_wrote = my_serial.write(test_string); + + string result = my_serial.read(test_string.length()+1); + + cout << "Iteration: " << count << ", Bytes written: "; + cout << bytes_wrote << ", Bytes read: "; + cout << result.length() << ", String read: " << result << endl; + + count += 1; + } + + // Test the timeout at 250ms, but asking exactly for what was written + count = 0; + cout << "Timeout == 250ms, asking for exactly what was written." << endl; + while (count < 10) { + size_t bytes_wrote = my_serial.write(test_string); + + string result = my_serial.read(test_string.length()); + + cout << "Iteration: " << count << ", Bytes written: "; + cout << bytes_wrote << ", Bytes read: "; + cout << result.length() << ", String read: " << result << endl; + + count += 1; + } + + // Test the timeout at 250ms, but asking for 1 less than what was written + count = 0; + cout << "Timeout == 250ms, asking for 1 less than was written." << endl; + while (count < 10) { + size_t bytes_wrote = my_serial.write(test_string); + + string result = my_serial.read(test_string.length()-1); + + cout << "Iteration: " << count << ", Bytes written: "; + cout << bytes_wrote << ", Bytes read: "; + cout << result.length() << ", String read: " << result << endl; + + count += 1; + } + + return 0; +} + +int main(int argc, char **argv) { + try { + return run(argc, argv); + } catch (exception &e) { + cerr << "Unhandled Exception: " << e.what() << endl; + } +} -- cgit v1.2.3