crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

44 страниц V  « < 40 41 42 43 44 >  
Ответить в данную темуНачать новую тему
> QSerialDevice - Библиотека для работы с COM-портами
RazrFalcon
  опции профиля:
сообщение 11.3.2013, 16:17
Сообщение #411


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


Угу. Видел. Проверю.

По поводу устройства. Еще более интересно. Дали мне сорцы оригинальной проги, на дельфи, которая работает отлично.

Вот как она открывает (перевел на c++), отличия от QtSerialPort:
::SetupComm(descriptor, 1024, 1024);
::PurgeComm(descriptor, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
// +
currentCommTimeouts.ReadTotalTimeoutConstant = 0;
currentCommTimeouts.ReadTotalTimeoutMultiplier = 0;
currentCommTimeouts.WriteTotalTimeoutMultiplier = 0;
currentCommTimeouts.WriteTotalTimeoutConstant = 0;

SetCommState не используется вообще.
В итоге сделав как в ней и закоментировав SetCommState, так как на нем ошибка. Теперь не могу дождаться ответа. Дебаг повисатет на:
QWinEventNotifier *n = new CommOverlappedEventNotifier(this, originalEventMask, q_ptr);

То есть прога тупо зависает, ждет как я понимаю ответа, но он не приходит.

Полный код функции на дельфи:
Раскрывающийся текст
function TfrmMain.OpenCOMDevice( port:string ) : boolean;
var
  ii: Integer;
  IsAvail:boolean;
begin
  if IsCOMConnected then
    CloseCOMDevice;

  LOG_INFO('OpenCOMDevice()', 'Подключение к порту: ' + PChar('\\.\\' + port));

  Result := False;

  try
    hComm:=CreateFile(PChar('\\.\\' + port),//cbDevPorts.Items[cbDevPorts.ItemIndex]),
                      GENERIC_READ or GENERIC_WRITE,
                      0,
                      Nil,
                      OPEN_EXISTING,
                      0,
                      0);

    if hComm = INVALID_HANDLE_VALUE then
    begin
      LOG_ERR('OpenCOMDevice()', 'hComm = INVALID_HANDLE_VALUE ('+SysErrorMessage(GetLastError)+')');
      Exit;
    end;

    ResBool := SetupComm(hComm, 1024, 1024);
    if ResBool = false then
    begin
      LOG_WARN('OpenCOMDevice()', 'SetupComm(hComm, 2048, 2048) = false');
    end;

    if not PurgeComm(hComm, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR) then
    begin
      LOG_WARN('OpenCOMDevice()', 'PurgeComm(hComm, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR) = false');
    end;

    CommTimeouts.ReadIntervalTimeout:=MAXDWORD;
    CommTimeouts.ReadTotalTimeoutMultiplier:=0;
    CommTimeouts.ReadTotalTimeoutConstant:=0;
    CommTimeouts.WriteTotalTimeoutMultiplier:=0;
    CommTimeouts.WriteTotalTimeoutConstant:=0;

    ResBool := SetCommTimeouts(hComm,CommTimeouts);
    if ResBool = false then
    begin
      LOG_ERR('OpenCOMDevice()', 'SetCommTimeouts(hComm,CommTimeouts) = false');
      raise Exception.Create('[SetCommTimeouts(..)] Ошибка при утановке таймингов порта!');
    end;

    OnDeviceConnect;

    Result := True;
  except
    SysErrorMessage(GetLastError);
    CloseHandle(hComm);
    hComm := INVALID_HANDLE_VALUE;
    Result:=False;
  end;
end;


PS: сомневаюсь что патч с vid/pid не заработает. rightJustified не может не работать ;)

Сообщение отредактировал RazrFalcon - 11.3.2013, 16:10
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 11.3.2013, 17:01
Сообщение #412


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


CommTimeouts.ReadIntervalTimeout:=MAXDWORD;

ну ну :)

ждать будешь дооооолго. Примерно 50 суток

Сообщение отредактировал Алексей1153 - 11.3.2013, 17:04
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 11.3.2013, 17:43
Сообщение #413


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


В QtSerialPort так же =/
Да и код не мой.

Сообщение отредактировал RazrFalcon - 11.3.2013, 17:44
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 11.3.2013, 18:05
Сообщение #414


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


RazrFalcon, этот таймаут - максимально позволяемое время между принимаемыми байтами. Раньше придёт - хорошо, а пока не приходит, функция держит управление. По таймауту (с учётом множителя и общего таймаута на чтение) возвращается ошибка - не удалось чтение

Как в других системах, не знаю, а в винде, чтобы таких затыканий не происходило, для синхронного режима вызывают функцию ClearCommError, откуда можно узнать, сколько сейчас уже принято байтов в буфере системы. Эти байты всегда считаются без задержек и управление тут же вернётся
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 11.3.2013, 18:14
Сообщение #415


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


По поводу детекта отключения на винде.

CommOverlappedEventNotifier
error = false

Всё. read и write не вызываются.


Что-то конкретное проверить может?

