Всем здравствуйте.
С Qt, C++ и ОПП знаком в принципе всего несколько недель, поэтому если не сложно объясните пожалуйста (или дайте ссылки) некоторые странности в работе моего кода.
Кратко опишу, что к чему. Есть USB устройство, которое на самом деле является «USB to Virtual COM-port» преобразователем. Соответственно под Linux'oм (Ubuntu 9.10, если это важно) есть корректно установленные драйвера и устройство обнаруживает себя как /dev/ttyUSB0. Дальше с помощью вот этого кода мне удаётся подключиться к устройству:
void main_window::on_pBushbuttonConnect_toggled(bool checked)
{
struct termios comConf;
if(checked)
{
//serial port there
port.setFileName("/dev/ttyUSB0");
if(!port.open(QIODevice::ReadWrite))
{
//error
}
else
{
tcgetattr(port.handle(), &comConf);
cfmakeraw(&comConf);
//params
comConf.c_cflag |= CLOCAL;
//baud rate - 38400
cfsetispeed(&comConf, B38400);
cfsetospeed(&comConf, B38400);
//data bits - 8
comConf.c_cflag &= (~CSIZE);
comConf.c_cflag |= CS8;
//parity - none
comConf.c_cflag &= (~PARENB);
//stop bits - 1
comConf.c_cflag &= (~CSTOPB);
//flow control - off
comConf.c_cflag&=(~CRTSCTS);
comConf.c_iflag&=(~(IXON|IXOFF|IXANY));
if(tcsetattr(port.handle(), TCSANOW, &comConf) == -1)
{
//error
}
}
}
else
{
port.close();
}
}
а вот с помощью этого куска кода, отправляю байт в устройство:
bool main_window::sendValue(int value)
{
if(port.isOpen())
{
if(port.isWritable())
{
port.flush(); // <------ Вот этот момент
port.putChar(value);
return true;
}
}
return false;
}
Меня очень смущает наличее обозначенного стрелкой вызова. Дело в том, что без него байты не посылаются. И проблема заключается точно не в устройстве, так как сигнальные светодиоды не начинают моргать, а значит передача не началась. Собственно это и есть первый вопрос, почему для отправки байта надо очищать буфер? (кстати, принять байт вообще не получается)
Второй вопрос заключается в пропаже некоторых байтов, не все байты доходят до устройства, то есть если я подряд вызову пять или шесть функций «sendValue(120)», то из пяти байт в лучшем случае доходят три. И эта проблема опять же на стороне ПК или софта. То есть второй вопрос, как исключить пропажу байтов? (методы типа waitReadyWritten(-1) не работают... либо я их неправильно вызывал)
PS Аргументированные оскорбления и посылы курить маны принимаются :) QextSerialPort не подходит, так как GPL. Заранее спасибо.