Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/19: Рейтинг темы: голосов - 19, средняя оценка - 4.84
332 / 85 / 16
Регистрация: 10.01.2011
Сообщений: 516
Записей в блоге: 1
1

SerialPort

10.02.2014, 19:56. Показов 3778. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день! Никак не выходит реализовать протокол 1Wire.
Вроде бы на шину удается кинуть данные, а вот корректно прочитать - нет.
После посылки 0x33 ожидается ~8 байт.
Пытался по всякому их прочитать, но читает те же 0x33.. и то не всегда.
На WinApi все это дело отрабатывает, а на QSerialPort нет.
Подскажите как корректно отправлять и читать байты с шины?
Смотрел примеры - делал аналогично - не выходит. Не пойму в чем дело!
Заранее всем спасибо!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.02.2014, 19:56
Ответы с готовыми решениями:

SerialPort
Добрый день форумчане! Подскажите пожалуйста, используя библиотеку qserialport и команду...

Android + serialport
Доброго времени суток. Появилась необходимость связать контроллер с Android устройством(root есть)....

SerialPort не собирается в статическую сборку
Приветствую всех. https://www.cyberforum.ru/qt/thread1063918.html Использовал для статической...

SerialPort принимать побайтно все что приходит
Приветствую всех. Реализую прием данных с СОМ порта побайтно и столкнулся с проблемой, что сигнал...

7
41 / 39 / 7
Регистрация: 21.05.2012
Сообщений: 198
10.02.2014, 21:12 2
Код на WinAPI и QSerialPort в студию.
0
332 / 85 / 16
Регистрация: 10.01.2011
Сообщений: 516
Записей в блоге: 1
11.02.2014, 07:43  [ТС] 3
Serial Port
создание
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
    SerialPort = new QSerialPort();
    QObject::connect( SerialPort, SIGNAL( readyRead() ), this, SLOT(rr() ) );
    this->SerialPort->close();
    this->SerialPort->setPortName( "COM4" );
    this->SerialPort->open( QIODevice::ReadWrite );
    this->SerialPort->setBaudRate( QSerialPort::Baud9600 );
    this->SerialPort->setDataBits( QSerialPort::Data8 );
    this->SerialPort->setParity( QSerialPort::NoParity );
    this->SerialPort->setStopBits( QSerialPort::OneStop );
    this->SerialPort->setFlowControl( QSerialPort::NoFlowControl );
чтение с порта
C++ (Qt)
1
2
3
4
5
6
void tcom::rr()
{
    this->SerialPort->waitForReadyRead(5000);
    QByteArray data = SerialPort->readAll();
    qDebug() << ":" << data;
}
отправка
C++ (Qt)
1
2
3
4
this->SerialPort->setBaudRate( QSerialPort::Baud115200 );    
baWrite.append( 0x33 );
    this->SerialPort->clear();
    this->SerialPort->write(baWrite);
При этот в редирид выводит 0x33

WinApi

Реализовано на делфи. Настройки порта аналогичны.
отправка

Delphi
1
2
   Tmp_c := $33;
   WriteFile(HCom,Tmp_c,1,HRes,nil);
чтение одного байта
Delphi
1
2
3
4
5
6
7
8
9
10
11
 Tmp_c := $FF;
 for I := 0 to 7 do WriteFile(HCom,Tmp_c,1,HRes,nil);
 
 Result := 0;
 for I := 0 to 7 do
  begin
    repeat
     ReadFile(HCom,Tmp_c,1,HRes,nil);
    until (HRes > 0);
   if Tmp_c = $FF then Result := Result or (1 shl I);
  end;
Ну как то так
0
98 / 40 / 1
Регистрация: 08.08.2012
Сообщений: 86
11.02.2014, 13:22 4
Пальцем в небо:что за данные должны прийти? Вдруг там непечатные символы, и их просто не видно?
C++ (Qt)
1
qDebug() << data.toHex()
Выдаст тот же результат?

