Я использую радиомодуль 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 минут он больше не выполняет свою работу. Использование ЦП переходит на 100%, так что вызов чтения больше не блокируется. Это похоже на дескриптор файла, который больше не связан с устройством ...
Поскольку я абсолютно не знаю причину и ошибку, так как она принимает случайное количество времени перед сбоем, я не могу просто отключить -daemonize его и наблюдать за выход в моем терминале ...
Так я хочу спросить:
- есть большая ошибка, я не нашел в коде.
- В чем может быть причина, по которой он падает? Я подумал о другом программном обеспечении, которое пытается использовать одно и то же устройство, но, похоже, это не так. Я не думаю, что это проблема скорости в бодах.
Я добавил чек для случая, когда радио отключено, поэтому программа не может выйти из своей собственной. Я уверен, что это не проблема, так как модуль остался под /dev/ttyUSB0
после сбоя.
Я использую Debian 3.2.57-3 i686.
У меня нет проблем с другим программным обеспечением при их использовании с помощью моего радиомодуля.
Я, кажется, не имеют проблем с использованием этого кода на другом аналогичном компьютере ...
Спасибо за чтение и извините за не очень хороший английский.
EDIT: точнее, что я хочу от этого сообщения и из этой программы: В какой-то момент программа не может блокировать чтение и все вызовы, которые нужно читать, не блокировать и ничего не читать программа не выполняет то, для чего она была создана: данные журнала поступают из радиомодуля. Я просто хочу избежать этого, так как без этого он отлично работает и может нанести вред аппаратным средствам.
@Olaf Как-то я сказал, что в какой-то момент программа не может блокироваться при чтении, и все вызовы, которые нужно читать, не блокируют и ничего не читают, поэтому программа не делает то, для чего она была создана: данные журнала поступают от радиомодуля. Я просто хочу избежать этого, так как без этого он отлично работает и может нанести вред аппаратным средствам. – rmilville
@ Kyll: OP не показал никаких усилий, обеспечив требуемые вещи. Поэтому он, по крайней мере, может найти ссылки сам. (И ссылки будут показаны в любом случае с закрытым сообщением, я не обязан оставлять комментарий вообще (и для этого вопроса это очевидно), поэтому возьми его как любезность и не говори мне, что я должен делать или нет! – Olaf
@ Kyll thanks. Я вырезал код, так что появлялись только связанные с серией вещи. Я всегда думаю, что, возможно, в другом месте есть какие-то другие очевидные ошибки, поэтому я поместил весь код. Поскольку я не нашел людей, у которых была эта проблема (работает сначала, а затем случайным образом разбился), я думал, что в нем была более причудливая ошибка. Мне плохо для публикации только для теста. – rmilville