Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/100: Рейтинг темы: голосов - 100, средняя оценка - 4.62
Rob

Работа с COM портами в VB????

26.01.2007, 13:24. Показов 20962. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, пожалуйста возможные способы программирования работы с СОМ портами!!!
Использование MSComm мне не особенно подходит, поскольку складывается впечатление, что это дело
хорошо работает лишь с модемами. Возможно есть
к.л процедуры WinApi?
Я побывал на многих сайтах. Для С++ и иже с ними
ссылок и примеров полно, а для VB - практически ничего!!! Что за дискриминация такая???? ((
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.01.2007, 13:24
Ответы с готовыми решениями:

Работа с портами устройств
Доброго времени суток всем, я только начинаю изучать Visual Basic 6.0 , книгу скачал прочитал часть , вот решил попробовать написать...

Работа с COM-портами.
Необходимо написать программу, получающую время с ком-порта (вообще не представляю как это сделать) и устанавливающая это время на...

Работа с COM портами
Всем привет! Начал работу с com-портами на php. Попытка открыть порт: $file = fopen ("COM1", "wb+"); if (!$file) { ...

8
Mavr
27.01.2007, 22:41
По-моему лучше всего работать с COM портами через API функции. Вот основные из них (более подробную информацию можешь найти в MSDN):

Позволяет открыть COM-порт:
Visual Basic
1
2
3
4
5
Declare Function CreateFile Lib 'kernel32' Alias 'CreateFileA' (ByVal lpFileName As String, _
                            ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, _
                            ByVal lpSecurityAttributes As Long, _
                            ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, _
                            ByVal hTemplateFile As Long) As Long
Определяет размеры входящего и исходящего буфферов обмена:
Visual Basic
1
2
Declare Function SetupComm Lib 'kernel32' (ByVal hFile As Long, ByVal dwInQueue As Long, _
                                           ByVal dwOutQueue As Long) As Long
Задает параметры порта (скорость и пр. фигню) и сохраняет их в структуре DCB
Visual Basic
1
Declare Function BuildCommDCB Lib 'kernel32' Alias 'BuildCommDCBA' (ByVal lpDef As String, lpDCB As DCB) As Long
Устанавливает параметры порта
Visual Basic
1
Declare Function SetCommState Lib 'kernel32' (ByVal hCommDev As Long, lpDCB As DCB) As Long
Чтение из порта:
Visual Basic
1
2
3
Declare Function ReadFile Lib 'kernel32' (ByVal hFile As Long, lpBuffer As Any, _
                                          ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, _
                                          ByVal lpOverlapped As Long) As Long
Получить настройки таймаутов порта:
Visual Basic
1
Declare Function GetCommTimeouts Lib 'kernel32' (ByVal hFile As Long, lpCommTimeouts As CommTimeOuts) As Long
Установить таймауты порта:
Visual Basic
1
Declare Function SetCommTimeouts Lib 'kernel32' (ByVal hFile As Long, lpCommTimeouts As CommTimeOuts) As Long
Закрыть порт:
Visual Basic
1
Declare Function CloseHandle Lib 'kernel32' (ByVal hObject As Long) As Long
Вот пример (описание типов и констант можешь глянуть в API Text Viewer, обрати внимание как описывается буфер):
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Type buf
b as String
End Type
 
Dim s as buf
 
IDComDev = CreateFile('COM1', GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0)
v=SetupComm(IDComDev, 1024, 128)
v=BuildCommDCB('COM1:9600,n,8,1', DCB)
v=SetCommState(IDComDev, DCB)
v=GetCommTimeouts(IDComDev, CT)          CT.ReadIntervalTimeout = MAXDWORD
CT.ReadTotalTimeoutMultiplier = 0
CT.ReadTotalTimeoutConstant = 0
v=SetCommTimeouts(IDComDev, CT)
Do While breakIt = False
v = ReadFile(IDComDev, s, 1, RetBytes, 0)
If v = 0 Then exit do
If asc(s.b) = 13 Then Exit Do
f (asc(s.b) <> 0) And (i = 1) And RetBytes = 1 Then T = T & s.b
DoEvents
Loop
i = CloseHandle(IDComDev)
Rob
28.01.2007, 11:00
2 Marv.
Огромное тебе спасибо! Как раз вчера я скачал отличный пример на С++ с использованием приведенных тобой процедур. Но т.к синтаксис различный, то мне пришлось-бы не легко с 'переводом' )). Теперь - же, я думаю, всё получится, т.к в том примере приведены подробные описания всех параметров и образцы прог.
Ещё раз, ОГРОМНОЕ спасибо!!
Р.S. К сожалению, на моём CD MSDN нет, что не удивительно т.к он (CD) всего один.
Некоторые говорят:
'MSComm - это стандартный VB Object,
который аналогичен API функциям
CreateFile(), ReadFile(), WriteFile()
в С. Если Вы хотите, Вы можете
напрямую использовать эти функции,
но Вы добьетесь точно такого же
результата, что и с MSComm.
Другой метод работы с сомм портом -
WinSocket, но это зависит от того,
что именно Вы собираетесь отправлять
и получать. Если же Вы хотите написать
свой собственный модуль, то создайте
dll на ассемблере или низкоуровневом С,
откомпилируйте его, зарегистрируйте
и вызывайте его функции из VB.'

Что скажешь?
Mavr
28.01.2007, 23:37
Рад что помог тебе. Другие описанные тобой способы работы с COM портами, так же можно было бы использовать (кроме WinSocket''а, т.к. он ни как не предназначен для работы с COM портами. Это спецификация для обеспечения связи типа приложение-приложение через сеть. Под понятием порт там имеется в виду совсем другие вещи). Писать на ассемблере конечно можно, но оно тебе надо, ведь уже все написано и ты можешь использовать более высокоуровневые методы.
Вот MSComm это другое дело, этот контрол специально и создан для того, что бы быстро и легко, а главное обычными для VB средствами решать такие задачи. Но не знаю почему, я все же предпочитаю работать через WinApi, кстати MSComm скорее всего работает через те же WinApi функции.
Да, и советую тебе установить MSDN, очень полезная штука.
Rob
29.01.2007, 12:49
2 Marv
Привет!
Сегодня опробовал приведенный тобой пример.С некоторыми сложностями программу удалось заставить работать. Сложности,ессно, заключались в
описаниях параметров мночисленных декларируемых процедур.Особенно пришлось повозиться со всем,что
касалось DCB. Однако, и после этого новая прога работает не корректно, хотя ошибок и не шьёт.
Поясню на простом примере.
У меня на СОМ2 стомт модем (по которому щас с тобой и общаюсь ). Так вот, пытаюсь с помощью
новой прги отдать ему команду:
'ATDP' & '1234567'
Реакция ноль.Однако при использовании MSComm и
примерно такого кода:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Sub frm1Send_Click()
''имеется форма с кнопкой 'Send' и MSComm MSC
''при нажатии на кнопку на модем
''отправляется стандартная команда
MSC.CommPort = 2
MSC.Settings = '9600,N,8,1'
MSC.PortOpen = True
On Error Resume Next
MSC.Output = 'ATDT' & '1261271' & vbCr
On Error Resume Next
S = Timer
Do While Timer < S + 5
DoEvents
Loop
MSC.PortOpen = False
End Sub
модем нормально реагирует! Однако, если не вводить задержки,то модем срабатывает и сразу затыкается по команде MSC.PortOpen = False.

Моя задача состоит в другом. Имеется внешний контроллер, соединённый с компом через СОМ порт.
К контроллеру через адресные платы подключены датчики, срабатывающие, например на размыкание
(охранная сигнализация или что-либо подобное).
Каждому датчику соответствует свой адрес. По запросу с компа контроллер посылает на него (комп)
последовательность бит, включающую бит,ответственный за событие (размыкание хотя бы
одного датчика) и набор адресов сработавших датчиков. Задача гораздо сложнее, но я специально всё упростил.
Хотелось-бы услышать твоё мнение по этому поводу,
а так-же по поводу того, как правильнее принимать
данные, приходящие с контроллера.
P.S. Если ты из Питера, то готов проставиться пивом (отнюдь не виртуальным, а очень даже настоящим ) )
Mavr
29.01.2007, 23:54
Приветствую !

