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

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

26.01.2007, 13:24. Показов 20780. Ответов 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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru