从串行设备读取数据到数组C ++

时间:2014-10-04 13:31:04

标签: c++ arrays stream serial-port

我有一个设备,/ 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;
}

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

2 个答案:

答案 0 :(得分:1)

您就像文件一样阅读设备并进行解析。我们假设流程为:

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

其中$是你的哨兵角色。除非您看到$所以只丢弃任何前导数字,否则您无法执行任何操作。然后你迭代地寻找下一个逗号,掏出数字并将它们甩掉。当然,您可以在$处将热电偶数重置为零,并在每个逗号处将其递增。如果你很幸运atoi不会抱怨逗号,所以你甚至不需要将数字复制到任何其他地方,然后才能使用它们,但我不确定。

答案 1 :(得分:0)

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

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

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

如果您不想输出“-1”,以下是修改此代码段的方法:

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);