Не совсем понял какие проблемы с DCB, описывается она так:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Type DCB
  DCBlength As Long
  BaudRate As Long
  fBitFields As Long 
  wReserved As Integer
  XonLim As Integer
  XoffLim As Integer
  ByteSize As Byte
  Parity As Byte
  StopBits As Byte
  XonChar As Byte
  XoffChar As Byte
  ErrorChar As Byte
  EofChar As Byte
  EvtChar As Byte
  wReserved1 As Integer
End Type
Когда ты делаешь BuildCommDCB настройки которые ты передаешь в строке записываются в эту структуру и потом делаешь SetCommState

По поводу дозвона по модему через WinApi попробуй вот это, у меня работает:
Можно работать и через MSComm в принципе у тебя все правильно, как видишь задержка WAITSECONDS необходима что бы модем успел дозвонится, без нее ни как.
Visual Basic
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
Declare Function WriteFile& Lib 'kernel32' _
            (ByVal hFile As Long, lpBuffer As Any, _
            ByVal nNumberOfBytesToWrite&, _
            lpNumberOfBytesWritten&, ByVal lpOverlapped&)
Declare Function CreateFile& Lib 'kernel32' Alias 'CreateFileA' _
            (ByVal lpFileName$, ByVal dwDesiredAccess&, _
            ByVal dwShareMode&, ByVal lpSecurityAttributes&, _
            ByVal dwCreationDisposition&, ByVal dwFlagsAndAttributes&, _
            ByVal hTemplateFile&)
Declare Function CloseHandle& Lib 'kernel32' (ByVal hObject&)
 
Declare Function FlushFileBuffers& Lib 'kernel32' (ByVal hFile&)
 
