На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual Basic: Общие вопросы
Здесь обсуждаются вопросы по языку Visual Basic 1-6 (а так же по схожим языкам, как, например, PowerBASIC).
Вопросы по Visual Basic .NET (это который входит в состав Visual Studio 2002/2003/2005/2008+, для тех, кто не в курсе) обсуждаются в разделе .NET.

Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что Вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются. Студенты, вам сюда: ПОМОЩЬ СТУДЕНТАМ!
4. Используйте теги [ code=vba ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Формулируйте свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной (и более) давности, без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта user posted image FAQ Раздела user posted image Кладовка user posted image Наши Исходники user posted image API-Guide user posted image Поиск по Разделу user posted image MSDN Library Online user posted image Google

Ваше мнение о модераторах: user posted image SCINER, user posted image B.V.
Модераторы: SCINER, B.V.
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Вот такая проблема с MSCOMM
    Пытаюсь через MSComm работать с устройством, но сталкиваюсь с трудностями.
    Устройство USB, но работа с ним осуществляется через Com, самому устройству все равно на каком порту быть, хоть на 256, а мне как быть....??? После команды MSComm1.CommPort = 25 вылетает ошибка мол Ivalid Port и тд. Хотя устройство у меня находится именно на 25-ом...?
    БУДУ ОЧЕНЬ БЛАГОДАРЕН ЗА ПОМОЩЬ)
      Цитата varzind @
      MSComm1.CommPort = 25 вылетает ошибка мол Ivalid Port


      MSComm не может работать с портами выше 16.
      Надо юзать либо сторонние либы, либо CreateFile.

      PS: недавно было обновление бейсика в плане контролов, можно посмотреть исправила MS такое поведение или нет.
        Цитата nash @
        PS: недавно было обновление бейсика в плане контролов, можно посмотреть исправила MS такое поведение или нет.

        Видал что-то вроде SP6 - это про это говоришь..??
          http://msdn.microsoft.com/en-us/vbrun/ms788708.aspx - скорее я думаю про это.
          А тут обновления скачать можно:
          http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=e27eebcb-095d-43ec-a19e-4a46e591715c
          http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=cb824e35-0403-45c4-9e41-459f0eb89e36
            Цитата Lumen @
            А тут обновления скачать можно:


            угу
              К сожалению пока не имею возможности скачать... Интернет с предоплатой траффика, а траффик-то закончился((( Спасибо, позже скачаю... Сообщу результат!
                Сообщаю результат... Все обновления скачал и успешно установил, но не каких изменений с MSCom компонентом не заметил...
                Цитата nash @
                Надо юзать либо сторонние либы, либо CreateFile

                Нет ли какой известной либы, посоветуйте. И не знаю как через CreateFile работать, если есть примеры работы не откажусь ;)
                  ExpandedWrap disabled
                    Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
                    Private Declare Function ReadFile Lib "kernel32" Alias "ReadFile" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long
                    Private Declare Function WriteFile Lib "kernel32" Alias "WriteFile" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As OVERLAPPED) As Long
                     
                    Const FILE_ATTRIBUTE_TEMPORARY = &H100
                    Const OPEN_EXISTING = 3
                    Const GENERIC_READ = &H80000000
                    Const GENERIC_WRITE = &H40000000
                     
                     
                    ......
                    dim a as byte
                    ComPort="\\.\COM25"
                    hComm=CreateFile(ComPort, GENERIC_READ or GENERIC_WRITE, 0, 0,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
                     
                    ReadFile hComm,a,1, 1,byval &0
                    WriteFile hComm,a,1,1,byval &0

                  Вроде так...
                    Доброго всем времени.
                    Дабы не плодить темы, задаю вопрос в этой.
                    Работаю с MSCOMM. передаю на устройство массив данных.
                    Параметры 38400,8,N,1
                    Блоками по 128 байт + 1 байт CRC + 1 байт конца (04).
                    MSComm1.Output = ByteArray
                    Перед каждой передачей очищаю буфер MSComm1.OutBufferCount = 0
                    Жду ответа от устройства в MSComm1_OnComm.
                    Нормальный ответ = &hFE
                    Ошибка = 01
                    Но вот иногда устройство тупо молчит. Т.е. ничего не передает в ответ!
                    Изменял размер буфера передачи от 255 до 1024 но , приблизительно через 3-5 переданных блоков, опять молчит. :wall:
                    Что я не так делаю?
                    И вообще, что это за протокол такой:
                    04 - конец передачи блока
                    FE - нормально принят блок (ответ от устройства)
                    01 - ошибка приёма блока (ответ от устройства)
                    03 - завершение передачи (конец файла).
                    Может кто знает?
                      Цитата
                      Дабы не плодить темы, задаю вопрос в этой.

                      Зря, лучше создать новую, тем более, Ваша тема вообще никак не связанна с этой.

                      Цитата
                      приблизительно через 3-5 переданных блоков, опять молчит.

                      Если устройство программировалось не Вами - тут может быть что угодно, от обычного переполнения памяти устройства или ошибке, которая вводит устройство в "ступор", до линейной реализация ответа - ответ отправляется единожды, а не в цикле, как это следовало бы сделать, любая потеря байта и бесконечное ожидание неизвестно чего...

                      Если всё таки есть доступ к исходному коду устройства, или исходный код Вашей программы на стороне ПК - пожалуйста, предоставьте этот код, иначе - сомневаюсь что Вам хоть кто то ответит.
                        Цитата VisualProg @
                        Зря, лучше создать новую

                        На многих форумах модеры сильно ругаются, если плодишь темы :).
                        Кода устройства нет :(. ... если бы был ... :rolleyes:

                        Я просто зациклился, надо пообщаться, может, пока буду отвечать на поставленные вопросы, решу проблему.
                        Весь код процедуры вываливать не буду т.к. он довольно большой. Просто опишу последовательность действий.
                        1. Start_Process
                        Открываю порт.

                        2.Передаю запрос.
                        Запускаю таймер ожидания. (1 сек)

                        3.Жду ответа в MSComm1_OnComm
                        Пришел ответ.
                        Отключаю таймер.
                        Перехожу на процедуру анализа принятого.
                        DataLenCount = MSComm1.InBufferCount
                        if DataLenCount =1 Then
                        Проверяю принятый байт.
                        Если FE - то передаю следующий запрос. Переход на п.2
                        Если 01 - повторяю запрос.
                        .........
                        и так в цикле, пока все не передам.

                        Пробовал делать задержки на Sleep - работает очень коряво, долго и периодически виснет без ответа.
                        Тыкал куда попало DoEvents, не помогает...

                        P.S.
                        Для информации. Есть прога, которая все это делает, но она не моя. Написана на таком же бейсике. Декомпилил её, но ничего не понял :blush: :wall:

                        И еще вопрос. А как правильно отправлять данные в порт?
                        Блоками по 128 байт?
                        Блоками по 8 байт?
                        Побайтно?
                        После блока задержка нужна? Сколько? (Sleep?)
                        Сообщение отредактировано: GeoSoftUa -
                          Много непонятного:
                          1) Каково назначение таймера ожидания, если поступление данных поднимает событие порта, и их здесь-же можно анализировать?
                          2)
                          ExpandedWrap disabled
                            if DataLenCount =1 Then
                          где гарантия что это будет 1? Порт точно работает в асинхронном режиме и нет никакого накопления данных?
                          3) Если по нормальному, нужно было бы минимизировать и показать проблемный код, а так-же указать девайс, возможно прикрепить, или дать ссылку на мануал.
                          Как порту становится известно, что ожидаемый пакет данных сформирован корректно и получен им полностью? - возможно отсутствие ответа - банальное ожидание продолжения поступления данных?
                            Цитата
                            Запускаю таймер ожидания. (1 сек)

                            :blink: этот пункт как минимум вызывает подозрение...


                            Цитата
                            Пробовал делать задержки на Sleep

                            Он и должен тормозить, сама передача могла бы быть в параллельном потоке, тогда всё было бы гладко, ровно как вам и надо, но, есть нюанс - VB и многопоточность несовместимы :(


                            Думаю из-за пункта с таймером, вы считываете произвольные данные в случайный момент времени, а не реально прибывшие данные, ну, это имхо, могу ошибаться. Вообще, по хорошему, надо было бы подписаться на слушателя порта у контролла, либо, если есть, посмотреть на Event-ы, поискать каких нибудь DataReceiveEvent/DataSendEvent или нечто похожее. А то ваша система очень напоминает велосипед с треугольными колёсами, из-за которых, кстати, sleep и тормозит :)
                            Сообщение отредактировано: VisualProg -
                              Попробую ответить на оба сообщения :).

                              Цитата hclubmk @
                              Каково назначение таймера ожидания

                              Таймер просто сообщает мне (Timer 1..2..3..4..), что я жду ответа. В событии таймера стоит счетчик, если прошло 15 событий дальше ждать нечего, завершаем процедуру. Других целей у него нет.

                              Цитата hclubmk @
                              Порт точно работает в асинхронном режиме

                              А где это переключается?

                              Цитата hclubmk @
                              показать проблемный код, а так-же указать девайс, возможно прикрепить, или дать ссылку на мануал.

                              О коде см. мой пост выше. Мануал на 1142 страницы в пдфе. Будете изучать? :whistle:
                              И самое прикольное,(вы наверно не удивитесь) что это, недокументированные свойства! В мануале нет ни слова про это :rolleyes:.

                              Цитата hclubmk @
                              Как порту становится известно, что ожидаемый пакет данных сформирован корректно и получен им полностью?

                              По отправке контр. суммы блока и команде завершения передачи блока(04).

                              Цитата hclubmk @
                              - возможно отсутствие ответа - банальное ожидание продолжения поступления данных?

                              Возможно. Тут я сам не знаю :).

                              Цитата VisualProg @
                              Он и должен тормозить, сама передача могла бы быть в параллельном потоке, тогда всё было бы гладко, ровно как вам и надо, но, есть нюанс - VB и многопоточность несовместимы

                              А как тут может помочь DoEvents ?

                              Цитата VisualProg @
                              подписаться на слушателя порта у контролла

                              Смотрю прием/передачу порта с помощью EltimaSoftware Serial Port Monitor.
                              Вот там и вижу тишину.

                              Цитата VisualProg @
                              система очень напоминает велосипед с треугольными колёсами,

                              Так я про это и сам понимаю :yummy:, потому и тут...

                              Цитата VisualProg @
                              из-за которых, кстати, sleep и тормозит

                              Так я его и ставлю, чтобы тормозило. Иначе вообще никак.

                              И в завершение. Ваши вопросы натолкнули на мысль. Надо переварить и попробовать. :rolleyes:
                                Цитата GeoSoftUa @
                                А где это переключается?
                                См. Структура COMMTIMEOUTS +
                                ExpandedWrap disabled
                                  Public Declare Function SetCommTimeouts Lib "kernel32" (ByVal hFile As Long, lpCommTimeouts As COMMTIMEOUTS) As Long
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0.1082 ]   [ 16 queries used ]   [ Generated: 8.07.26, 09:09 GMT ]