![]() |
|
|
#1
|
||||
|
||||
|
Уже голову сломал.
Есть устройство на базе широко известного в узких кругах USB-UART переходника (он же виртуальный COM порт) FT232RL. И пишу программу для работы с этим устройством. И всё вроде работает. У меня (Win7 x64). На компьютере друга (нетбук) - ну ни в какую. Прием данных осуществляется так: Код:
if not ReadFile(hCom, Buf, dwRead, dwRead, @OverlapRead) then
begin
ShowMessage('Ошибка при чтении данных.');
...// работаем с ошибкой
end;Думал, что дело в его винде (WinXP SP2). Но нет - поставил себе эту же самую винду (с его диска) на виртуальную машину - всё работает. В чём может быть дело? Программу изначально писал как раз другу, будет очень печально, если на его компе так и не запустится. Последний раз редактировалось Bargest, 03.07.2011 в 18:01. |
|
#2
|
||||
|
||||
|
Режим ком-порта устанавливаешь? как?
|
|
#3
|
||||
|
||||
|
Устанавливаю, стандартно:
Код:
if not GetCommState(hCom, Dcb) then
begin
StandardError('Не удалось получить состояние порта.');
exit;
end;
Dcb.BaudRate := CBR_9600;
Dcb.Parity := NOPARITY;
Dcb.ByteSize := 8;
Dcb.StopBits := ONESTOPBIT;
if not SetCommState(hCom, Dcb) then
begin
StandardError('Не удалось установить состояние порта.');
exit;
end;З.Ы. StandardError - это мой обработчик, там вывод сообщения и освобождение ресурсов. Последний раз редактировалось Bargest, 03.07.2011 в 18:37. |
|
#4
|
||||
|
||||
|
Цитата:
У меня есть опыт работы с таким. -Первое что могу посоветовать, это попробовать обмениваться данными с устройством используя программу-терминал. С помощью нее можно посылать на устройство данные и принимать. Классная штука. Помогает отладить протокол и проверить связь с устройством. -Второе. На сколько я понял ты используешь стандартное API? Лучше используй готовые компоненты, например: скачать. Последний раз редактировалось Developer, 03.07.2011 в 18:55. |
|
#5
|
||||
|
||||
|
Терминал на его компе поюзать не додумался - при встрече попробую, спасибо что напомнил.
А насчет второго - не люблю я лишние компоненты на АПИ работать ничуть не труднее, зато прога легче и стопудово не будет чужих багов. Когда-то юзал COM32 - норм, но не моё. Там стандартные ошибки понавешаны на каждый писк, а я предпочитаю свои обработчики, например вписать в лог или тихонько намекнуть об ошибке, а не орать на всю Ивановскую что у меня ком-порт не открылся, и не рисовать огромные крестики на экране с подписями на английском![]() |
|
#6
|
||||
|
||||
|
Bargest , вообще-то если используешь асинхронный режим (@OverlapRead), то ReadFile запросто может вернуть ошибку, но при этом GetLastError возвратит ERROR_IO_PENDING. тогда данные можно получить через WaitForSingleObject/GetOverlappedResult.
http://msdn.microsoft.com/en-us/libr...67(VS.85).aspx |
|
#7
|
||||
|
||||
|
Я предварительно ожидаю вечность (infinite), пока не придут данные, через WaitForSingloObject. Потом получаю количество байт в очереди при помощи ClearCommError.
Последний раз редактировалось Bargest, 03.07.2011 в 19:37. |
|
#8
|
||||
|
||||
|
а GetLastError что говорит?
Код:
ShowMessage(SysErrorMessage(GetLastError)); |
|
#9
|
||||
|
||||
|
Завтра попробую на его компе, посмотрю.
|
|
#10
|
||||
|
||||
|
У меня были еще 2 такие проблемы:
1. Аппаратная - глючный USB удлинитель. 2. Программная - глючный UART драйвер. Драйвер смогу только завтра выложить, если нужно конечно. |
|
#11
|
||||
|
||||
|
USB удлинитель не глючный, потому что у меня на компе работает.
А насчет глючного UART драйвера - это может быть. Жду ![]() |
|
#12
|
||||
|
||||
|
Я вот этот драйвер юзаю.
ЗЫЖ Но для вин7 (правда у меня была не x64 на тот момент) я драйвер вообще не ставил, она (винда) сама его из тырнета качнула. Последний раз редактировалось Aristarh Dark, 05.07.2011 в 09:58. |
|
#13
|
||||
|
||||
|
Благодарю. На Win7 у меня тоже все хорошо и без дров. Сегодня потестирую на XP.
|
|
#14
|
||||
|
||||
|
Нет, дело не в дровах. GetLastError возвращает ошибку "Параметр задан не верно".
|
|
#15
|
||||
|
||||
|
как инициализируешь OverlapRead?
|