Данные с ком порта в excel


Download Article


Download Article

This tutorial explains how to establish a bidirectional real-time communication between Microsoft Excel and your RS232 COM Port devices like a Scale, Proximity reader, Barcode reader, temperature sensor, Caliper, Micrometer, Gage. This solution uses the software «Bill Redirect» with the «Excel Plugin» to easily connect your peripheral and receive and send the data. The communication between Microsoft Excel and your device is made via a direct DDE link. An Excel Macro can be called after each data received from your device to validate the data received. This solution explains how you can send a command via VBA to your device and totally control your device. No programming or additional hardware required!

  1. Image titled Read RS232 to Excel Macro VBA Data Acquisition Step 1

    1

  2. Image titled Read RS232 to Excel Macro VBA Data Acquisition Step 2

    2

    Download and install the Excel plugin. This is at http://www.billproduction.com plugin_DDE.zip. This plugin software is used to establish the communication with Microsoft Excel via DDE

  3. Advertisement

  1. Image titled Read RS232 to Excel Macro VBA Data Acquisition Step 3

    1

    Start the software: Bill Redirect. The default password to edit the configuration is: www.billproduction.com.

  2. Image titled Read RS232 to Excel Macro VBA Data Acquisition Step 4

    2

    Disable all section except the Serial Port and Plugin.

    • In section «Serial Port» set the switch to: On.
    • In section «Plugin» set the switch to: On.
  3. Advertisement

  1. Image titled Read RS232 to Excel Macro VBA Data Acquisition Step 5

    1

    Click on: Serial Port Configuration.

  2. Image titled Read RS232 to Excel Macro VBA Data Acquisition Step 6

    2

    Enter the Serial Port Number where your device is connected.

    • If the background color is green, it means that the serial port works and the port is open.

      • Select the Bauds, Parity and Databits configured in your device.
  3. Image titled Read RS232 to Excel Macro VBA Data Acquisition Step 7

    3

    Click on button: Save Configuration

    • If you use a RS-232 to USB converter to connect your device on the computer, it is important to use a converter with FTDI chipset for a good stability !
  4. Advertisement

  1. Image titled Read RS232 to Excel Macro VBA Data Acquisition Step 8

    1

    Start: Microsoft Excel
    . This solution is compatible with all Excel version and language !

  2. Image titled Read RS232 to Excel Macro VBA Data Acquisition Step 9

    2

    Create a in Excel a: new blank document.

  3. Image titled Read RS232 to Excel Macro VBA Data Acquisition Step 10

    3

    Make sure that the sheet name is: Sheet1.

  4. Image titled Read RS232 to Excel Macro VBA Data Acquisition Step 11

    4

    Save your Excel document to: C:BillProduction.CFGMyFile.xlsx.

  5. Advertisement

  1. Image titled Read RS232 to Excel Macro VBA Data Acquisition Step 12

    1

    Start the Excel Plugin
    .
    The default password to edit the configuration is: www.billproduction.com.

    • Important: The TCP Connection Status must indicate: Connect. If it is not to Connect then make sure that Bill Redirect Software is open.
    • In trial mode you must restart the software Bill Redirect after each 15 minutes to continue your test.»
  2. Image titled Read RS232 to Excel Macro VBA Data Acquisition Step 13

    2

    In the Excel Plugin click on the folder icon and select your Excel File created at step before.

    • If all is okay, the DDE Connection Status indicate: Connect.
    • At this point the communication is establish with your Device via Excel. The data received from your device is sent in Excel.
  3. Image titled Read RS232 to Excel Macro VBA Data Acquisition Step 14

    3

    Test your communication with Excel. Use the button: Test DDE. To see what your device sends or receive, use the section Debugger in Bill Redirect.

  4. Advertisement

  1. Image titled Read RS232 to Excel Macro VBA Data Acquisition Step 15

    1

    Consider example #1:’ Call an Excel Macro after each data received:

    • Simply enter your macro name in the field «Run macro:«
    • To test the call of your macro use the button at right.
  2. Image titled Read RS232 to Excel Macro VBA Data Acquisition Step 16

    2

    Consider example #2:’ Send a command to your device via VBA:

  3. Image titled Read RS232 to Excel Macro VBA Data Acquisition Step 17

    3

    To send data command from Excel to your device use this VBA Excel source code:

    • ChannelNumber = DDEInitiate(«BPEXCEL», «BPEXCEL»)
    • DDEExecute ChannelNumber, «{TX_SERIAL[Hello Word !{ASCII:13}]}»
    • DDETerminate ChannelNumber
    • Replace the command Hello Word !{ASCII:13} by the command you want.
    • Supplemental documentation.
    • Excel Plugin full manual with all explanation: http://www.billproduction.com
    • /Bill_DDE_over_Ethernet.pdf.
    • Bill Redirect Software full manual with all command:
      http://www.billproduction.com
    • /Bill_Redirect_Manual.pdf.
  4. Advertisement

