C ++ Linux(Ubuntu)正确写入串行(对于Arduino)
Posted
技术标签:
【中文标题】C ++ Linux(Ubuntu)正确写入串行(对于Arduino)【英文标题】:C++ Linux (Ubuntu) Writing to Serial Properly (For Arduino) 【发布时间】:2013-11-01 07:53:06 【问题描述】:我想知道是否有一种与串行设备进行有效通信的标准方法。我应该使用标准库吗?如果有,是哪一个?
现在我正在摆弄根据数字输入让 LED 以给定的量点亮。 (下面的Arduino代码)。只是练习一些东西。
看看我过于简单和低效的测试:
#include <iostream>
#include <stdio.h>
using namespace std;
int
main()
FILE *file;
//Opening device file
int getnum;
while (true)
file = fopen("/dev/ttyACM5", "w");
cout << ">>" << endl;
cin >> getnum;
fprintf(file, "%d", getnum); //Writing to the file
fclose(file);
while 循环很可爱,但如果允许在不等待用户的情况下运行,则效率很低。我怀疑多余的fopen
fclose
使用很愚蠢。
微控制器将感知设备的状态并向计算机发送信号。计算机将对所有这些值进行“处理”,并发送回消息以改变 arduino 的行为。除了需要人工键盘输入之外,基本上繁重的思考都被委托给了计算机。
当然这都是为了好玩,但正如你所见,我需要“学习”C++ 中串行交互的规则! 非常感谢任何帮助或指导。
arduino 代码:
char incomingByte = 0; // for incoming serial data
int led = 11;
int bright;
void
setup()
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
void
loop()
// send data only when you receive data:
if (Serial.available() > 0)
// read the incoming byte:
incomingByte = Serial.read();
switch (incomingByte)
case '1':
bright = 10;
break;
case '2':
bright = 50;
break;
case '3':
bright = 255;
break;
default:
bright = 0;
break;
analogWrite(led, bright);
Serial.println(incomingByte);
【问题讨论】:
如果我的问题有任何不足,请告诉我。 这个问题的支持率低让我感到困惑。我希望我能给你不止一个,我和你的情况完全一样。 看到ŧhis answer 来回答一个非常相似的问题 【参考方案1】:我想知道为什么这么长时间没有人回答这个问题。你为什么说这是一种低效的方法?如果您指的是,它不是在文件系统中创建物理文件。这实际上是正确的方法,只是不要在循环内打开和关闭文件描述符。如果您希望 Serial.read 读取单个值,请发送 '\n', fprint (file, "%d\n", value)
。
【讨论】:
非常感谢。我想知道它是否重复执行写操作。以上是关于C ++ Linux(Ubuntu)正确写入串行(对于Arduino)的主要内容,如果未能解决你的问题,请参考以下文章
如何确定 linux 串行端口上剩余的写入/输出缓冲区空间量?