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)的主要内容,如果未能解决你的问题,请参考以下文章

正确类型转换字节以写入 C++ 中的串行句柄

如何确定 linux 串行端口上剩余的写入/输出缓冲区空间量?

如果串行接口具有异步读取数据,则 C++ Ubuntu select()

在 Ubuntu 上使用 USB 到串行转换器进行串行通信

正确实现C#&lt;-&gt; Arduino串行通信

在 Linux 上用 C 语言读写串口