На главную Наши проекты:
Журнал   ·   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
    Цитата
    А как тут может помочь DoEvents ?

    Никак, DoEvents создан для совершенно других целей. Sleep замораживает поток, в вашем случае - главный поток, тоесть всю программу, графика (форма и компаненты), в VB так же находятся в главном потоке, отсюда полная заморозка приложения, а DoEvents помог бы, например, если бы вы использовали бесконечный цикл, или подобный расчёт в теле основого потока, но, DoEvents надо посылать не единожды, а каждый раз когда вы хотите чтобы компоненты и форма получали системные события.


    ExpandedWrap disabled
      do
       
      DoSomethink '... какой то расчёт или действие, занимающее небольшой промежуток времени, если по времени эта команда долгая, есть вероятность, что даже DoEvents, который находится ниже - не даст нужного результата... Таковы реалии VB
       
      DoEvents
      loop


    Постараюсь скачать NanoVB, хотя бы посмотреть на Comm-компонент, а то забыл уже всё
      Цитата hclubmk @
      См. Структура COMMTIMEOUTS +

      Может вы не заметили, но я работаю через MSCOMM, а НЕ напрямую , через API. В MSCOMM этой возможности нет.

      Добавлено
      Цитата VisualProg @
      ...а каждый раз когда вы хотите чтобы компоненты и форма получали системные события.

      Благодарю.
      Ну я подозревал, что так оно и работает.
      Вот в циклах его и пользовал.
      И вот тут вопрос, а компонент mscomm.ocx тоже тормозится слипом? Или он в другом потоке?
      И еще, у меня почему то outbuffercount сразу после передачи показывает=0. Что, данные улетают мгновенно?
      Сообщение отредактировано: GeoSoftUa -
        Цитата GeoSoftUa @
        Может вы не заметили, но я работаю через MSCOMM, а НЕ напрямую , через API. В MSCOMM этой возможности нет.

        Это принципиальная позиция - не использовать API? Если нет - то что мешает это применить к MSCOMM?
        Сообщение отредактировано: hclubmk -
          Код у меня получился не большим

          ExpandedWrap disabled
            Private Sub OnDataArrivalEvent(ByVal data As String, ByVal length As Long)
                Select Case data
                    Case &HFE ' всё хорошо
                        SendData
                    Case 1 ' всё плохо
                        ' ... тут либо повторно отправляем данные, либо как то решаем проблему
                End Select
            End Sub
             
            Private Sub OnTimeout()
                ' тут таймаут
            End Sub
             
            Private Sub SendData()
                ' тут выполняем отправку данных устройству
            End Sub
             
            Private Sub MSComm1_OnComm() ' все события COM порта
                Select Case (MSComm1.CommEvent)
                    Case comEvReceive ' входящий трафик
                        OnDataArrivalEvent MSComm1.Input, MSComm1.InputLen ' перенаправляем данные в нашу процедуру
                    Case comEventTxTimeout ' таймаут
                        OnTimeout
                End Select
            End Sub


          Получается ли в вашем коде нечто подобное?
          И можете пояснить, для чего вам таймер и счётчик? Возможно, они здесь вообще не нужны...
            Цитата hclubmk @
            Это принципиальная позиция

            Нет, конечно.
            Чуть выше я указал, почему иду именно этим путем. Есть работающая прога.
            Посмотрел из чего она собрана, какие APIшки и компоненты применялись...
            И решил, что повторить её - дело 5 минут... однако, самонадеяность вылезла боком :oops: .

            Цитата VisualProg @
            Получается ли в вашем коде нечто подобное?

            Если коротко, то именно так у меня и написаны процедуры.
            Только я не передавал MSComm1.Input, MSComm1.InputLen в OnDataArrivalEvent, а прямо в этой процедуре
            снимал данные с MSComm1.Input -> в массив и MSComm1.InputLen в свою переменную.
            Дальше анализировал длину. Если она больше 1, то это точно ошибка, после этого проверял байт &hFE.

            Цитата VisualProg @
            И можете пояснить, для чего вам таймер и счётчик?

            Это для себя. На время отладки смотреть что происходит и где затык.

            Хотели простыню посмотреть? Вот она :). Остальные процедуры не меньше :).

            ExpandedWrap disabled
              Private Sub MSComm1_OnComm()
              On Error GoTo InputErr0
              Dim MessText As Integer
              'Переменная MessText не может быть пустой или без существующего индека в ресурсе
              MessText = 65 ' LoadResString(65) ' "Ошибка приёма данных!"
               
              Select Case MSComm1.CommEvent
               
              Case comEventFrame 'Framing Error. The hardware detected a framing error.
              MessText = 60 'LoadResString(60) '"Обнаружена аппаратная ошибка кодирования."
              GoTo InputErr
               
              Case comEventOverrun 'Port Overrun. A character was not read from the hardware before the next character arrived and was lost.
              MessText = 61 ' LoadResString(61) ' "Символ не считан устройством," & vbCrLf & "а следующий принят и потерян."
              GoTo InputErr
               
              Case comEventRxOver 'Receive Buffer Overflow. There is no room in the receive buffer.
              MessText = 62 ' LoadResString(62) ' "Переполнение буфера приёма." '& vbCrLf & "Нет места в буфере приёма."
              GoTo InputErr
               
              Case comEventRxParity 'Parity Error. The hardware detected a parity error.
              MessText = 63 'LoadResString(63) '  "Обнаружена ошибка четности."
              GoTo InputErr
               
              Case comEventDCB 'Unexpected error retrieving Device Control Block (DCB) for the port.
              'Неожиданная ошибка при получении кода блока управления (DCB) для порта.
              MessText = 64 ' LoadResString(64)'"Неожиданная ошибка при получении кода блока управления (DCB) для порта."
              GoTo InputErr
               
              '*********************************************************************
              Case comEvReceive
              'Process_comEvReceive_Data
              Debug.Print "comEvReceive"
              'Case comEvSend
              End Select
              '*******************************
              Exit Sub
              '*******************************
              InputErr0:
              MessText = 65 ' LoadResString(65) ' "Ошибка приёма данных!"
               
              InputErr:
              CheckEventError = True
              ProcessIndex = 0 'Отключение анализа полученных данных
              MSComm1.InBufferCount = 0
               
              Screen.MousePointer = 0
              MsgBox LoadResString(MessText) & vbCrLf & Error$(Err.Number), vbCritical + vbOKOnly
               
              End Sub
              Цитата GeoSoftUa @
              Нет, конечно.

              Тогда как-то так:
              ExpandedWrap disabled
                Public Declare Function SetCommTimeouts Lib "kernel32" (ByVal hFile As Long, lpCommTimeouts As COMMTIMEOUTS) As Long
                Public Type COMMTIMEOUTS
                        ReadIntervalTimeout As Long
                        ReadTotalTimeoutMultiplier As Long
                        ReadTotalTimeoutConstant As Long
                        WriteTotalTimeoutMultiplier As Long
                        WriteTotalTimeoutConstant As Long
                End Type
                ...
                Private CommTO As COMMTIMEOUTS
                 
                CommTO.ReadIntervalTimeout = &HFFFFFFFF
                CommTO.ReadTotalTimeoutMultiplier = 0
                CommTO.ReadTotalTimeoutConstant = 0
                CommTO.WriteTotalTimeoutMultiplier = 0
                CommTO.WriteTotalTimeoutConstant = 1000
                 
                SetCommTimeouts MSComm1.CommID, CommTO

              Подробное описание параметров найдешь по ссылке выше
              Сообщение отредактировано: hclubmk -
                Цитата hclubmk @
                Подробное описание параметров найдешь

                Я так понял, что проблема не в моем коде, а в параметрах передачи.
                Т.е. мне надо переключиться в асинхронный режим. Так?
                  На самом деле вариантов может быть достаточно много. Предложенный - как один из возможных. Мануал и сниффер у тебя есть, а так гадать на кофейной гуще -дело мало-благодарное. Единственное, что посоветовал бы - уходить от MSCOMM. Ведет он себя порой непредсказуемо - приходилось помучиться. Погугли PComm lite -вполне надежный и бесплатный инструмент.
                    Цитата hclubmk @
                    что посоветовал бы - уходить от MSCOMM. Ведет он себя порой непредсказуемо - приходилось помучиться.

                    И , кажется, это мой случай :). Переключил скорость обмена на порту и перестало работать даже то, что работало.
                    Всем спасибо за ответы. Буду е... хать дальше. :rolleyes:
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0603 ]   [ 16 queries used ]   [ Generated: 30.09.24, 07:21 GMT ]