Алексей1153, это понятно. Только толку? Я не автор либы. Почему повисает понятно. По таймауту. Но повисать не должна, вот в чем затык.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 11.3.2013, 18:46
Сообщение #416


Активный участник
***

Группа: Участник
Сообщений: 393
Регистрация: 29.6.2009
Пользователь №: 862

Спасибо сказали: 36 раз(а)




Репутация:   7  


Цитата(RazrFalcon)
По поводу детекта отключения на винде.

CommOverlappedEventNotifier
error = false

Всё. read и write не вызываются.


Что-то конкретное проверить может?

Да, какое значение у triggeredEventMask и у originalEventMask в CommOverlappedEventNotifier::processCompletionRoutine()?

Цитата
CommTimeouts.ReadIntervalTimeout:=MAXDWORD;

ну ну :)

ждать будешь дооооолго. Примерно 50 суток

Нет, как раз наоборот. Почитай MSDN. ;)

Цитата(RazrFalcon)
Полный код функции на дельфи:


Нет. Открывают аналогично, таймауты такие-же.

Отличия в том, что дельфовый вариант не использует OVERLAPPED режим порта,
а также не устанавливает DCB структуру..

Хм.. т.е. скорость порта невозможно установить?

Цитата(RazrFalcon)
В итоге сделав как в ней и закоментировав SetCommState, так как на нем ошибка. Теперь не могу дождаться ответа. Дебаг повисатет на:

И будет зависать, т.к. открыто без FILE_FLAG_OVERLAPPED.
Фишка еще в том, что этот флаг обязательно нужен для QtSerialPort -
без него оно вообще не будет работать. :)


Цитата(RazrFalcon)
Пока что вышел на ошибку. И она до смешного популярна в гугле и именно с микрочипом.
SetCommState возвращает ошибку номер 31...


Да уж, обхохочешься:
Цитата
ERROR_GEN_FAILURE

31 (0x1F)

A device attached to the system is not functioning.


Цитата(RazrFalcon)
PS: сомневаюсь что патч с vid/pid не заработает. rightJustified не может не работать ;)

Уже отказались от этого патча. Забудь. По другому там надо делать. :)



Сообщение отредактировал kuzulis - 11.3.2013, 18:51
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 11.3.2013, 19:11
Сообщение #417


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


kuzulis, ага, подзабылось ) Но это не отменяет практику чистить ошибку
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 11.3.2013, 19:19
Сообщение #418


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


triggeredEventMask = 1
originalEventMask = 129

Цитата
Отличия в том, что дельфовый вариант не использует OVERLAPPED режим порта,
а также не устанавливает DCB структуру..
ну по этому и по другому
просто прога на дельфях то пашет, пусть и 31-н ошибка...

да и на маке и лине, udev как я понимаю, справляется нормально


про патч - ок, себе добавил. у меня и так тоже самое было, только уже в самой проге
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kuzulis
  опции профиля:
сообщение 12.3.2013, 10:01
Сообщение #419


Активный участник
***

Группа: Участник
Сообщений: 393
Регистрация: 29.6.2009
Пользователь №: 862

Спасибо сказали: 36 раз(а)




Репутация:   7  


Цитата(RazrFalcon)
triggeredEventMask = 1
originalEventMask = 129


Ох. Вот это вот и хреновенько. Т.е. тут уже не определишь что устройство выткнуто.

Хорошо, тогда вот что: в коде после того как ты выдернул шнурок, т.к. triggeredEventMask = 1 (EV_RXCHAR),
то должен запуститься startAsyncRead(), а после него - completeAsyncRead().

Так вот, проверь, есть ли какие-нить ошибки после ReadFile() в startAsyncRead() или еще где нить?
Т.к. если никаких ошибок нет - то невозможно отловить выдергивание.

А если все-таки ошибки есть и GetLastError их возвращает, то приведи номер ошибки
и скажи после какой операции она возникла.

Все дело в драйвере шнурка, возможно поможет установка последнего драйвера от FTDI
(мы же про FTDI говорим в данном случае?)


Цитата(RazrFalcon)
ну по этому и по другому
просто прога на дельфях то пашет, пусть и 31-н ошибка...


Ну так на дельфях и не используется много чего. Это не проблема QtSerialPort -
это проблема драйвера устройства. Если он гогно - то тут ничего не сделаешь.
Только обновить драйвер.

Цитата(RazrFalcon)
да и на маке и лине, udev как я понимаю, справляется нормально


Ну, ты сравнил теплое с мягким. :)

Сообщение отредактировал kuzulis - 12.3.2013, 10:03
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 12.3.2013, 12:46
Сообщение #420


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


startAsyncRead

1) первое условие не выполнилось, на чтение буфера
2) второе тоже (то есть указатель забрало нормально)
3) файл не прочло
4) QSerialPort::PermissionError
5) Поменяло на ReadError
6) вернуло false


Как временная заглушка, на винде и на ReadError проверяю. Но это как то не очень, вроде бы.

Сообщение отредактировал RazrFalcon - 12.3.2013, 12:52
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

44 страниц V  « < 40 41 42 43 44 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


18 чел. читают эту тему (гостей: 18, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.11.2024, 1:47