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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [4.x.x] QextSerialPort, проблемы с чтением  (Прочитано 13718 раз)
vregess
Гость
« : Январь 07, 2008, 14:46 »

Есть устройство, работа с которым идет по RS232 (COM-порт).
Раньше работал с ним при помощи своей библиотеки.
Вот реши попробовать подцепить QextSerialPort (версия 1.1).

Такой код:
Код:
  char data[4]={12,13,14,15};
  char a_data[60];
  ABaseModbus bus;
  bus.setPort(new QextSerialPort("COM1"));
  bus.port()->setBaudRate(BAUD9600);
  bus.port()->setDataBits(DATA_8);
  bus.port()->setFlowControl(FLOW_OFF);
  bus.port()->setParity(PAR_NONE);
  bus.port()->setStopBits(STOP_1);
  bus.port()->setTimeout(1,0);
  bus.port()->open(QIODevice::ReadWrite);
 
  if(!bus.port()->isOpen()){
    printf("Error open port.\n");
    qDebug()<<bus.port()->errorString();
  }
  char a_frame[]={0x01, 0x11, 0x0c, 0x55, 0x2c};
  qDebug()<<bus.port()->write(a_frame,5);                  // выводит 5
  qDebug()<<"Data "<<bus.port()->readData(a_data,2); // выводит 0

Запись происходит.
А вот ответ не считывается.

Устройство точно получает и возвращает ответ.
Где я ошибся?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Январь 07, 2008, 15:00 »

Возможно данные не успели ещё прийти. Как правило это частный случай, когда данные сразу же готовы для считывания. Улыбающийся Заюзай цикл с использованием метода bytesAvailable (для определения количества байт готовых для чтения) чтобы вычитать данные из порта.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
vregess
Гость
« Ответ #2 : Январь 07, 2008, 17:36 »

вот я исходники смотрел.
когда происходит чтение, по идее должны использоваться тайминги, которые определяются методом
setTimeout.

оно должно ждать исходя из таймингов, а потом выдавать результат.
тут вроде цикл и не нужен.
смотрел bytesAvailable, как я понял он ничего приличного не вернет для QextSerialPort.
ну в смысле кол-во байт в буфере порта она не вернет

мож я чет не понимаю..

моя реализация и в QextSerialPort похожа в принципе...
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #3 : Январь 07, 2008, 17:46 »

смотрел bytesAvailable, как я понял он ничего приличного не вернет для QextSerialPort.
ну в смысле кол-во байт в буфере порта она не вернет

А откуда такое заключени?
Всегда этот метод возвращал количество байт готовые для считывания. Никаких проблем небыло (с версии 0.7 пользовался)

Цитировать
This function will return the number of bytes waiting in the receive queue of the serial port.
« Последнее редактирование: Январь 07, 2008, 17:49 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #4 : Январь 07, 2008, 17:59 »

Скажу из опыта по поводу тайм-аутов: нефакт что они могут спасти. Особо полагаться на них не стоит.

ЗЫ: Текущая реализация QextSerialPort неочень удовлетворяла наши потребности. Мы делали отдельный поток и крутили бесконечный цикл со слипом. В цикле вызывался bytesAvailable. Если данные были, то мы их читали и парсили.
В итоге мы переписали QextSerialPort - сделдали работу с портом асинхронной.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
vregess
Гость
« Ответ #5 : Январь 09, 2008, 10:15 »

Скажу из опыта по поводу тайм-аутов: нефакт что они могут спасти. Особо полагаться на них не стоит.

ЗЫ: Текущая реализация QextSerialPort неочень удовлетворяла наши потребности. Мы делали отдельный поток и крутили бесконечный цикл со слипом. В цикле вызывался bytesAvailable. Если данные были, то мы их читали и парсили.
В итоге мы переписали QextSerialPort - сделдали работу с портом асинхронной.

посмотрел еще раз bytesAvailable. Да я ошибся. все он возвращает.
Но почему-то в моем случае что-то не то.
Ну цикл со слипом меня не устраивает..
Да тайминги мне важны очень, корректность обмена именно по ним только и определяется+crc.
у меня реализация работы с портом синхронная (тк такая мне нужна на данный момент) и не thread-safe (тк в синхронном обмене, как я понимаю, это и не надо), да написано оно без привязки к qt.

После просмотра кода QextSerialPort, решил пересмотреть API. вот переделываю ща.
Можно будет объединить все это..
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Январь 09, 2008, 11:21 »

Очеь трудно (я бы даже сказал невозможно) подобрать нужные тайминги для работы с портом
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
vregess
Гость
« Ответ #7 : Январь 09, 2008, 16:37 »

Очеь трудно (я бы даже сказал невозможно) подобрать нужные тайминги для работы с портом

это уже конечно оффтоп...
и все же, почему трудно?
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #8 : Январь 09, 2008, 16:49 »

это уже конечно оффтоп...
и все же, почему трудно?

Потому что существует множество факторов в передаче данных (возможная задержка с передающей стороны, задержка на принимающей стороне). И эти задержки не постоянны. Одним из факторм может быть сама ось. За заданный тайм аут может прийти только часть данных или не прийти данный вовсе. Если прога затачиваеться под конкетный девайс, то можно подобрать нужные таймауты. Но это не решение проблемы.

Пару лет назад писали прогу для работы с девайсами передачи\приема данный через ком. Каждый девайс вел себя поразному. Более того, поведение отлечалось на каждом взятом компьютаре. А прога должна была работать с любым девайсом на любой платформе. Как понимаешь, подбор таймингов здесь отпал сам сабой.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
vregess
Гость
« Ответ #9 : Январь 10, 2008, 07:07 »

а вот если. "Пакет" данных определяется именно временем между байтами? Или если нужна именно синхронная работа? (пример, протокол modbus).

Я не глубоко копал, но читал, что в вин тайминги криво реализованы, в лин вроде по-лучше.
На самом деле я тоже не точные тайминги использую. Тк передача у мя синхронная, то для корректной работы можно выставить хоть миллион часов в таймингах. Результатом будет снижение скорости общения, но зато стабильно. Так что вот. Проблемы подбора таймингов в таком случае не очень сложная задача. Можно взять, допустим, 1 сек. А если уж не успел все забрать/считать, то значит обработка ошибки. Это приемлемо для ряда случаев (у меня как раз такой).

хм. появился интерес реализовать все-таки асинхронную передачу в своей либе... вот только проверить негде будет.

это все интересно немножко, но оффтоп сильно. нас не простят!
мож завяжем? тем более в аське все это можно обсудить)
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #10 : Январь 10, 2008, 07:57 »

У меня есть переделаная либа реализующая асинхронную передачу. Правда только для Windows, Qt 3.3.x
Но мне кажеться не проблема портануть код под Qt 4
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
vregess
Гость
« Ответ #11 : Январь 11, 2008, 07:39 »

У меня есть переделаная либа реализующая асинхронную передачу. Правда только для Windows, Qt 3.3.x
Но мне кажеться не проблема портануть код под Qt 4
Ок. Буду знать. Придет время, обращусь. Решил пока не заморачивться (ибо не надо).

Кста, я пошел немного другим путем. Все-таки подобная библиотека работает с железом, и я не хотел привязываться к Qt (мож еще где понадобится), поэтому написал просто на с++. И думаю обертку написать как нить для Qt. Мне кажется это более правильный путь.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #12 : Январь 11, 2008, 16:45 »

Цитировать
Мне кажется это более правильный путь.

Ну незнаю насчет правильного пути... QextSerialPort вполне юзабельная библиотека
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
vregess
Гость
« Ответ #13 : Январь 11, 2008, 21:02 »

QextSerialPort вполне юзабельная библиотека
кто спорит

Ну незнаю насчет правильного пути...
просто не хочу привязывать к Qt. Мало ли что, вдруг придется от нее отказаться
Записан
oleg123
Гость
« Ответ #14 : Январь 30, 2008, 15:04 »

Используй режим работы устройства QIODevice::Unbuffered.
В противном случае при попытке чтения хотя бы одного байта QIODevice
пытается заполнить свой приёмный буфер (в 4.2.2 аж 16 к), отсюда и глюки.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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