![>](style_images/1/nav_m.gif)
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.189.180.134] |
![]() |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Устройство USB-UART cp2102 рабочее. Позволяет программировать прибор, и через него идет считывание данных с прибора через программы-мониторы портов. Но в программе на Delphi не проходит команда SetCommState(Com_Port_Handle, DCB), а GetCommState(Com_Port_Handle, DCB) возвращает все нули. Устройства USB-UART на других микросхемах (например, CH340G) с этой программой работают. В чем может быть проблема?
|
Сообщ.
#2
,
|
|
|
Что значит "не проходит команда SetCommState" ?
|
Сообщ.
#3
,
|
|
|
Если делаю цикл
![]() ![]() While Result = false do begin SetCommState(Com_Port_Handle, DCB) ; Result := SetCommState(Com_Port_Handle, DCB); end ; то зависает именно на CP2102. На CH340G все проходит, параметры порта устанавливаются. |
Сообщ.
#4
,
|
|
|
А зачем цикл? Всегда достаточно было одного раза. Что GetLastError сообщает?
Устанавливаемые параметры порта совпадают с теми, что используют другие программы (которые работают)? |
Сообщ.
#5
,
|
|
|
С одного раза не зависает, но и ничего в CP2102 не устанавливает (а в CH340G устанавливает). GetCommState(Com_Port_Handle, DCB) возвращает все нули. GetLastError дает нуль. Параметры, используемые другими программами, неизвестны, но я их довольно много перебрал, все глухо. А на других микросхемах и с одного раза все ставится нормально, и параметры меняю как угодно.
|
Сообщ.
#6
,
|
|
|
В терминале все работает и там и там?
|
Сообщ.
#7
,
|
|
|
Если использую готовые программы-мониторы портов, все работает, данные считываются.
|
Сообщ.
#8
,
|
|
|
Значит ищи ошибку, перепроверь параметры DCB. Запись байт в порт проходит нормально под отладчиком? Если в терминале работает, должно и у тебя в коде.
Добавлено Попробуй portmon. |
Сообщ.
#9
,
|
|
|
И чтение и запись идет нормально через другие программы, устройство рабочее. Параметры DCB на последний момент:
![]() ![]() DCB.BaudRate := CBR_9600 ; // DCB.Parity := EVENPARITY ; DCB.Parity := NOPARITY; // DCB.ByteSize := 7 ; DCB.ByteSize := 8 ; DCB.StopBits := ONESTOPBIT ; // DCB.XonLim := 0 ; // DCB.XoffLim := 255 ; // DCB.XonChar := 11 ; // DCB.XoffChar := 13 ; // DCB.StopBits := TWOSTOPBITS ; 9600, NOPARITY, 8 бит, 1 стоп-бит - вроде бы ничего необычного. Ни один параметр даже по отдельности не устанавливается. Без предварительной установки GetCommState(Com_Port_Handle, DCB) возвращает все нули изначально (с другими микросхемами не так). |
Сообщ.
#10
,
|
|
|
Попробуй задержку перед GetCommState поставить. Вызвать его повторно с задержкой.
|
Сообщ.
#11
,
|
|
|
Portmon порт на CP2102 обнаруживает (COM10 как и везде), но активности из под Delphi никакой нет (на других микросхемах и портах что-то пишет).
Добавлено Задержка ничего не дает. |
Сообщ.
#12
,
|
|
|
А терминал соответственно портмон активность показывает? Функция открытия порта как отрабатывает?
|
Сообщ.
#13
,
|
|
|
Может Handle неправильный? Код такой:
![]() ![]() procedure TfMT_30.OpenComPort ; {--------------Установить параметры COM-порта--------------------} begin if (Com_Port_Handle = 0) then begin Com_Port_Handle:= CreateFile( pchar(Port_Name), GENERIC_READ or GENERIC_WRITE, //FILE_SHARE_READ, 0, // Not shared nil, // No security attributes OPEN_EXISTING, //CREATE_NEW, //OPEN_EXISTING, // 0, // FILE_FLAG_OVERLAPPED, FILE_ATTRIBUTE_READONLY, 0 // No template ) ; end ; if (Com_Port_Handle = INVALID_HANDLE_VALUE) then begin eReady.Text := 'Ошибка' ; exit ; end ; end ; Хотя ошибки при работе не выдает. |
Сообщ.
#14
,
|
|
|
В коде я имею в виду.
Добавлено Вместо FILE_ATTRIBUTE_READONLY поставь 0 перед GetCommState что-то вроде этого попробуй dcb.DCBlength = sizeof(DCB); |
Сообщ.
#15
,
|
|
|
Portmon на CP2102 вообще ничего не показывает.
|