【问题标题】:read data from serial device into array C++从串行设备读取数据到数组 C++
【发布时间】:2014-10-04 13:31:04
【问题描述】:

我有一个设备 /dev/ACMTTY0 流数据;或者更确切地说,现在是 0 - 100 的随机整数。

设备 /dev/ACMTTY0 连续流式传输。

但是,我仍然不知道如何在 C++ 中将串行数据流读入数组 (正确)现在,我正在尝试将其发送到屏幕上,以便我可以看到正在发生的事情。 当我运行我的程序时,会发生这种情况,我得到一些可能有效的数字,我得到一些 -1,然后程序在随机点退出。我打算让它在 EOF 退出,但它在此之前退出? EOF 是否适合流?

sudo ./getc /dev/ttyACM0 
53
50
10
56
-1
-1

无论如何,我不应该得到-1,所以我不知道那是什么意思。 此外,这些数字仍在流动。所以我不明白为什么程序退出。 对于更奇怪的行为,程序可能会在退出之前流式传输数百个数字,或者可能流式传输 2。

我在这里做错了吗:?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <inttypes.h>
#include <iostream>
int main (int argc, char ** argv)
{
using namespace std;

 FILE * pFile = NULL;
 int c = 0;
 pFile = fopen(argv[1], "r");
   // pFile=fopen ("fake.dat","r");
      if ( !(pFile = fopen(argv[1], "r")) ) {
        std::cout << argv[1] << " Couldn't open serial port for communication.\n";
        exit(EXIT_FAILURE);
      }

  if (pFile == NULL) perror ("Error opening file");
  else
  {
    do {
      c = getc (pFile);
      std::cout << c << "\n";
    } while (c != EOF);
    fclose (pFile);
  std::cout << c << "\n";
//sleep(2);
      }
  return 0;
}

我可以很好地读取我的假数据(文件)。

【问题讨论】:

  • 你需要从写代码开始。如果您对该代码遇到具体问题,请在此处发布。
  • 除此之外,您的协议没有充分指定。以什么格式浮动?我怀疑是 ASCII 文本表示,但这并不清楚。打开设备并尝试从中读取,即。按照@JohnZwinck 的建议编写一些代码。
  • “有争议地”还是“持续地”?

标签: c++ arrays stream serial-port


【解决方案1】:

您像读取文件一样读取设备并对其进行解析。让我们假设流去:

$1,2,3,4...$4,5,6,7

其中 $ 是您的标记字符。在看到 $ 之前,您什么都做不了,所以只需丢弃任何前导数字。然后你会反复寻找下一个逗号,找出数字并找出它们。自然地,您会将热电偶编号在 $ 处重置为零,并在每个逗号处递增。如果你幸运的话,atoi 不会抱怨逗号,所以你甚至不需要在使用它们之前将数字复制到其他任何地方,但我不确定。

【讨论】:

  • strtol 而不是 atoi... 很简单,并告诉您哪个字符标记了数字的结尾。
【解决方案2】:

在 C/C++ 中,读取 -1 的字符 一个 EOF(通常)。如果 /dev/ 设备返回 EOF,则意味着没有更多数据可供读取(设备尚未生成它)。输出末尾的两个“-1”发生在这里:

do {
  c = getc (pFile);
  std::cout << c << "\n";
} while (c != EOF);
fclose (pFile);
std::cout << c << "\n";

遇到EOF时,输出一次,然后循环中断,然后关闭文件,然后再次输出EOF,直到程序结束。这是你的两个“-1”的来源。

如果你不想输出“-1”,这里是修改这段代码sn-p的方法:

c = getc(pFile);      //read before entering the loop
while (c != EOF) {    //compare before loop, rather than after
  std::cout << c << '\n';
  c = getc(pFile);
}
fclose(pFile);

【讨论】:

    猜你喜欢
    • 2013-03-22
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多