【发布时间】:2016-07-20 11:03:50
【问题描述】:
我正在使用无线电模块 XBee pro 并记录了一些无线电数据。
我使用 FTDI 串行转 USB 转换器,因此模块出现在 /dev/ttyUSB0 下。
我已经写了这段代码:
void TsToCoord::serialConfig()
{
// Open Serial Port
cout << "Opening serial port..." << endl;
fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY);
if (fd < 0 )
{
cout << "Error " << errno << " opening /dev/ttyUSB0: " << strerror(errno) << endl;
}
else
{
//Configure Serial Port
cout << "Configuring serial port..." << endl;
struct termios tty;
memset (&tty, 0, sizeof tty);
if (tcgetattr (fd, &tty) != 0)
{
cout << "Error " << errno << " from tcgetattr: " << strerror (errno) << endl;
}
cfsetispeed(&tty, B57600);
cfsetospeed(&tty, B57600);
tty.c_cflag &= ~PARENB;
tty.c_cflag &= ~CSTOPB;
tty.c_cflag &= ~CSIZE;
tty.c_cflag |= CS8;
tty.c_cflag &= ~CRTSCTS;
tty.c_lflag = 0;
tty.c_oflag = 0;
tty.c_cc[VMIN] = 1;
tty.c_cc[VTIME] = 50;
tty.c_cflag |= CREAD | CLOCAL;
cfmakeraw(&tty);
tcflush(fd, TCIFLUSH);
if (tcsetattr(fd, TCSANOW, &tty) != 0)
{
cout << "Error " << errno << " from tcsetattr" << endl;
}
}
}
void TsToCoord::listenPort()
{
// Creation of a buffer to store data from radio module
fill_n(buff, 2048, '\0');
this-> ind = 0;
while(true)
{
char mes[1024];
fill_n(mes, 1024, '0');
//cout << "Blocking read" << endl;
int rd = read(fd, &mes, sizeof(mes));
if (rd > 0)
{
//cout << "Storing in buffer" << endl;
storeInBuff(mes, rd);
fill_n(mes, 1024, '0');
struct pollfd fds;
fds.fd = fd;
fds.events = POLLIN | POLLPRI;
int slct = 1;
/*
int slct = 1;
fd_set rdfds;
FD_ZERO(&rdfds);
FD_SET(fd, &rdfds);
struct timeval to;
to.tv_sec = 0;
to.tv_usec = 100000;
*/
//fd_set rdfdsCopy = rdfds;
//cout << "Entering second while loop" << endl;
while (slct > 0)
{
//cout << "Call to select" << endl;
//slct = select((fd+1), &rdfdsCopy, NULL, NULL, &to);
slct = poll(&fds, 1, 100);
if (slct > 0)
{
//cout << "Next call to read, would not block" << endl;
rd = read(fd, &mes, sizeof(mes));
storeInBuff(mes, rd);
//rdfdsCopy = rdfds;
}
}
findFrame(0);
ind = 0;
fill_n(buff, 2048, '\0');
}
}
}
我的问题是,当它启动时,它运行良好。但在 20 分钟后,它不再工作了。 CPU 使用率达到 100%,因此读取调用似乎不再阻塞。就像文件描述符不再链接到设备一样......
由于我完全不知道原因和错误,并且由于在崩溃之前需要随机的时间,我不能只是取消它并在我的终端中查看输出...
所以我想问一下:
- 是不是代码中没有发现大错误。
- 导致它崩溃的原因是什么?我想到了另一个尝试使用同一设备的软件,但似乎并非如此。我也不认为是波特率问题。
我添加了一个检查无线电被拔掉的情况,所以程序不能退出它自己的。我很确定这不是问题,因为模块在崩溃发生后一直处于 /dev/ttyUSB0 之下。
我使用 Debian 3.2.57-3 i686。
在我的无线电模块中使用其他软件时,我没有遇到任何问题。
我在另一台类似的计算机上使用此代码似乎没有问题...
感谢您的阅读,抱歉英语不太好。
编辑:更准确地说我想从这篇文章和这个程序中得到什么: 在某些时候,程序无法阻止读取,并且每次对读取的调用都不会阻塞并且不会读取任何内容,因此程序不会执行它创建的操作:记录来自无线电模块的数据。我只是想避免它,因为没有它它可以很好地工作,并且可能会对硬件造成伤害。
【问题讨论】:
-
@Olaf 就像我说的那样,程序在某些时候无法阻止读取,并且每个对读取的调用都不会阻塞并且不读取任何内容,因此程序不会执行它创建的操作for :记录来自无线电模块的数据。我只是想避免它,因为没有它它可以很好地工作,并且可能会对硬件造成伤害。
-
@Kyll:OP 没有表现出提供所需的东西。所以他至少可以自己找到链接。 (无论如何,链接都会与关闭消息一起显示;我根本不需要发表评论(对于这个问题,这很明显),所以请把它当作礼貌,不要告诉我我应该做什么与否!
-
@Kyll 谢谢。我剪掉了代码,所以只出现了与串行相关的东西。我一直认为其他地方可能还有其他明显的错误,所以我把所有的代码都放了。由于我没有发现有这个问题的人(一开始工作然后随机崩溃),我认为其中有一个更奇特的错误。我发帖只是为了测试不好。
-
@rmilville 感谢您的编辑和关注!我撤回了我的近距离投票。希望您能找到解决问题的方法。解决后,请务必再次编辑您的帖子,以最大限度地提高其对未来读者的可见度和实用性(甚至发布自我回答,描述您如何解决此问题)。
-
一个正常工作的数字计算机系统非常很少发生随机崩溃。
标签: c++ linux serial-port embedded