Ask a Question

200 characters left

Include your email address to get a message when this question is answered.

Submit

Advertisement

Thanks for submitting a tip for review!

References

About This Article

Thanks to all authors for creating a page that has been read 31,791 times.

Is this article up to date?

 

Юрий_Нд

Пользователь

Сообщений: 35
Регистрация: 29.06.2019

Доброго дня Всем.
Допустим, от внешнего источника передаётся в COM-порт байт-два, или десяток?
Можно их прочесть средствами Эксель?
Операционная система Windows 7 *64.
Спасибо ____________ Юрий.

 

Добрый день!
У меня почти такая же проблема, позволите залезть в вашу тему или придется создавать новую

 

Юрий_Нд

Пользователь

Сообщений: 35
Регистрация: 29.06.2019

#3

30.09.2021 09:42:10

Цитата
Олег Гусляков написал:
… позволите залезть в вашу тему

Да без проблем.
У меня другое предложение, давайте вообще дружить.
Скиньте сообщение/контакты в личку для личного общения/контакта.

Изменено: Юрий_Нд30.09.2021 09:44:05

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

#4

30.09.2021 10:02:34

Цитата
Юрий_Нд написал: Спасибо ____________ Юрий.

Это место для подписи? :)

 

Юрий_Нд

Пользователь

Сообщений: 35
Регистрация: 29.06.2019

… «ну типа таво.», привычка.

 

БМВ

Модератор

Сообщений: 21380
Регистрация: 28.12.2016

Excel 2013, 2016

#6

30.09.2021 10:11:18

Цитата
Юрий_Нд написал:
Можно их прочесть средствами Эксель?

да можно.

По вопросам из тем форума, личку не читаю.

 

Итак у меня стоит задача вот в чем. Есть счетчики электроэнергии они собирают данные по электричеству с оборудования. Необходимо создать файл куда будут собираться все данные по счетчикам. Сразу скажу что SCADA системы нам не по карману. Считчики подключаются к компьютеру по RS485, протокол обмена данными есть в печатаном виде. Да и еще счетчики умеют работать по MODBUSу. Поэтому может есть у кого опыт организации обмена?

 

Юрий_Нд

Пользователь

Сообщений: 35
Регистрация: 29.06.2019

#8

30.09.2021 10:20:08

Цитата
БМВ написал: да можно.

… Excel «знает», что такое протокол UART?

БМВ, возможно эта тема «… стара как мир»?
Можете дать толковые ссылки, чтобы не мучить Вас здесь глупыми расспросами?

 

Юрий_Нд

Пользователь

Сообщений: 35
Регистрация: 29.06.2019

#10

30.09.2021 10:42:15

Цитата
БМВ написал:
Я вот с трудом понимаю …

Всё очень просто.
Вы знаете что искать. И это Ваше огромное преимущество, которого Вы даже не замечаете.
Очень Вам благодарен,
С уважением _______ Юрий.

 

юнат

Пользователь

Сообщений: 22
Регистрация: 18.10.2022

#11

19.10.2022 12:52:41

Помогите читать данные с ком порта.
По приведённым выше ссылкам в модуль вставился без ошибок только один код:

Код
Dim Chars2Send As Long
Dim CharsRemaining As Long
Dim lfsr As Long
    Open "COM6:9600,N,8,1" For Random As #1 Len = 1
    Input_Buffer = ""
    CharsRemaining = 0
    Do
    Get #1, , COM_Byte
    If COM_Byte Then
        If COM_Byte = 13 Then           ' look for CR line termination
            Debug.Print Input_Buffer, Now   ' print it
            Input_Buffer = ""               ' and clear input buffer
        '   generate some output (9 characters)
            lfsr = &H3FFFFFFF - 2 ^ (Received_Lines And 15)
            Output_Buffer = "?@@@@@@@@"
            Chars2Send = 9
            CharsRemaining = 9
            For j = 0 To 2
                Mid(Output_Buffer, 2 + j, 1) = Chr(Asc(Mid(Output_Buffer, 2 + j, 1)) + (31 And Int(lfsr / 32 ^ (2 - j))))
            Next j
            Debug.Print Output_Buffer
        '   show what I generated
            Received_Lines = Received_Lines + 1 ' keep track of received line count
        Else
            Input_Buffer = Input_Buffer & Chr(COM_Byte) ' assemble output buffer
        '   process any characters to send
            If CharsRemaining Then
                CharsRemaining = CharsRemaining - 1
                COM_Byte = Asc(Mid(Output_Buffer, Chars2Send - CharsRemaining, 1))
                Put #1, , COM_Byte
            End If
        End If
    End If
    DoEvents
    Loop
    Close
End Sub

Как вывести данные в ексель?

Изменено: юнат20.10.2022 08:43:49

 

юнат

Пользователь

Сообщений: 22
Регистрация: 18.10.2022

К порту подключен считыватель рфид карт.
В момент когда подноситься карта мне нужно видеть номер считанной карты в екселе.

Проблема ещё в том, что номер может повторяться — это если делать опрос порта каждую секунду и сравнивать номера карт для передачи в ексель.
А может можно обнулять считанные данные порта?

Я пока вообще не понимаю как это всё можно организовать, поэтому сразу не могу дать всех необходимых вводных данных.
Если чего то не сообщил — напишите.

 

БМВ

Модератор

Сообщений: 21380
Регистрация: 28.12.2016

Excel 2013, 2016

юнат,  свои сообщения можно корректировать и дополнять. Вернитесь и исправьте оформление кода макроса.

По вопросам из тем форума, личку не читаю.

 

юнат

Пользователь

Сообщений: 22
Регистрация: 18.10.2022

Здравствуйте все и всегда!
Хочу читать данные с ком порта, аж кушать не могу.
Желание, красные глаза и специально обученный палец нажимать на кнопку — имеются.
Как я понял с макросом чтения данных с ком порта всё очень не просто.
Помогите понять алгоритм выполнения моей задачи.
На данный момент я разбогател, помимо красных глаз, следующим.
По всем ссылкам даются примеры работы с ком портом с помощью
дополнительных примочек (.NET, MSCOMM32.OCX и чего то ещё), на
старых версиях операционок и виндовсов, а на нынешних это вроде не работает.
У меня точно не работает, любой пример вставляется с кучей ошибок.
На компе стоит офис 2019 и как я понимаю только VBA.
Гуру, посоветуйте с какого начала начать?

 

копите деньги

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Игорь Федорович

Пользователь

Сообщений: 23
Регистрация: 31.08.2022

#16

29.10.2022 20:56:51

Цитата
написал:
Хочу читать данные с ком порта, аж кушать не могу.

Случайно наткнулся на этот топик. Если еще актуально…

Есть идея навеянная статьями

1. Читаем COM при помощи питона

https://stackoverflow.com/questions/44056846/how-to-read-and-write-from-a-com-port-using-pyserial

2.Отображаем при помощи excel как здесь

https://www.someka.net/blog/real-time-stock-quotes-using-python/

3. Еще способ подружить Excel с Python здесь

https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=5&TID=141023&…

=

 

Ігор Гончаренко

Пользователь

Сообщений: 13746
Регистрация: 01.01.1970

#17

29.10.2022 21:18:16

Цитата
Игорь Федорович написал:
Есть идея навеянная статьями

идеи -это отлично, а решение есть? которое можно вставить в файл и получить желаемый результат?
я некоторое время жил в стране Советов, там советов было до хренища, ответов только не было на конкретный вопрос))

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Игорь Федорович

Пользователь

Сообщений: 23
Регистрация: 31.08.2022

#18

30.10.2022 10:00:06

Цитата
написал:
решение есть?

Например в ячейке A1 будет инфо из COM4

процедура excel

Код
Sub ReadFromCom()
    mymodule = Left(ThisWorkbook.name, (InStrRev(ThisWorkbook.name, ".", -1, vbTextCompare) - 1))
    RunPython "import " & mymodule & ";" & mymodule & ".ReadFromCom()"
End Sub

модуль питона

Код
import xlwings as xw
import serial
import time
import pythoncom


def ReadFromCom():
    wb = xw.Book.caller()
    sh = wb.sheets[0]
    ser = serial.Serial(port='COM4', baudrate=9600)
    n=10
    while (n>0):
    # Check if incoming bytes are waiting to be read from the serial input 
    # buffer.
    # NB: for PySerial v3.0 or later, use property `in_waiting` instead of
    # function `inWaiting()` below!
      if (ser.inWaiting() > 0):
        # read the bytes and convert from binary array to ASCII
        data_str = ser.read(ser.inWaiting()).decode('ascii') 
        # print the incoming string without putting a new-line
        # ('n') automatically after every print()
        #print(data_str, end='') 
        #return data_str
        sh["A1"].value = data_str
        n=n-1
    # Put the rest of your code you want here
    
    # Optional, but recommended: sleep 10 ms (0.01 sec) once per loop to let 
    # other threads on your PC run during this time. 
    time.sleep(0.01)

Изменено: Игорь Федорович30.10.2022 10:08:53

 

юнат

Пользователь

Сообщений: 22
Регистрация: 18.10.2022

#19

30.10.2022 18:54:59

Игорь Федорович, спасибо за идею, все советы актуальны.
На данный момент пошёл другим путём, но мысля с доступом к компорту осталась.

Знаток

 

Регистрация: 13.07.2007

Сообщений: 652

Репутация: 117



Здравствуйте,уважаемые форумчане.
Мне необходимо передать в таблицу 255 строк(Начало конец строки, разделители и 5 параметров) из своего устройства.
Пользовался
Advanced Serial Data Logger ( платный) и настроить его непросто,тем кто не в теме. Деньги небольшие и последнее является определяющим.
Последнее меня тревожит более всего, заказчик очень своеобразен.
Куплю ему, а потом и вопли с выносом мозга.
Вопрос кто виноват понятно, что делать?
Задач у меня немеряно и советы по изучению в лучшем случае к сведению.
Работа свалилась внезапно вне расписания.
Цифру вопроса можно как-то озвучить, чтобы принять решение.


Оценка

Banned

 

Регистрация: 21.04.2012

Адрес: южнее Дуная

Сообщений: 4,318

Репутация: 416



Цитата:

Сообщение от Sergey57

…. Деньги небольшие и последнее является определяющим… заказчик очень своеобразен….Куплю ему, а потом и вопли с выносом мозга……Вопрос кто виноват понятно, что делать? Задач у меня немеряно ….чтобы принять решение.

Нуууу, раз дело такое, то отправьте Вашего мосью Клиента в Ямальскую тундру….. А если Вам задачка по душе, то займитесь ею как хобби, имхо… А если Ваш заказчик аппетитная Дамма, то озвучте ее телефон !!!!… Созвонимся, обсъдим на тощак !!!…..

ПП: что за массив данних нужно передать?…


Оценка

Приглашаем всех желающих принять участие в вебинаре, посвященном LED-драйверам. На мероприятии мы рассмотрим существующую и новую продукцию из линейки поставок Компэл для интерьерного, архитектурно-декоративного, наружного и промышленного освещения, а также специальные драйверы с повышенной выходной мощностью для освещения площадей, стадионов и теплиц. Будут представлены LED-драйверы производителей MEAN WELL, MOSO, Snappy, а также драйверы для аварийного освещения (ISSATA). Рассмотрим их особенности и преимущества; узнаем, какая новая продукция появилась у MEAN WELL за прошедший год, и чего нам ждать в будущем.

Новичок

 

Регистрация: 01.08.2012

Сообщений: 6

Репутация: 10



Отправить сообщение для xmailer с помощью Skype™

Цитата:

Сообщение от Sergey57

Пользовался
Advanced Serial Data Logger ( платный) и настроить его непросто,тем кто не в теме. Деньги небольшие и последнее является определяющим.

1. напишите как Вам нужно работать с com портом: в порт что-то валится от железки; нужно захватывать данные; нужно работать одновременно с несколькими com
2. формат того что валится: простые данные или может у Вас там modbus
—— резюме ———
3. могу написать десктопное win приложение или сервис по логированию данных от железки. Взамен мне нужны консультации по STM32, точнее по таймерам. Если у Вас есть опыт работы с STM32, давайте попробуем.


Оценка

Знаток

 

Аватар для dimmich

 

Регистрация: 12.11.2010

Адрес: Владимир

Сообщений: 229

Репутация: 101



Помню давно тоже интересовался подобной задачей. Только необходимость отпала, так и не реализовал. И помню что гугль вполне может помочь в Вашем вопросе.


Оценка

Новичок

 

Регистрация: 04.11.2008

Сообщений: 438

Репутация: 37



Самым простым путем, ИМХО, который я уже реализовывал не один раз, будет запись всех принимаемых данных в текстовом формате ( с небольшой ообработкой) в файл VB-скрипта. По окончанию приема всех данных этот файл запускается на выполнение через wscript.exe и вуа-ля, таблица готова. Примеры подобных скриптов можно без труда нарыть в Интернете или могу скинуть образец. Если надо — пишите


Оценка

Знаток

 

Регистрация: 13.07.2007

Сообщений: 652

Репутация: 117



Спасибо за исчерпывающие ответы xmailer и AkaU.
Вот опять всплыла тема, серию заказали.

В прошлый раз это всё сам точил и фрезеровал на своём ЧПУ , а в этот раз напечатаю на 3д принтере.
Так исторически сложилось , что дальше выдачи в компьютер я не лезу.
Нет времени и задач. Под STM32 нет задач. С моими задачами справляются 18 и 33 пики, если нужно ещё что-то круче, то ПЛК с панелью оператора.

Будет регулярная строка :начало строки, № по порядку(3р),№ строки (3р),
Угол 1 (4р),Угол 2 (4р),Дальность (4р), конец строки.
Виртуальный СОМ-порт.
Берегу ваше время Посему Цифру вопроса можно как-то озвучить, чтобы принять решение.


Оценка

Новичок

 

Регистрация: 01.08.2012

Сообщений: 6

Репутация: 10



Отправить сообщение для xmailer с помощью Skype™

Цитата:

Сообщение от Sergey57

Будет регулярная строка :начало строки, № по порядку(3р),№ строки (3р),
Угол 1 (4р),Угол 2 (4р),Дальность (4р), конец строки.
Виртуальный СОМ-порт.

Написал приложение по логированию данных по указанному формату из com порта в указанный excel файл. Для эмуляции поступление данных в com порт по формату написали нехитрый arduino скетч:

Код:

int npp = 1;   
int nstr = 10;
char buffer[18];

void setup() {
  Serial.begin(9600); 
}

void loop() {
   /*№ по порядку(3р),№ строки (3р), Угол 1 (4р),Угол 2 (4р),Дальность (4р)*/

   sprintf(buffer,"%3d%3d%4d%4d%4d",npp,nstr,random(0,360),random(0,360),random(0,9999));
   Serial.println(buffer);
   delay(5000); 

   if(npp > 32000){
      npp=1;
   }
   if(nstr > 32000){
      nstr=10;
   }
   nstr++;
   npp++;
}

Приложение можно скачать здесь
Настройка параметров

Журнал


Оценка

Новичок

 

Регистрация: 01.08.2012

Сообщений: 6

Репутация: 10



Отправить сообщение для xmailer с помощью Skype™

Sergey57 если приложение Вам подойдет, может правки какие, найдите пож-та для меня время.


Оценка

Знаток

 

Регистрация: 13.07.2007

Сообщений: 652

Репутация: 117



Спасибо за заботу и разъяснения.
Но вот кроме всех приколов сегодня целый день пытаюсь
подковать блоху. Занимаюсь механикой.
Разработал в содружестве с товарищами систему.
Радиоканалы и первичные датчики моя сфера ответсвенности.
Там ещё лазеры,СинхроДонесения и очень мудрённый обмен по радиоканалу. И для полного счастья пневматика.

Цитата:

Будет регулярная строка :начало строки, № по порядку(3р),№ строки (3р),
Угол 1 (4р),Угол 2 (4р),Дальность (4р), конец строки.
Виртуальный СОМ-порт.
Берегу ваше время Посему Цифру вопроса можно как-то озвучить, чтобы принять решение заранее .Сроки у меня будут очень жёсткие.
Начало работ и финансирования 20 октября.

И напоследок , чтобы прояснить ситуацию.

Нанимают киллера взорвать квартиру.
Называют город,Улицу,дом….
Он _А сколько за работу?
— Миллион баксов.
Он-Номер квартиры не нужен.


Оценка

Новичок

 

Регистрация: 01.08.2012

Сообщений: 6

Репутация: 10



Отправить сообщение для xmailer с помощью Skype™

Цитата:

Сообщение от Sergey57

Занимаюсь механикой.
Разработал в содружестве с товарищами систему.
Радиоканалы и первичные датчики моя сфера ответсвенности.
Там ещё лазеры,СинхроДонесения и очень мудрённый обмен по радиоканалу. И для полного счастья пневматика.

Данную программу я сделал быстро, поскольку работаю прикладным программистом, если нужно отдам исходники. У меня период перехода с avr на smt32, и свой живой проект. Насколько я понял — Вы профессионально занимаетесь микроэлектроникой, возможно Вы могли бы ответить на несколько конкретных вопросов и не особо важно на какой архитектуре. В данном случае — деньги меня не интересуют, нужен спец по микроэлектронике. Мой скайп gserg51 или свой скажите


Оценка

Что это за АСУ такая, которая в качестве источника данных использует Excel-таблицу? :-) Она точна Автоматическая Система Управления? Или может это все-же утилита, выполняющая анализ и постобработку данных? 

В любом случае «простых» вариантов 2:

1) передавать с девайса на ПК CSV — файл. Выполнить это можно практически любым терминалом, включив логгирование в файл. CSV — Comma Separated Values, обычный текстовый файл, где каждая строка представляет собой что-то такое «xxxx4n». Запятые, а на деле практически любой специальный символ, не встречающийся в xn, разделяет отдельные значения, образуя эдакие «колонки». Полученный текстовый файл запросто импортируется в Excel (как именно — зависит от версии), а уже оттуда экспортируется в «фирменный» формат;

2) курим VBA, он-же Visual Basic for Applicatoins, и встраиваем чтение последовательного порта прямо в Excel-файл. И будет там буквально кнопка, скажем, «Пуск», которая будет читать результаты из порта и сразу раскидывать по ячейкам;

Ну а варианты «по-круче» зависят от времени, квалификации и ресурсов. :-)


