crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Непонимаю!, Почему не работает механизм сигналов/слотов?
posi4
  опции профиля:
сообщение 19.6.2009, 14:12
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 52
Регистрация: 24.4.2009
Пользователь №: 707

Спасибо сказали: 0 раз(а)




Репутация:   0  


Пишу в QtCreatore, вот такая вот функция main
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MinotourGUI w;
    QextSerialPort* port = new QextSerialPort("COM1");
    port->setBaudRate(BAUD115200);
    port->setFlowControl(FLOW_OFF);
    port->setDataBits(DATA_8);
    port->setParity(PAR_NONE);
    port->setStopBits(STOP_1);
    port->open(QIODevice::ReadWrite);
    if(!(port->lineStatus() & LS_DSR))
    {
        QMessageBox::information(0,"Warning","Device is not turned on");
    }
    transmitter* tm = new transmitter(port);
    tm->connect(port, SIGNAL(readyRead()), tm, SLOT(recive()));
    SerialThread * thread = new SerialThread(port);
    thread->start();
    w.show();
    return a.exec();
}


вот сам класс:

class transmitter : public QObject
{

    Q_OBJECT

    QextSerialPort * port;

public:
    transmitter(QextSerialPort * port, QObject* parent = 0);
    quint8 GetControlSum(QByteArray, int);
    void WriteCom(char*);
private slots:
    void recive();
};

void transmitter::recive()
{
    int bytesavailable = port->bytesAvailable();
    char* data = new char[bytesavailable];
    port->read(data, bytesavailable);
    QFile file("file.dat");
    file.open(QFile::WriteOnly);
    file.write(data, bytesavailable);
    file.close();
}


И теперь кто-нибудь подскажите, почему у меня не получается ничего получить в файл?
Подозреваю что сигнал/слот не работают?
Если же просто методом воспользоваться, данные читаются и записываются в файл!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 19.6.2009, 14:38
Сообщение #2


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Попробуй так.
QextSerialPort* port = new QextSerialPort("COM1", QextSerialPort::EventDriven);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
posi4
  опции профиля:
сообщение 22.6.2009, 11:11
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 52
Регистрация: 24.4.2009
Пользователь №: 707

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(igor_bogomolov @ 19.6.2009, 15:38) *
Попробуй так.
QextSerialPort* port = new QextSerialPort("COM1", QextSerialPort::EventDriven);


Да теперь работает, но почему-то файл записывается нулевого размера! =0
Прикол в том что когда идёшь дебагом всё нормально, т.е. сколько получил по порту столько и записалось и так и должно быть по моему мнению.
Но когда просто запускаешь на выполнение, файл получается!!! НО нулевой!
Это что баг Creatora или я чего-то не знаю??
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 22.6.2009, 11:49
Сообщение #4


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(posi4 @ 22.6.2009, 12:11) *
Да теперь работает, но почему-то файл записывается нулевого размера! =0
Creator здесь ни причем.
У меня у самого была подобная проблема (кстати, и задача почти такая же стояла). Но связано это было с неправильной работой с самим прибором, и настройкой порта. У меня устройство USB, правда, но работаю с ним через USB_COM, так что разницы нет.

Могу поделиться исходничками, мне не жалко. Там нет ничего секретного. :)

Вот как у меня осуществлялась инициализация порта

Раскрывающийся текст
void MainWindow::createSerialPort() {
    isFindPort = false;
    QList<QextPortInfo> ports = QextSerialEnumerator::getPorts();
    textEdit->append(tr("Поиск USB Serial Port..."));
    textEdit->append("=========================================");
    for (int i = 0; i < ports.size(); i++) {
        if(ports.at(i).friendName.contains("USB Serial Port")) {
            textEdit->append(QString("port name: %1").arg(ports.at(i).portName.left(4)));
            textEdit->append(QString("friendly name: %1").arg(ports.at(i).friendName));
            textEdit->append(QString("physical name: %1").arg(ports.at(i).physName));
            textEdit->append(QString("enumerator name: %1").arg(ports.at(i).enumName));
            textEdit->append("=========================================");
            isFindPort = true;
            portName = ports.at(i).portName.left(4);
        }
    }
    if(!isFindPort) {
        portName.clear();
        textEdit->append(tr("USB Serial Port не обнаружен."));
        textEdit->append("=========================================");
        return;
    }

    if(!isCreatePort) {
        isCreatePort = true;
        port = new QextSerialPort(portName, QextSerialPort::EventDriven);

        threadPort = new ThreadSerialPort(port);
        connect(threadPort, SIGNAL(displayMessage(const QString &)), SLOT(displayMessage(const QString &)));
        connect(threadPort, SIGNAL(cancelReadEnergo(const QByteArray &)), SLOT(saveData(const QByteArray &)));
    }

    port->setBaudRate(BAUD115200);
    port->setFlowControl(FLOW_HARDWARE);
    port->setParity(PAR_NONE);
    port->setDataBits(DATA_8);
    port->setStopBits(STOP_1);
    port->setTimeout(500);
    port->setDtr(false);
    port->setRts(false);

    port->readAll();

    textEdit->append(tr("USB Serial Port подключен."));
    textEdit->append("=========================================");
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 22.6.2009, 12:19
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Извините, что вмешиваюсь. А где вы взяли QextSerialPort? В документации по Qt 4.3.2 я его не нашел, потому работаю напрямую с Windows-средствами...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 22.6.2009, 12:27
Сообщение #6


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Цитата(AD @ 22.6.2009, 13:19) *
Извините, что вмешиваюсь. А где вы взяли QextSerialPort? В документации по Qt 4.3.2 я его не нашел, потому работаю напрямую с Windows-средствами...
QextSerialPort
Это сторонняя библиотека.


Для тех кто использюет WinAPI, для работы с портом, предлогаю ссылочку. Лучшее что я смог найти по теме
http://www.book-ua.org/FILES/electrotech/2...electr01813.pdf
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 22.6.2009, 12:55
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Скачал, скомпилировал. А есть возможность просмотра документации по QextSerialPort в Ассистенте? Если есть, как настроить?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 22.6.2009, 13:04
Сообщение #8


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


AD, ты стал обладателем 10000 сообщения в разделе Qt. ;) :D :)

Документация собирается Doxygen-ом. В нем есть возможность создовать и qch. Но сам я этого никогда не делал. Смотри оф. документацию.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
posi4
  опции профиля:
сообщение 22.6.2009, 13:21
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 52
Регистрация: 24.4.2009
Пользователь №: 707

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата
Но связано это было с неправильной работой с самим прибором, и настройкой порта.

И всё таки не понимаю как это связано, ведь в режиме дебага всё нормально!?! Настройки портов идентичные.
У меня подозрение, что то непонятное происходит в момент открытия и записи в файл.

И вот ещё что! Другая функция, которая уже пишет в порт:
не буду приводить код, суть проста - пишу в порт port->write(bytear); , где bytear - QByteArray из восьми элементов,
получаю на другом конце 20 байт! Как такое может быть? :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
igor_bogomolov
  опции профиля:
сообщение 22.6.2009, 13:31
Сообщение #10


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


Настройки не совсем одинаковые. У меня
Цитата
port->setFlowControl(FLOW_HARDWARE);
При больших скоростях, лучше пользоваться этой настройкой.

Цитата(posi4 @ 22.6.2009, 14:21) *
получаю на другом конце 20 байт! Как такое может быть?
Запросто. В буфере уже есть какой то мусор. Поэтому при создании порта я делаю
Цитата
port->readAll();
, чтобы очистить буфер. Смотри еще раз мой код.

P.S. Я для отладки делал себе перемычку.
P.P.S. Когда сомневаешmся всегда есть возможность посмотреть прием\передачу через терминал.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.3.2024, 10:26