На главную Наши проекты:
Журнал   ·   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
  
> 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 вообще ничего не показывает.
                                  А и вот еще что, хорошо бы перед GetCommState обнулить dcb, как это в дельфи тебе виднее

                                  Добавлено
                                  Цитата Igor_Muhin @
                                  Portmon на CP2102 вообще ничего не показывает.


                                  И терминал при этом отрабатывает?

                                  Добавлено
                                  В CreateFile последний параметр в nil поставь

                                  Добавлено
                                  Если активности нет, по идеи ты сюда должен свалить
                                  eReady.Text := 'Ошибка' ;

                                  потому как порт не открылся
                                    Вместо FILE_ATTRIBUTE_READONLY 0 ничего не дает.

                                    dcb.DCBlength = sizeof(DCB); ничего не дает.

                                    Portmon активности никакой не показывает.

                                    Зато после всех манипуляций и порты на других микросхемах стали вести себя так же.

                                    Добавлено
                                    Ну, да:
                                    ExpandedWrap disabled
                                      if (Com_Port_Handle = INVALID_HANDLE_VALUE) then
                                        begin
                                         eReady.Text := 'Ошибка' ;
                                         exit ;
                                         end ;

                                    Но ошибки, получается нет, т. е. Handle правильный.
                                    Сообщение отредактировано: Krid -
                                      Хорошо, верни в CreateFile как было, а со структурой dcb
                                      сначала ее обнуляешь, потом присваиваешь длину, потом вызов getCommState и нули?

                                      Добавлено
                                      Если в терминале работает, ну не знаю. Можно посмотреть в сторону таймаутов

                                      ExpandedWrap disabled
                                        COMMTIMEOUTS CommTimeOuts;
                                        CommTimeOuts.ReadIntervalTimeout := 0xFFFFFFFF;
                                        CommTimeOuts.ReadTotalTimeoutMultiplier := 0;
                                        CommTimeOuts.ReadTotalTimeoutConstant := TIMEOUT;
                                        CommTimeOuts.WriteTotalTimeoutMultiplier := 0;
                                        CommTimeOuts.WriteTotalTimeoutConstant := TIMEOUT;
                                         
                                        SetCommTimeouts(m_Handle, &CommTimeOuts)
                                      Сообщение отредактировано: Krid -
                                        Таймауты пока отключены. Вернулся назад, выполняю только процедуру открытия порта CreateFile и процедуру закрытия. Для CP2102 Portmon никакой активности вообще не показывает, для других микросхем и портов минимальная активность в три строчки имеется. Только что-то этот Portmon систему портит, порты как бы остаются после их изъятия, некоторые становятся неправильным оборудованием, вплоть до жесткий диск стал несистемным. Возможно, все-таки где-то на уровне CreateFile что-то идет не так.

                                        Добавлено
                                        Когда в CreateFile задаю имя порта как Pchar('\\.\'+ Port_Name) вместо Pchar(Port_Name), то Portmon активность для CP2102 показывает, GetCommState и SetCommState вроде бы тоже работают, т. е. вроде бы пока процесс пошел. А что такое здесь это '\\.\' и что оно дает?

                                        Добавлено
                                        Получается что вместо COM10 надо записать \\.\COM10?
                                          Igor_Muhin, ter_nk_

                                          M
                                          Используем тег [code] для добавления текста программы в пост! Устное предупреждение! Читаем правила!
                                          Сообщение отредактировано: Krid -
                                            В общем, когда задаю в CreateFile имя порта как Pchar('\\.\'+ Port_Name) вместо Pchar(Port_Name), где Port_Name = 'COM10' (получается программно), то порт на CP2102 (действительно COM10 по диспетчеру устройств) устанавливается нормально и даже уже удается иногда прочитать правильные числа с прибора. Зачем нужна добавка '\\.\', пока не понял. Только Portmon при использовании для контроля портит дело, приходится перезагружать компьютер.
                                              Цитата Igor_Muhin @
                                              В общем, когда задаю в CreateFile имя порта как Pchar('\\.\'+ Port_Name) вместо Pchar(Port_Name), где Port_Name = 'COM10' (получается программно), то порт на CP2102 (действительно COM10 по диспетчеру устройств) устанавливается нормально и даже уже удается иногда прочитать правильные числа с прибора. Зачем нужна добавка '\\.\', пока не понял. Только Portmon при использовании для контроля портит дело, приходится перезагружать компьютер.


                                              Там где порт больше девятого надо '\\.\' ставить. При открытии файла где длина пути больше 255 тоже надо добавлять "абсолютный" путь.
                                                Понятно, спасибо. А корректно этот префикс к именам первых портов (COM1-COM9) тоже добавлять для простоты? Я пока ко всем добавляю, вроде бы работает.
                                                  Цитата Igor_Muhin @
                                                  Понятно, спасибо. А корректно этот префикс к именам первых портов (COM1-COM9) тоже добавлять для простоты? Я пока ко всем добавляю, вроде бы работает.


                                                  Не обязательно добавлять. Я кстати не знал, что выше 9 надо добавлять, в дотнетовском проекте когда делал, у меня было до фига ком-портов и все работало.
                                                    > корректно этот префикс к именам первых портов (COM1-COM9) тоже добавлять для простоты?
                                                    Да, корректно. (Это UNC-нотация)
                                                      Igor_Muhin после CreateFile() и настройки порта CP2102 обязательно поставь задержку перед передачей данных. Сталкивался с некоторым такими девайсами (завит от настроения производителя) которые не воспринимали начальную посылку данных.
                                                        та же проблема. 1 в 1.
                                                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                        0 пользователей:


                                                        Рейтинг@Mail.ru
                                                        [ Script execution time: 0,0539 ]   [ 17 queries used ]   [ Generated: 19.04.24, 19:58 GMT ]