Форум программистов, компьютерный форум, киберфорум
popryduhin
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Чтение и запись в COM порт

Запись от popryduhin размещена 11.11.2016 в 09:09
Показов 9337 Комментарии 32

Здравствуйте дорогие программисты и «не»!

Хочу представить вам на обозрение совсем сырую DLL библиотеку по работе с ком портом. На основе класса TBComPort
Почему собственно я хочу это сделать? Мне нужно понять, на правильном ли пути Я? У себя проверял, работает!
Написал для удобства использования многократно.
Успешно посылаю команды на Arduino и обратно

Собственно код для подключения


1. Создаем новое приложение.
2. Подключаем библиотеку.
Delphi
1
2
3
4
5
6
7
8
9
10
   
        Procedure SetComPort(comPort : string); stdcall; external 'comReadSend.dll';
        Function   COMOpen : boolean; stdcall; External 'comReadSend.dll';
        function    COMClose : boolean; stdcall; External 'comReadSend.dll';
        Procedure InicializeCOMPort(var hwnd : THandle); stdcall; External 'comReadSend.dll';
        procedure DestroyCOMport; stdcall;  External 'comReadSend.dll';
        function    GetOpened : boolean; stdcall; External 'comReadSend.dll';
        function    WriteComStr( str : string) : integer; stdcall; External 'comReadSend.dll';
        function    DSRState : boolean; stdcall; External 'comReadSend.dll';
        Function   RLSDState : boolean; stdcall; External 'comReadSend.dll';
3. Инициализация com порта и потока
Delphi
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
51
52
53
54
55
56
57
58
59
unit Unit1;
 
interface
 
uses
...
 
const
 
  READ_COM_STR = WM_USER+4242;
type
  TForm1 = class(TForm)
...
    procedure readMessages(var msg : TMessage); message READ_COM_STR;
 
  private
    { Private declarations }
 
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
 
...
 
function OemToAnsiStr(const OemStr: string): string;
begin
  SetLength(Result, Length(OemStr));
  if Length(Result) > 0 then
    OemToCharBuff(PAnsiChar(OemStr), PwideChar(Result), Length(Result));
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  InicializeCOMPort;
  SetHandle(handle);
  COMOpen;
 
  MyHread := TMyHread.Create(false);
  MyHread.running := true;
  MyHread.Priority := tpTimeCritical;
  MyHread.FreeOnTerminate := true;
end;
 
 
procedure TForm1.readMessages(var msg: TMessage);
begin
  Memo1.Lines.Add(PChar(msg.LParam));
end;
 
 
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
   WriteComStr('BLA BLA BLA');
end;
Библиотека dll
https://yadi.sk/d/DvN3XAncyNbb5

Код потерпел некоторые изменения, а в частности конструкция
Delphi
1
2
3
4
5
6
7
8
procedure TBCommPort.BComPortRxChar(Sender: TObject; Count: Integer);
var
  s : string;
begin
  BComPort.ReadStr(s, count);
  s := OemToAnsiStr(s);
  SendMessage(Handle, READ_COM_STR, 0, DWORD(PChar(s)));
end;
внутри dll
Размещено в Delphi
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 32
Комментарии
  1. Старый комментарий
    Аватар для Avazart
    Зачем тебе DLL так и не понятно, что там один кажется pas файл бери и используй его многократно, что мешает?
    Запись от Avazart размещена 11.11.2016 в 12:56 Avazart вне форума
  2. Старый комментарий
    Цитата Сообщение от Avazart
    Зачем тебе DLL так и не понятно, что там один кажется pas файл бери и используй его многократно, что мешает?
    Ты меня преследуешь?
    Тогда вопрос тебе, а если я хочу этот же алгоритм использовать на C#или где нибудь еще?

    Дай угадаю, ты ответишь...

    На С# уже все есть.

    Я написал эту библиотеку и почему то она работает. Методы которые я использовал слегка абсурдные. Мне хочется уточнить, потестировать так сказать в обществе, а не получать все новые и новые вопросы.

    Сначала запусти, посмотри, а потом говори или ты троль?
    Запись от popryduhin размещена 11.11.2016 в 20:42 popryduhin вне форума
  3. Старый комментарий
    Аватар для Avazart
    На С# уже все есть.
    А разве нет?
    Я написал эту библиотеку и почему то она работает.
    А она работает?
    Сначала запусти, посмотри, а потом говори или ты троль?
    А оно мне надо? Я и так могу предсказать почему оно не будет работать или почему решение изначально плохое, не запуская код.
    Но для начала стоит узнать для чего эта затея? не стоящая свеч скорее всего...
    Запись от Avazart размещена 11.11.2016 в 21:18 Avazart вне форума
  4. Старый комментарий
    То есть ты хочешь сказать что "ЭТО" не работает?
    А оно мне надо?
    Нострадамус?
    О великий я склоняюсь перед тобой.

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

    Скажу больше, я подключаю к проекту, и успешно передаю и считываю информацию с com порта.
    Так что дядя, иди кури...

    Полезного более не говоришь.
    Запись от popryduhin размещена 11.11.2016 в 21:28 popryduhin вне форума
  5. Старый комментарий
    такие люди как ты создают иллюзию знатоков.
    Знаю одного телемастера радио электорнщика, так тот тоже все время, та зачем это, это все хер**ня, послушай сюда и тому подобное.

    Спился бедолага...
    Запись от popryduhin размещена 11.11.2016 в 21:34 popryduhin вне форума
  6. Старый комментарий
    Аватар для Avazart
    Ну начнем с того что код TBComPort в открытом доступе, и вы хоть его и "слямзили" в него не заглядывали.

    Нострадамус?
    Кодочитамус и кодоразбирамусь...

    Сама идея использовать компонент подобным образом убога.

    То есть ты хочешь сказать что "ЭТО" не работает?
    А что работает?
    Банальный вопрос где отлов ошибок?

    Я уже не говорю про это убожество:
    Получается что в dll чтение происходит по мере поступления данных и мы не в курсе когда они поступили, мы всего лишь опрашиваем функцию ReadComStr и только, поэтому нужно как можно чаще ее опрашивать, в противном случае мы можем пропустить данные, но исключения не будет, (смысловая ошибка).
    Напомню компонент событийно-ориентированый...

    Подобный быдлокод <...!> кому всрался.

    Возможно если бы реакция была другой может был бы смысл объяснять подробнее и думать как помочь...
    А так ...
    Запись от Avazart размещена 11.11.2016 в 21:40 Avazart вне форума
  7. Старый комментарий
    Цитата Сообщение от Avazart
    Ну начнем с того что код TBComPort в открытом доступе, и вы хоть его и "слямзили" в него не заглядывали.


    Кодочитамус и кодоразбирамусь...

    Сама идея использовать компонент подобным образом убога.


    А что работает?
    Банальный вопрос где отлов ошибок?

    Я уже не говорю про это убожество:

    Напомню компонент событийно-ориентированый...

    Подобный быдлокод <...!> кому всрался.

    Возможно если бы реакция была другой может был бы смысл объяснять подробнее и думать как помочь...
    А так ...

    Действительно, котись, котись колобок...
    Запись от popryduhin размещена 11.11.2016 в 21:54 popryduhin вне форума
  8. Старый комментарий
    Напомню компонент событийно-ориентированый...
    Вот ответь, что мешает этот компонент засунуть в библиотеку?
    да и возможно отлов ошибок будет, хотя они уже отлавливаются в самом классе, уже.
    Запись от popryduhin размещена 11.11.2016 в 21:57 popryduhin вне форума
  9. Старый комментарий
    Аватар для Avazart
    Вот ответь, что мешает этот компонент засунуть в библиотеку?
    да и возможно отлов ошибок будет, хотя они уже отлавливаются в самом классе, уже.
    Кривые руки?

    1. Ошибки не отлавливаются самим компонентом, обработка ошибок возлагается на пользователя класса для чего есть соответствующее событие.
    2. Более того там не одно событие, поэтому делая обвертку стоило подумать как обеспечить работу событий.
    3. Компонент уже имеет "синхронизацию" т.е. путем проброса через очередь сообщений фиктивному окну (как я помню)
    4. Если хотелось работы без "событий" вероятно просто стоило переписать код с нуля, предусмотрев свою обработку ошибок и работу с таймаутами.
    Запись от Avazart размещена 11.11.2016 в 22:10 Avazart вне форума
  10. Старый комментарий
    1. Ошибки не отлавливаются самим компонентом, обработка ошибок возлагается на пользователя класса для чего есть соответствующее событие.

    Delphi
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    const
      CM_COMPORT = WM_USER + 1;
     
      CEMess: array[1..15] of string =
        ('Попытка открыть несуществующий COM-порт',
         'Порт занят другой программой',
         'Ошибка записи в порт',
         'Ошибка чтения из порта',
         'Недопустимый параметр Async',
         'Ошибка функции PurgeComm',
         'Не удалось получить статус асинхронной операции',
         'Ошибка функции SetCommState',
         'Ошибка функции SetCommTimeouts',
         'Ошибка функции SetupComm',
         'Ошибка функции ClearCommError',
         'Ошибка функции GetCommModemStatus',
         'Ошибка функции EscapeCommFunction',
         'Нельзя менять свойство, пока порт открыт',
         'Ошибка обращения к системному реестру');
    Специально залез в класс
    наверное это где то используется?
    Запись от popryduhin размещена 11.11.2016 в 22:14 popryduhin вне форума
  11. Старый комментарий
    или я что то опять кривыми руками не так сделал?
    Запись от popryduhin размещена 11.11.2016 в 22:15 popryduhin вне форума
  12. Старый комментарий
    Аватар для Avazart
    Ок, где в вашем коде намек на обработку исключении?

    Допустим пользователь вашего кода вызыват

    Delphi
    1
    
     Function  COMOpen : boolean;            stdcall; External 'comReadSend.dll';
    Но происходит какая-то ошибка, что будет? И как пользователю получить описание этой самой ошибки?
    Или вызывает
    Delphi
    1
    
    function  ReadComStr : string;          stdcall; External 'comReadSend.dll';
    И что будет происходить:
    1. При ошибке
    2. При превышении таймаута.

    Действительно, котись, котись колобок...
    Неожиданный конец сказки - сказал колобок доедая остатки лисицы.
    Запись от Avazart размещена 11.11.2016 в 22:20 Avazart вне форума
  13. Старый комментарий
    Вообще суть в чем собственно была.
    Я из Китая купил стартовый наборчик ардуино.

    Вот и подумал реализовать библиотеку для связи по com порту.

    Проектов будет много и каждый раз мне генерировать методы, когда можно просто кинуть файл и с блокнота копирнуть пару десятков строк. помимо общения через com порт еще разные фитчи засунуть.
    Запись от popryduhin размещена 11.11.2016 в 22:20 popryduhin вне форума
  14. Старый комментарий
    Ок, где в вашем коде намек на обработку исключении?
    да пожалуйста, https://yadi.sk/d/tTcWzbo9yRPbX


    ни это ли описание
    Delphi
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    const
      CM_COMPORT = WM_USER + 1;
     
      CEMess: array[1..15] of string =
        ('Попытка открыть несуществующий COM-порт',
    случаем
    Запись от popryduhin размещена 11.11.2016 в 22:23 popryduhin вне форума
  15. Старый комментарий
    Аватар для Avazart
    случаем
    Ну да .. Разработчик компонента предусмотрел такой случай пробросом исключения.
    Где это в вашем коде(интерфейсе)?

    Или вы думаете что исключение выброшенное внутри кода DLL на Delphi обработается в C# ?

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

    Delphi
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    Function  COMOpen : boolean; 
    begin
       try
            Result:=FComPort.Open();
       Except on E :  EComPort do
       begin
             FLastErrorDescription:= E.Message;
             Result:= False;
       end;
    end;
    Delphi
    1
    2
    3
    4
    
    Function  LastErrorDescription : String; 
    begin
        Result:= FLastErrorDescription;
    end;
    Хотя C# не знает String, тут стоит будет тоже подумать как это решить.
    Запись от Avazart размещена 11.11.2016 в 22:29 Avazart вне форума
  16. Старый комментарий
    Цитата Сообщение от Avazart
    Неожиданный конец сказки - сказал колобок доедая остатки лисицы.
    Одни сарказмы....
    Запись от popryduhin размещена 11.11.2016 в 22:30 popryduhin вне форума
  17. Старый комментарий
    Короче понятно все, убийца всех надежд на жизнь.
    Не вижу смысла далее вести дискуссию.

    Единственное что не правильно в моем коде так это
    Delphi
    1
    
    ReadComStr
    и то что я эту функцию опрашиваю в отдельном потоке, думаю что message можно слать из
    Delphi
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    { TBCommPort }
     
     
     
    procedure TBCommPort.BComPortRxChar(Sender: TObject; Count: Integer);
    var
      s : string;
    begin
      BComPort.ReadStr(s, count);
      ResponseStr := OemToAnsiStr(s)
    end;
    в приложение, а та в свою очередь опрашивать ReadComStr

    Надеюсь поправить, да и какое дело кому то, что там компонент сидит, компоненты тоже код.
    Запись от popryduhin размещена 11.11.2016 в 22:39 popryduhin вне форума
  18. Старый комментарий
    Аватар для Avazart
    Не будут у тебя работать события в потоке в котором нет обработки очереди событий.
    А без событий, без обработки ошибок и таймаутов нельзя узнать что происходит.
    Оно может как-то криво работать, но оно не дает разработчику то что ему нужно.

    Надеюсь поправить, да и какое дело кому то, что там компонент сидит, компоненты тоже код.
    Быдлокод тоже код... или Кот ? Да какая разница ....
    Запись от Avazart размещена 11.11.2016 в 22:45 Avazart вне форума
  19. Старый комментарий
    Цитата Сообщение от Avazart
    Не будут у тебя работать события в потоке в котором нет обработки очереди событий.
    А без событий, без обработки ошибок и таймаутов нельзя узнать что происходит.


    Быдлокод тоже код... или Кот ? Да какая разница ....
    Быдло КОТ на аватарке
    Запись от popryduhin размещена 11.11.2016 в 22:48 popryduhin вне форума
  20. Старый комментарий
    Аватар для Avazart
    Так котейку не обижать! А то может и репу поцарапать.
    Запись от Avazart размещена 11.11.2016 в 22:51 Avazart вне форума
 
Новые блоги и статьи
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru