powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Проблема приема данных из СОМ порта
6 сообщений из 6, страница 1 из 1
Проблема приема данных из СОМ порта
    #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
Проблема приема данных из СОМ порта
    #32511554
Фотография Green2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OutBufferSize Property
Sets and returns the size, in bytes, of the transmit buffer.

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

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

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

...
Рейтинг: 0 / 0
Проблема приема данных из СОМ порта
    #32511891
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Green2
Я как раз и этим параметром и изменяю размер буфера, но максимальный размер 32767, а мне надо 32768. А API я не пользовался. Где бы глянуть пример для порта? Кроме того остается непонятным, почему программа не реагирует на действия, пока не закончен прием? И почему на моем компьютере прием идет по частям, а на всех остальных полным блоком?
...
Рейтинг: 0 / 0
Проблема приема данных из СОМ порта
    #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
Проблема приема данных из СОМ порта
    #32512094
Фотография Joss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь всё это надо всунуть в программу на VB? М-да-а-а...
...
Рейтинг: 0 / 0
Проблема приема данных из СОМ порта
    #32512109
Фотография Green2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Засунуть это в программу на VB несложно, надо лишь экспортировать нужные функции

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

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

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


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