![>](style_images/1/nav_m.gif)
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.137.212.29] |
![]() |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Цитата А как тут может помочь DoEvents ? Никак, DoEvents создан для совершенно других целей. Sleep замораживает поток, в вашем случае - главный поток, тоесть всю программу, графика (форма и компаненты), в VB так же находятся в главном потоке, отсюда полная заморозка приложения, а DoEvents помог бы, например, если бы вы использовали бесконечный цикл, или подобный расчёт в теле основого потока, но, DoEvents надо посылать не единожды, а каждый раз когда вы хотите чтобы компоненты и форма получали системные события. ![]() ![]() do DoSomethink '... какой то расчёт или действие, занимающее небольшой промежуток времени, если по времени эта команда долгая, есть вероятность, что даже DoEvents, который находится ниже - не даст нужного результата... Таковы реалии VB DoEvents loop Постараюсь скачать NanoVB, хотя бы посмотреть на Comm-компонент, а то забыл уже всё |
Сообщ.
#17
,
|
|
|
Может вы не заметили, но я работаю через MSCOMM, а НЕ напрямую , через API. В MSCOMM этой возможности нет. Добавлено Цитата VisualProg @ ...а каждый раз когда вы хотите чтобы компоненты и форма получали системные события. Благодарю. Ну я подозревал, что так оно и работает. Вот в циклах его и пользовал. И вот тут вопрос, а компонент mscomm.ocx тоже тормозится слипом? Или он в другом потоке? И еще, у меня почему то outbuffercount сразу после передачи показывает=0. Что, данные улетают мгновенно? |
Сообщ.
#18
,
|
|
|
Цитата GeoSoftUa @ Может вы не заметили, но я работаю через MSCOMM, а НЕ напрямую , через API. В MSCOMM этой возможности нет. Это принципиальная позиция - не использовать API? Если нет - то что мешает это применить к MSCOMM? |
Сообщ.
#19
,
|
|
|
Код у меня получился не большим
![]() ![]() 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 Получается ли в вашем коде нечто подобное? И можете пояснить, для чего вам таймер и счётчик? Возможно, они здесь вообще не нужны... |
Сообщ.
#20
,
|
|
|
Цитата hclubmk @ Это принципиальная позиция Нет, конечно. Чуть выше я указал, почему иду именно этим путем. Есть работающая прога. Посмотрел из чего она собрана, какие APIшки и компоненты применялись... И решил, что повторить её - дело 5 минут... однако, самонадеяность вылезла боком ![]() Цитата VisualProg @ Получается ли в вашем коде нечто подобное? Если коротко, то именно так у меня и написаны процедуры. Только я не передавал MSComm1.Input, MSComm1.InputLen в OnDataArrivalEvent, а прямо в этой процедуре снимал данные с MSComm1.Input -> в массив и MSComm1.InputLen в свою переменную. Дальше анализировал длину. Если она больше 1, то это точно ошибка, после этого проверял байт &hFE. Цитата VisualProg @ И можете пояснить, для чего вам таймер и счётчик? Это для себя. На время отладки смотреть что происходит и где затык. Хотели простыню посмотреть? Вот она ![]() ![]() ![]() ![]() 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 |
Сообщ.
#21
,
|
|
|
Цитата GeoSoftUa @ Нет, конечно. Тогда как-то так: ![]() ![]() 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 Подробное описание параметров найдешь по ссылке выше |
Сообщ.
#22
,
|
|
|
Цитата hclubmk @ Подробное описание параметров найдешь Я так понял, что проблема не в моем коде, а в параметрах передачи. Т.е. мне надо переключиться в асинхронный режим. Так? |
Сообщ.
#23
,
|
|
|
На самом деле вариантов может быть достаточно много. Предложенный - как один из возможных. Мануал и сниффер у тебя есть, а так гадать на кофейной гуще -дело мало-благодарное. Единственное, что посоветовал бы - уходить от MSCOMM. Ведет он себя порой непредсказуемо - приходилось помучиться. Погугли PComm lite -вполне надежный и бесплатный инструмент.
|
Сообщ.
#24
,
|
|
|
Цитата hclubmk @ что посоветовал бы - уходить от MSCOMM. Ведет он себя порой непредсказуемо - приходилось помучиться. И , кажется, это мой случай ![]() Всем спасибо за ответы. Буду е... хать дальше. ![]() |