+Разные БОД при чтении/записи
1
332 / 85 / 16
Регистрация: 10.01.2011
Сообщений: 516
Записей в блоге: 1
11.02.2014, 17:20  [ТС] 5
БОД разные, да, это правильно.
Попробую позже хекс проверить.
Данные должны прийти 100% - может и не печатываемые, но я делал упор на то что qDebug любые символы ( или пробелы ) выведет как и консоль ( она, в моем случае, выводит всякую ерунду при попытке вывести непечатываемые символы )

Добавлено через 53 секунды
кстати, проверял data.size() и он равен 1 ( мой же байт )
0
98 / 40 / 1
Регистрация: 08.08.2012
Сообщений: 86
12.02.2014, 10:29 6
Как по мне, так все должно работать, я никакой проблемы не вижу, перейдем к шаманству?

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// во-первых, проверить, отрабатывает ли этот кусок
    this->SerialPort->setBaudRate( QSerialPort::Baud9600 );
    this->SerialPort->setDataBits( QSerialPort::Data8 );
    this->SerialPort->setParity( QSerialPort::NoParity );
    this->SerialPort->setStopBits( QSerialPort::OneStop );
    this->SerialPort->setFlowControl( QSerialPort::NoFlowControl );
 
    bool ok = this->SerialPort->setBaudRate( QSerialPort::Baud115200 );    
    baWrite.append( 0x33 );
//    this->SerialPort->clear();
    quint64 written = this->SerialPort->write(baWrite);
    ok &= this->SerialPort->setBaudRate( QSerialPort::Baud9600);
    if( !ok || written != baWrite.size())
           qDebug() << "Error while writing";
 
void tcom::rr()
{
    while(this->SerialPort->bytesAvailable()) {
        QByteArray data = SerialPort->readAll();
        qDebug() << ":" << data;
    }
}
Никогда не видел, чтобы запись и чтение шли на разных скоростях, я ставлю на это
1
332 / 85 / 16
Регистрация: 10.01.2011
Сообщений: 516
Записей в блоге: 1
12.02.2014, 11:42  [ТС] 7
Решил перейти и пробывать на LinuxApi писать. Чтото проблемно выходит с Qt + еще и либы QSerialPort нету под линукс и ставить лень =)
На счет скоростей - протокол такой.... Перед командой на ком порт надо дать 0xf0 со скоростью 9600, а потом уже и чтение и запись на 115200.
З.Ы. без this->SerialPort->clear(); даже не компилиться почему то =)))
Спасибо за помощь
0
41 / 39 / 7
Регистрация: 21.05.2012
Сообщений: 198
12.02.2014, 14:53 8
Перед командой на ком порт надо дать 0xf0 со скоростью 9600, а потом уже и чтение и запись на 115200.
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Foo::Foo()
{
    initPort();
 
    connect(p, SIGNAL(bytesWritten(qint64)), this, SLOT(handleBytesWritten(qint64)));
}
 
Foo::initPort()
{
    p.open() && p.setBaudRate(9600) && ...;
}
 
Foo::writeCommandToChangeMode()
{
    p.write(0xf0);
}
 
Foo::handleBytesWritten(qint64 bytes)
{
    if (p.baudRate() == 9600 && bytes == 1)
        p.setBaudRate(115200);
}
0
12.02.2014, 14:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.02.2014, 14:53
Помогаю со студенческими работами здесь

QML обработка события из SerialPort
Добрый день, подскажите как реализовать обработку события в QML (или в крайнем случае не в QML) для...

Serialport.write и serialport.basestream.write - в чем разница
в чем разница между следующими способами отправки данных на ком-порт?:...

Serialport
Есть программа но на этапе компиляции выдает ошибку. для компиляции использую ActiveState Perl Dev...

SerialPort в C#
Ребята помогите с несколькими примерами обработки входящих данных на COM port. просмотрел кучу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru