Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблема приема данных из СОМ порта / 6 сообщений из 6, страница 1 из 1
06.05.2004, 18:17
    #32509746
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема приема данных из СОМ порта
Прошу помочь решить небольшую проблему (или большую). Мне поручили написать программу получения данных с внешнего оборудования через СОМ порт. Особенность состоит в том, что передача начинается по нажатию кнопки на внешнем устройстве. Передача ведется сразу, без всяких опросов о готовности и пр. Данные передаются одним блоком в 32К (32768 байт), а буфер СОМ порта может быть размером только 32767 байт, по этому последний байт теряется. Я сначала запускаю цикл опроса порта, а потом нажимаю на устройстве кнопку передачи.
Dim Buffer As String
Do
DoEvents
Buffer = Buffer & MSComm1.Input
Loop Until Len(Buffer) = 32768
По идее, буфер порта должен непрерывно очищаться, а в переменной Buffer должна накапливаться передаваемая информация. Но как только начинается передача, программа впадает в ступор и не выходит из него, пока не будет передана вся информация. В переменной Buffer оказывается столько информации, каков размер буфера СОМ порта, остальная информация теряется. Причем эта ситуация возникает на всех компьютерах, кроме моего (у меня прием идет по частям). попытка использовать свойства
MSComm1.Break = True
MSComm1.RThreshold = 1 или 100
ни к чему не привели. В чем может быть дело? Программировал на VB6 с установленным SP6. OC Windows 98SE. На других машинах: Windows 95, Windows 98SE, Windows ME. Установки параметров портов везде одинаковые - число бит, скорость, контроль, стоповые биты, управление потоком.
...
Рейтинг: 0 / 0
08.05.2004, 18:25
    #32511554
Green2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема приема данных из СОМ порта
OutBufferSize Property
Sets and returns the size, in bytes, of the transmit buffer.

По описанию, это свойство изменяет размеры буфера передачи. Поменяй его

Joss сам я работать с OutBufferSize не пробовал.

Второй выход использовать напрямую функции API.

...
Рейтинг: 0 / 0
10.05.2004, 09:37
    #32511891
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема приема данных из СОМ порта
> Green2
Я как раз и этим параметром и изменяю размер буфера, но максимальный размер 32767, а мне надо 32768. А API я не пользовался. Где бы глянуть пример для порта? Кроме того остается непонятным, почему программа не реагирует на действия, пока не закончен прием? И почему на моем компьютере прием идет по частям, а на всех остальных полным блоком?
...
Рейтинг: 0 / 0
10.05.2004, 10:29
    #32511927
Green2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема приема данных из СОМ порта
Есть примеры в MSDN, они на 100% сишные.

Пример ожидания события.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
HANDLE hCom;
OVERLAPPED o;
BOOL fSuccess;
DWORD dwEvtMask;

hCom = CreateFile( "COM1",
    GENERIC_READ | GENERIC_WRITE,
     0 ,    // exclusive access 
    NULL, // no security attributes 
    OPEN_EXISTING,
    FILE_FLAG_OVERLAPPED,
    NULL
    );

if (hCom == INVALID_HANDLE_VALUE) 
{
    // Handle the error. 
}

// Set the event mask. 

fSuccess = SetCommMask(hCom, EV_CTS | EV_DSR);

if (!fSuccess) 
{
    // Handle the error. 
}

// Create an event object for use in WaitCommEvent. 

o.hEvent = CreateEvent(
    NULL,   // no security attributes 
    FALSE,  // auto reset event 
    FALSE,  // not signaled 
    NULL    // no name 
    );

assert(o.hEvent);

if (WaitCommEvent(hCom, &dwEvtMask, &o)) 
{
    if (dwEvtMask & EV_DSR) 
    {
         // To do.
    }

    if (dwEvtMask & EV_CTS) 
    {
         // To do. 
    }
}

авторИ почему на моем компьютере прием идет по частям, а на всех остальных полным блоком?

понятия не имею
...
Рейтинг: 0 / 0
10.05.2004, 15:08
    #32512094
Joss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема приема данных из СОМ порта
Теперь всё это надо всунуть в программу на VB? М-да-а-а...
...
Рейтинг: 0 / 0
10.05.2004, 15:38
    #32512109
Green2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема приема данных из СОМ порта
Засунуть это в программу на VB несложно, надо лишь экспортировать нужные функции

Около 4 лет назад с помощью этих функций я написал программу для COM на Borland С++. она отлично работала, пока мы не перенесли её на другой компьютер, оказалось, что Borland C использует свои dll и без них не работает.

Тогда мы плюнули на это, и стали делать на VB.

Но, повторюсь, перенести программу несложно. (для меня)
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблема приема данных из СОМ порта / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]