Изменено 11 октября, 2019 пользователем El-Shang

    ‘            === ИНИЦИАЛИЗАЦИЯ ПОСЛЕДОВАТЕЛЬНОГО ПОРТА ===

    ‘  Модуль для инициализации COM-порта.

    ‘ Содержит функцию initCOM, которая имеет пять параметров в следующем порядке:

    ‘    COMn -имя порта, строка вида например COM1

    ‘ остальные параметры — целый числовой тип (Integer):

    ‘    baud -скорость приемопередачи, число из ряда стандартных скоростей

    ‘    bits -количество битов в посылке

    ‘    parity: 0-без четности(N), 1-нечетность, 2-четность

    ‘    stops -количество стоповых бит (1 или 2)

    ‘  Стандартный режим для COM1 9600 8N1 будет выглядеть как initCOM(«COM1», 9600, 8, 0, 1)

    ‘  Функция возвращает пустую строку в случае успешной инициализации порта,

    ‘  либо строку с сообщением об ошибке на русском языке.

    ‘  После этого порт готов к открытию стандартным оператором OPEN, например так:

    ‘        filenum = FreeFile

    ‘        Open COMport$ For Random As #filenum Len = 256

    ‘        Put #filenum, 1, «test»      ‘передача строки

    ‘        Get #filenum, 1, comstring$  ‘прием строки

    ‘        Close #filenum

    ‘   где COMport$ содержит то же самое имя порта.

    ‘=====================================================================

    Private BarDCB As DCB   ‘таблица параметров порта

    Private CtimeOut As COMMTIMEOUTS  ‘таймауты порта

    ‘Структуры для параметров настройки порта

    Type COMMTIMEOUTS

            ReadIntervalTimeout As Long

            ReadTotalTimeoutMultiplier As Long

            ReadTotalTimeoutConstant As Long

            WriteTotalTimeoutMultiplier As Long

            WriteTotalTimeoutConstant As Long

    End Type

    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

    ‘структура для операций файлового чтения-записи

    Type OVERLAPPED

            Internal As Long

            InternalHigh As Long

            offset As Long

            OffsetHigh As Long

            hEvent As Long

    End Type

    ‘объявления функций API

    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

    Declare Function PurgeComm Lib «kernel32» (ByVal hFile As Long, ByVal dwFlags As Long) As Long

    Declare Function SetCommTimeouts Lib «kernel32» (ByVal hFile As Long, lpCommTimeouts As COMMTIMEOUTS) As Long

    Declare Function SetCommState Lib «kernel32» (ByVal hCommDev As Long, lpDCB As DCB) As Long

    Declare Function CloseHandle Lib «kernel32» (ByVal hObject As Long) As Long

    Declare Function GetLastError Lib «kernel32» () As Long

    Public Function initCOM(ByVal COMn As String, ByVal baud As Integer, ByVal bits As Integer, ByVal parity As Integer, ByVal stops As Integer) As String

    ‘Инициализация COM-порта

    ‘в случае ошибки выдает строку сообщения об ошибке,

    ‘в противном случае — пустую строку.

        Dim retval As Long

        initCOM = «»

        ComNum = CreateFile(COMn, &HC0000000, 0, 0&, &H3, 0, 0)

        If ComNum = -1 Then

            initCOM = «Ошибка инициализации порта»

            Exit Function

          Else

             retval = PurgeComm(ComNum, 0) ‘очистка порта, очередей

        End If

        ‘ Начальное заполнение таблицы параметров приемопередачи

        BarDCB.DCBlength = 28  ‘длина блока DCB

        BarDCB.BaudRate = baud ‘скорость приемопередачи в бодах

        BarDCB.fBitFields = &H83 ‘Битовое поле, биты которого означают следующее:

                ‘1 fBinary вкл двоичный режим. Всегда 1 (кроме Windows 3.x :))

                ‘2 fParity          1 -проверять четность, возвращать код ошибки.

                ‘3 fOutxCtsFlow     1 -задействовать сигнал CTS: при сброшенном CTS приостанавливает передачу до появления CTS.

                ‘4 OutxDsrFlow      1 -точно так же задействовать сигнал DSR

                ‘5,6 fDtrControl    режим управления DTR. Три значения, не выяснил, каких.

                ‘7 fDsrSensitivity  чувствительность драйвера к DSR. При 1 драйвер устройства будет игнорировать данные, принятые без DSR.

                ‘8 fTXContinueOnXoff 0 — прием будет приостанавливаться принятым символом Xoff и возобновляться Xon.

                ‘9 fOutX            1 -передача будет приостанавливаться принятым символом Xoff и возобновляться Xon.

                ’10 fInX            1 -драйвер будет передавать управляющие символы XonXoff

                ’11 fErrorChar      1 -при ошибке по четности заменить ошибочный символ на заданный в поле ErrorChar

                ’12 fNull           1 -отбрасывать при передаче нулевые байты

                ‘13,14 fRtsControl  0 -выдавать сигнал RTS. Возможны три значения для выбора режима управления, какая кодировка — не выяснил.

                ’15 fAbortOnError   1 -при возникновении ошибки драйвер остановится до вызова функции ClearCommError.

                ’16 fDummy2         =0 зарезервировано, не используется.

        BarDCB.wReserved = 0 ‘не используется, должен быть 0

        BarDCB.XonLim = 128 ‘Задает минимальное число символов в приемном буфере перед посылкой символа XON

        BarDCB.XoffLim = 64 ‘Определяет макс кол-во байт в приемном буфере перед посылкой символа XOFF. Оно вычисляется вычитанием данного значения из размера применого буфера (в байтах)

        BarDCB.ByteSize = bits  ‘разрядность данных (кол-во бит)

        BarDCB.parity = parity  ‘1-проверять нечетность, 2-проверять четность, 0-не проверять ничего

    ‘    BarDCB.StopBits = 0     ‘количество стоповых бит: 0 -один, 1 -полтора, 2 -два

        If stops >= 2 Then BarDCB.StopBits = 2 Else BarDCB.StopBits = 0

        BarDCB.XonChar = 17 ‘символ, используемый в качестве Xon

        BarDCB.XoffChar = 19 ‘символ, используемый в качестве Xoff

        BarDCB.ErrorChar = 35 ‘символ, заменяющий принятый с ошибкой

        BarDCB.EofChar = 26 ‘символ «конец данных»

        BarDCB.EvtChar = 0  ‘символ для сигнализации о событии

        BarDCB.wReserved1 = 0 ‘зарезервировано. Не используется.

        retval = SetCommState(ComNum, BarDCB)

        If retval = -1 Then

            retval = GetLastError()

            initCOM = «Не удается настроить порт Error: » + retval

            retval = CloseHandle(ComNum)

            Exit Function

        End If

        ‘Времена ожидания (Time Outs) в миллисекундах

        ‘нулевые времена означают, что таймауты не используются.

        CtimeOut.ReadIntervalTimeout = 1 ‘максимальное время между двумя принимаемыми символами.

        CtimeOut.ReadTotalTimeoutConstant = 1 ‘постоянная часть таймаута на прием

        CtimeOut.ReadTotalTimeoutMultiplier = 1 ‘время на прием одного символа (для вычисления переменной части таймаута)

        CtimeOut.WriteTotalTimeoutConstant = 20 ‘постоянная часть таймаута на передачу

        CtimeOut.WriteTotalTimeoutMultiplier = 5 ‘время на передачу одного символа (для вычисления переменной части таймаута)

        retval = SetCommTimeouts(ComNum, CtimeOut)

        If retval = -1 Then

            retval = GetLastError()

            initCOM = «Ошибка при установке таймаутов, Error: » & retval

        End If

        retval = CloseHandle(ComNum)

    End Function

Понравилась статья? Поделить с друзьями:
  • Данные проверка данных где в excel
  • Данные с php на word
  • Данные проверка данных в excel чтобы на одном листе для других листов
  • Данные работники в excel
  • Данные работа с данными проверка данных в excel