На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> COM-порт , Com-порт cp2102
    Устройство USB-UART cp2102 рабочее. Позволяет программировать прибор, и через него идет считывание данных с прибора через программы-мониторы портов. Но в программе на Delphi не проходит команда SetCommState(Com_Port_Handle, DCB), а GetCommState(Com_Port_Handle, DCB) возвращает все нули. Устройства USB-UART на других микросхемах (например, CH340G) с этой программой работают. В чем может быть проблема?
      Что значит "не проходит команда SetCommState" ?
        Если делаю цикл
        ExpandedWrap disabled
          While Result = false do
            begin
             SetCommState(Com_Port_Handle, DCB) ;
             Result := SetCommState(Com_Port_Handle, DCB);
            end ;


        то зависает именно на CP2102. На CH340G все проходит, параметры порта устанавливаются.
        Сообщение отредактировано: Krid -
          А зачем цикл? Всегда достаточно было одного раза. Что GetLastError сообщает?

          Устанавливаемые параметры порта совпадают с теми, что используют другие программы (которые работают)?
            С одного раза не зависает, но и ничего в CP2102 не устанавливает (а в CH340G устанавливает). GetCommState(Com_Port_Handle, DCB) возвращает все нули. GetLastError дает нуль. Параметры, используемые другими программами, неизвестны, но я их довольно много перебрал, все глухо. А на других микросхемах и с одного раза все ставится нормально, и параметры меняю как угодно.
              В терминале все работает и там и там?
                Если использую готовые программы-мониторы портов, все работает, данные считываются.
                  Значит ищи ошибку, перепроверь параметры DCB. Запись байт в порт проходит нормально под отладчиком? Если в терминале работает, должно и у тебя в коде.

                  Добавлено
                  Попробуй portmon.
                    И чтение и запись идет нормально через другие программы, устройство рабочее. Параметры DCB на последний момент:
                    ExpandedWrap disabled
                      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) возвращает все нули изначально (с другими микросхемами не так).
                    Сообщение отредактировано: Krid -
                      Попробуй задержку перед GetCommState поставить. Вызвать его повторно с задержкой.
                        Portmon порт на CP2102 обнаруживает (COM10 как и везде), но активности из под Delphi никакой нет (на других микросхемах и портах что-то пишет).

                        Добавлено
                        Задержка ничего не дает.
                          А терминал соответственно портмон активность показывает? Функция открытия порта как отрабатывает?
                            Может Handle неправильный? Код такой:

                            ExpandedWrap disabled
                              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 ;


                            Хотя ошибки при работе не выдает.
                            Сообщение отредактировано: Krid -
                              В коде я имею в виду.

                              Добавлено
                              Вместо FILE_ATTRIBUTE_READONLY поставь 0

                              перед GetCommState что-то вроде этого попробуй
                              dcb.DCBlength = sizeof(DCB);
                                Portmon на CP2102 вообще ничего не показывает.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0366 ]   [ 17 queries used ]   [ Generated: 28.03.24, 14:10 GMT ]