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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Трудность с библиотекой QSerialDevice  (Прочитано 19068 раз)
Piknik
Гость
« Ответ #15 : Декабрь 06, 2011, 13:30 »

Ваши б слова, да пораньше)) Ну в итоге я так и сделал
Записан
Piknik
Гость
« Ответ #16 : Декабрь 06, 2011, 14:30 »

А по какой причине может резаться старший бит в байте? вместо FF (255) приходит 127. В настройках 8 бит данных стоит, как должно быть
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #17 : Декабрь 06, 2011, 14:40 »

Проверь Free-Serial Port Monitor - ом. Он покажет что конкретно отправляется и принимается.
И если касячит библиотека - будем исправлять.
Записан

ArchLinux x86_64 / Win10 64 bit
Piknik
Гость
« Ответ #18 : Декабрь 06, 2011, 14:49 »

проверяю терминалом.(Terminal). На него приходит все как надо. Сейчас попробую вашей прогой. Но со старой библиотекой такая же песня, сейчас посмотрел... Какие еще есть варианты?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #19 : Декабрь 06, 2011, 14:53 »

Паритет, стоп биты, скорость, контроль потока.

Больше никаких вариантов нет.  Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Piknik
Гость
« Ответ #20 : Декабрь 06, 2011, 16:06 »

Все, нашлось...нормально все принималось, выводил неправильно походу)
Записан
Piknik
Гость
« Ответ #21 : Декабрь 09, 2011, 08:07 »

Еще вопрос: есть ли возможность вызывать слот при поступлении одного байта в КОМ? Чтобы отслеживать идентификатор начала пакета? На данный момент при вызове слота доступен не один байт, а несколько...Среди них искать идентификатор не очень удобно.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #22 : Декабрь 09, 2011, 09:42 »

Оно и так срабатывает при появлении первого байта.
Просто пока идет обработка - набегают еще байты.
Для того чтобы узнать что за значения буфере, не читая его  - используй метод peek().
(это что-то типа read() - только при peek(), при чтении, данные из буфера не будут удаляться.)

Но это в случае если не использовал Unbuffered и, наверное только для версии 2.0,
хотя насчет версии могу ошибаться.
« Последнее редактирование: Декабрь 09, 2011, 09:45 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Piknik
Гость
« Ответ #23 : Декабрь 09, 2011, 14:03 »

то есть чтобы искать идентифик начала пакета мне делать:
Код:
ba = peak(myPortCom->bytesAvailable());


и потом в буфере ba искать этот индентификатор? по одному байту никак не анализируется?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #24 : Декабрь 09, 2011, 14:39 »

Цитировать
и потом в буфере ba искать этот индентификатор? по одному байту никак не анализируется?
зачем ba?
вот по одному:
Код
C++ (Qt)
char c;
int ret = port->peek(&c, 1);
 

Хотя, можно было бы для перемещения по буферу использовать seek(), но он не работает для sequential устройств.

Поэтому, ИМХО, только peek() с целым массивом или же
делай
Код
C++ (Qt)
char c;
int ret = port->read(&c, 1);
 
или
Код
C++ (Qt)
char c;
bool ret= port->getChar(&c);
 
по одному байту пока не найдешь начало своей метки (или что-там у тебя).
« Последнее редактирование: Декабрь 09, 2011, 14:46 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Piknik
Гость
« Ответ #25 : Декабрь 09, 2011, 14:49 »

Благодарю!
Записан
Piknik
Гость
« Ответ #26 : Март 27, 2012, 12:46 »

Добрый день! Возникла такая проблема: прога должна по нажатию кнопки отправлять номер устройства через ком-порт. Устройство по получении этой посылки отправляет ее обратно на ПК, вот в момент прихода этой посылки на ПК прога грузит проц почти на 100%. Если из функции убрать readAll, то все Ок, а если производить чтение пришедших байт, то такая байда...Закрытие проги не удаляет ее из процессов, приходится вручную удалять. Что может быть не так?

Код:
MyMainWindow::MyMainWindow(QWidget *parent) :
    QMainWindow(parent),       
    ui(new Ui::MyMainWindow)
{
        ui->setupUi(this);

        /* Serial Port */
        myPortCom = new SerialPort(this);             

        connect(ui->openPortButton, SIGNAL(clicked()), this,  SLOT(openPort()));
}

void MyMainWindow::openPort()
{
    ....выбор порта "comPort"....
   
    myPortCom->setPort(comPort);                   

    QIODevice::OpenMode mode = QIODevice::ReadWrite;// ReadOnly;

    if (!myPortCom->open(mode))                     // Открываем порт, если не получается открыть КОМ порт:
    {
        QMessageBox::critical(this, QString::fromLocal8Bit("Com port"),
        QString::fromLocal8Bit("Не могу открыть порт ")+ comPort, QMessageBox::Ok);
        ui->statusBar->showMessage(QString::fromLocal8Bit("Error opening COM port!"));
    }
    else                                                 // КОМ порт открыт:
    {
        myPortCom->setRate(9600);                       
        myPortCom->setDataBits(SerialPort::Data8);
        myPortCom->setParity(SerialPort::NoParity);
        myPortCom->setStopBits(SerialPort::OneStop);
        myPortCom->setFlowControl(SerialPort::NoFlowControl);       

        connect(ui->SendButton, SIGNAL(clicked()),   this, SLOT(dataSendToAM()));  // Кнопка "Отправить данные"
        connect(myPortCom,       SIGNAL(readyRead()), this, SLOT(serialDataReady()));
   }
}

void MyMainWindow::serialDataReady()
{
    char  read_c;

    uint8_t bytes_avail = myPortCom->bytesAvailable();      // смотрит сколько байт в буфере

    qDebug() << "Bytes_Available:" << bytes_avail;
    myPortCom->readAll(); //&read_c,1);
  .... остальное убрал для отладки....

}


void MyMainWindow::dataSendToAM()
{
    data_send = ui->Device_num_lineEdit->text();
    format = QString("$A,%1\r\n").arg(data_send,4,'0');
                                 // Шлем посылку с номером устройства 
    sendLetter(&format);
}

void MyMainWindow::sendLetter(QString *app)
{
    letter.clear();
    letter.append(*app);
qDebug() << "Letter:" << letter;
    myPortCom->write(letter); 
}
« Последнее редактирование: Март 27, 2012, 15:22 от Piknik » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #27 : Март 27, 2012, 14:20 »

Не знаю. Проблем быть не должно.

Попробуй тоже самое сделать (послать/принять) с
использованием /test/guiapp (или как там его).

Будет ли там такое же поведение?
И какая ОС?
Записан

ArchLinux x86_64 / Win10 64 bit
Piknik
Гость
« Ответ #28 : Март 27, 2012, 16:08 »

Не знаю. Проблем быть не должно.

Попробуй тоже самое сделать (послать/принять) с
использованием /test/guiapp (или как там его).

Будет ли там такое же поведение?
И какая ОС?

Я уже запутался кстати, библиотека QSerialPort новее SerialDevice-а? ОС Win XP. Не могу найти пока этот пример. Что странно: прийти должно 10 байт, если функция readAll() присутствует, то приходят по частям, но не все 10 байт. А если функцию закомментить, то byteAvaliable показывает, что  все 10 байт пришли.(так же по частям)
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #29 : Март 27, 2012, 17:26 »

Цитировать
Я уже запутался кстати, библиотека QSerialPort новее SerialDevice-а?
Почитай тут http://qt-project.org/wiki/QtSerialPort_Russian

SerialDevice (ветка 2.0) самая новая и последняя версия (вообще), далее вместо неё будет QtSerialPort.

Цитировать
Не могу найти пока этот пример
http://gitorious.org/qserialdevice/qserialdevice/trees/2.0/tests/guiapp

Цитировать
Что странно: прийти должно 10 байт, если функция readAll() присутствует, то приходят по частям, но не все 10 байт. А если функцию закомментить, то byteAvaliable показывает, что  все 10 байт пришли.(так же по частям)
Это не странно. Так и должно работать (по частям) в не зависимости от того присутствует ли какие нить функции или нет. Улыбающийся
Вот тут пример как целиком прочитать https://qt-project.org/forums/viewreply/71427/



Записан

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


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