Russian Qt Forum

Qt => Общие вопросы => Тема начата: smartchecker от Май 21, 2014, 13:14



Название: Реализация протокола 1-Wire на QSerialPort. Что-то туплю.
Отправлено: smartchecker от Май 21, 2014, 13:14
Для академической задачки нужно реализовать протокол 1-Wire через UART.
Смысл в том, что команды посылаются на одной скорости, а данные принимаются на другой.

Типа такого.
Код:
bool QOneWire::resetBus() {
    QByteArray data;

    serial->setBaudRate(QSerialPort::Baud9600);
    serial->setDataBits(QSerialPort::Data8);
    serial->setParity(QSerialPort::NoParity);
    serial->setStopBits(QSerialPort::OneStop);
    serial->setFlowControl(QSerialPort::NoFlowControl);

    data.append(0xF0);
    qDebug() << "send reset:" << data.toHex();
    serial->write(data);

    serial->waitForBytesWritten(-1);

    serial->waitForReadyRead(480);

    data = serial->read(1);

    qDebug() << "recv presence:" << data.toHex();

    if (data.contains(0xF0)) {
        return false;
    }

    return true;
}
А после нужно переключать скорость
Код:
    serial->setBaudRate(QSerialPort::Baud115200);
посылать команды и принимать данные.
Если делать так
Код:
    connect(serial, SIGNAL(readyRead()), this, SLOT(onReadyRead()));
То как объяснить слоту onReadyRead() что только что была послана команда и надо немного подождать, а потом принимать данные? И как ему вообще объяснять что сейчас подаются команды или данные?


Название: Re: Реализация протокола 1-Wire на QSerialPort. Что-то туплю.
Отправлено: kuzulis от Май 21, 2014, 21:18
Эмм.. делаешь state machine с двумя состояниями: WriteRequest и ReadResponse..

где в WriteRequest делаешь передачу/прием на 9600. после успешного окончания транзакции (когда совпали переданные и принятые данные), переходишь в состояние ReadResponse. в ReadResponse переконфигурируешь на 115200 и обрабатываешь readyRead().

т.е. здесь ты знаешь какое у тебя текущее состояние, и, следовательно в обработчике readyRead() ты всегда знаешь что нужно делать с принимаемыми данными.

эти состояния можно не вводить вообще, т.к. зная текущую скорость ты всегда знаешь что делать с принятыми данными.. если скорость 9600 - то это просто эхо от запроса, если 115200 - то это ответ от устройства..

как-то так..


Название: Re: Реализация протокола 1-Wire на QSerialPort. Что-то туплю.
Отправлено: smartchecker от Май 22, 2014, 11:21
Судя по qtcentre ты уже по этим граблям ходил.
Есть ли у тебя пример кода?
А то я что-то застрял.


Название: Re: Реализация протокола 1-Wire на QSerialPort. Что-то туплю.
Отправлено: kuzulis от Май 22, 2014, 13:14
Цитировать
Судя по qtcentre ты уже по этим граблям ходил.

По 1-Wire не ходил.

Цитировать
Есть ли у тебя пример кода?

Неа.


Название: Re: Реализация протокола 1-Wire на QSerialPort. Что-то туплю.
Отправлено: smartchecker от Май 22, 2014, 13:21
Тогда объясни подробнее что ты имел ввиду под словами state machine?
Это http://qt-project.org/doc/qt-4.8/statemachine-api.html (http://qt-project.org/doc/qt-4.8/statemachine-api.html) или нечто абстрактное?


Название: Re: Реализация протокола 1-Wire на QSerialPort. Что-то туплю.
Отправлено: kuzulis от Май 22, 2014, 16:38
Абстрактное.  (http://ru.wikipedia.org/wiki/%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)

Хотя, возможно, можно и Qt State Machine Framework прикрутить если очень нужно.