Function DialNumber(PhoneNumber, CommPort As String)
  Const WAITSECONDS=5
  Dim bModemCommand(256) As Byte, ModemCommand As String
  Dim OpenPort As Long
  Dim RetVal As Long, RetBytes as Long, i as integer
  Dim StartTime
    OpenPort = CreateFile(CommPort, &HC0000000, 0, 0, 3, 0, 0)
    If OpenPort = -1 Then Exit Sub
    ModemCommand = 'ATDT' & PhoneNumber & vbCrLf
    For i = 0 To Len(ModemCommand) - 1
        bModemCommand(i) = Asc(Mid(ModemCommand, i + 1, 1))
      Next
    RetVal = WriteFile(OpenPort, bModemCommand(0), _
               Len(ModemCommand), RetBytes, 0)
    If RetVal = 0 Then GoTo Err_DialNumber
    RetVal = FlushFileBuffers(OpenPort)
    StartTime = Timer
      While Timer < StartTime + WAITSECONDS
        DoEvents
      Wend
    ModemCommand = 'ATH0' & vbCrLf
    For i = 0 To Len(ModemCommand) - 1
        bModemCommand (i) = Asc(Mid(ModemCommand, i + 1, 1))
      Next
    RetVal = WriteFile(OpenPort, bModemCommand(0), _
               Len(ModemCommand), RetBytes, 0)
    RetVal = FlushFileBuffers(OpenPort)
Err_DialNumber:
    RetVal = CloseHandle(OpenPort)
End Function
 
Буффер bModemCommand можно описать как я показывал раньше (тип buf), я там только ошибся.
Надо так (буффер должен быть фиксированной длины иначе прога будет просто вылетать):
Type buf
  b as string*1 (в этом примере b as string*256)
End Type
По поводу работы с контролером про который ты говоришь, надо точно знать формат данных который он посылает компу.
С помощью программы котрую я тебе посылал, я работал со сканером штрих-кодов он посылал последовательность байтов, которые фактически являлись asc-кодами цифр штрих кода и штрих-код заканчивался всегда символом возврата.
Поэкспериментируй, попробуй хоть что-то от контроллера получить.

P.S. С пивом не получиться, т.к. я живу в Томске город в Сибири такой есть.
Успехов!
Kvark
30.01.2007, 08:59
Saliut! Sori za ruslat no u nas tut s ruskim ne gusto Kaunas, Litva na sviazi, vot smotriu u naroda problemsi s COM''ami a mne dovodilos'' programuliu pisat'' cto to tipo kak opisival. Begajut sportsmeni informacija s datcikov postupajet na kontroler a ja s laptopa cerez com port grabliu danie i skladivaju v fail, poputno risuju grafiki Esli interesno mogu kinut'' kusok gde ja prinimaju info s komporta i udacno ejo otsilaju poka etogo sdelat'' ne mogu tak kak mat'' sdohla kinu pozze esli nado.
Kvark
30.01.2007, 09:00
Saliut! Sori za ruslat no u nas tut s ruskim ne gusto Kaunas, Litva na sviazi, vot smotriu u naroda problemsi s COM''ami a mne dovodilos'' programuliu pisat'' cto to tipo kak opisival i cerez standartnij MSCom. Sut'' v sledujushem: begajut sportsmeni informacija s datcikov postupajet na kontroler a ja s laptopa cerez com port grabliu danie i skladivaju v fail, poputno risuju grafiki Esli interesno mogu kinut'' kusok gde ja prinimaju info s komporta i udacno ejo otsilaju poka etogo sdelat'' ne mogu tak kak mat'' sdohla kinu pozze esli nado.
Rob
30.01.2007, 11:22
2 Mavr
Привет!
Спасибо за исчерпывающую инфу! Теперь попробую
выбрать удачные кусочки и соединить их воедино.
А в выходные приволоку контроллер и посмотрю, что получится т.к. модем он и есть модем, специфика немного не та.
Жаль, что не смогу тебя отблагодарить посредством пива - есть за что!

2 Kvark
Hello!
Bylo-by interesno vzgljanut na tvoju progu. Tem
bolee, shto ona napisana s ispolzovanijem MSComm,
poskolku primenenije Win32Api Mavr opisal samym
ischerpyvajushim obrasom! Menja v osnovnom interesuet prijom dannyh, no budu rad lyuboy
informazii. Esli est vozmognost, zamil na:
bercut@mail.lanck.net
Poka!
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.01.2007, 11:22
Помогаю со студенческими работами здесь

Работа с портами
Добрый день. Стоит задача дипломного проекта - сканирование портов локальных пк. Вроде бы нашел код : function Thread.PortCheck(var...

Работа с портами
Нужна библиотека на подобии inpout32 чтоб подключаться непосредственно к регистрам (точнее 888 и 889) На форумах пишут что работать можно...

Работа с COM портами
Здравствуйте. Облазил много различных ресурсов в сети но не могу найти решение своей задачи. Есть батник: :begin @echo off ...

работа с портами
Контролер ЕЛТ имеет порт адреса 3д4 в который записывает номер регистра элт которому будет выдаваться управляюший код в контроллере порт...

работа с несколькими портами мк
К примеру есть такой код: for1: out PORTB,temp sec rol temp rcall delay dec temp2


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru