Two-way C++ communication over serial connection
arduino, c++, linux, serial-port
Solution
There are three points:
First: You don't initialize the serial port (TTY) on the Linux side. Nobody knows in what state it is.
Doing this in your program you must use `tcgetattr(3)` and `tcsetattr(3)`. You can find the required parameters by using these keywords at this site, the Arduino site or on Google. But just for quick testing I propose to issue this command before you call your own command:
stty -F /dev/tty.usbmodem641 sane raw pass8 -echo -hupcl clocal 9600
Especially the the missing `clocal` might prevent you opening the TTY.
Second: When the device is open, you should wait a little before sending anything. By default the Arduino resets when the serial line is opened or closed. You have to take this into account.
The `-hupcl` part will prevent this reset most of the time. But at least one reset is always necessary, because `-hupcl` can be set only when the TTY is already open and at that time the Arduino has received the reset signal already. So `-hupcl` will "only" prevent future resets.
Third: There is NO error handling in your code. Please add code after each IO operation on the TTY which checks for errors and - the most important part - prints helpful error messages using `perror(3)` or similar functions.
Problem
I am trying to write a really simple C++ application to communicate with an Arduino. I would like to send the Arduino a character that it sends back immediately. The Arduino code that I took from a tutorial looks like this: ``` void setup() { Serial.begin(9600); } void loop() { //Have the Arduino wait to receive input while (Serial.available()==0); //Read the input char val = Serial.read(); //Echo Serial.println(val); } ``` I can communicate with the Arduino easily using GNU screen, so I know that everything is working fine with the basic communication: $ screen /dev/tty.usbmodem641 9600 The (broken) C++ code that I have looks like this: ``` #include <fstream> #include <iostream> int main() { std::cout << "Opening fstream" << std::endl; std::fstream file("/dev/tty.usbmodem641"); std::cout << "Sending integer" << std::endl; file << 5 << std::endl; // endl does flush, which may be important std::cout << "Data Sent" << std::endl; std::cout << "Awaiting response" << std::endl; std::string response; file >> response; std::cout << "Response: " << response << std::endl; return 0; } ``` It compiles fine, but when running it, some lights flash on the Arduino and the terminal just hangs at: Opening fstream Where am I going wrong?