Russian Qt Forum
Ноябрь 24, 2024, 21:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Реализация протокола 1-Wire на QSerialPort. Что-то туплю.  (Прочитано 3704 раз)
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() что только что была послана команда и надо немного подождать, а потом принимать данные? И как ему вообще объяснять что сейчас подаются команды или данные?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Май 21, 2014, 21:18 »

Эмм.. делаешь state machine с двумя состояниями: WriteRequest и ReadResponse..

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

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

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

как-то так..
Записан

ArchLinux x86_64 / Win10 64 bit
smartchecker
Гость
« Ответ #2 : Май 22, 2014, 11:21 »

Судя по qtcentre ты уже по этим граблям ходил.
Есть ли у тебя пример кода?
А то я что-то застрял.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Май 22, 2014, 13:14 »

Цитировать
Судя по qtcentre ты уже по этим граблям ходил.

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

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

Неа.
Записан

ArchLinux x86_64 / Win10 64 bit
smartchecker
Гость
« Ответ #4 : Май 22, 2014, 13:21 »

Тогда объясни подробнее что ты имел ввиду под словами state machine?
Это http://qt-project.org/doc/qt-4.8/statemachine-api.html или нечто абстрактное?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #5 : Май 22, 2014, 16:38 »

Абстрактное.

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

ArchLinux x86_64 / Win10 64 bit
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.048 секунд. Запросов: 23.