双向C ++在串行连接进行通信 [英] Two-way C++ communication over serial connection
问题描述
我想写一个非常简单的C ++应用程序有一个Arduino沟通。我想发送的Arduino的,它立刻发回一个字符。 Arduino的code,我从一个教程了是这样的:
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);
}
我可以用轻松的Arduino使用GNU屏幕沟通,所以我知道一切正常的基本通信:
I can communicate with the Arduino easily using GNU screen, so I know that everything is working fine with the basic communication:
$屏幕/dev/tty.usbmodem641 9600
$ screen /dev/tty.usbmodem641 9600
在(碎)C ++ code,我有如下所示:
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;
}
它编译罚款,但在运行时,有些灯闪Arduino上和终端只是挂在:
It compiles fine, but when running it, some lights flash on the Arduino and the terminal just hangs at:
打开fstream的
我在哪里去了?
推荐答案
有三点:
第一:您不会初始化在Linux中的串行端口(TTY)。没有人知道它是什么状态。
First: You don't initialize the serial port (TTY) on the Linux side. Nobody knows in what state it is.
在你的程序这样做,你必须使用 tcgetattr(3)
和 tcsetattr(3)
。您可以通过使用这些关键字在这个网站,Arduino的网站或谷歌上找到所需要的参数。但是的只是为了快速测试的我建议你打电话给自己的命令之前,发出以下命令:
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
特别是缺少 CLOCAL
可能prevent您打开TTY。
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.
的 -hupcl
部分将prevent这个重置的大部分时间。但至少有一个复位总是必要的,因为 -hupcl
只能在TTY已打开设定和此时的Arduino的已接收已经复位信号。因此, -hupcl
将只有prevent未来复位。
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.
第三:有 NO 的错误在code处理。请加code上检测错误和TTY每个IO操作之后 - 最重要的部分 - 利用输出有用的错误信息 PERROR(3)
或类似的功能。
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.
这篇关于双向C ++在串行连接进行通信的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!