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

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

Запись от popryduhin размещена 11.11.2016 в 09:09
Показов 9362 Комментарии 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. Старый комментарий
    да кстати
    Delphi
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    function COMOpen : boolean;
    begin
     
       try
        result := BComPort.Open;
        BComPort.FOpened := result;
       except
          on E : Exception do
          begin
           MessageBox(BComPort.Handle,
                      PWideChar('Class: '+E.ClassName+#10#13+ E.Message),
                      'Ошибка',MB_OK or MB_ICONERROR);
          end;
     
        end;
    end;
    я ловил исключения. не так уж все и плохо
    Запись от popryduhin размещена 11.11.2016 в 22:53 popryduhin вне форума
  2. Старый комментарий
    Аватар для Avazart
    не так уж все и плохо
    Да все еще хуже...
    А что если разработчику нафиг сдался ваш убогий MessageBox?
    Может у него стилизированное приложение, окно в розовый горошек и все такое, а вы ему бамс и серый мессаджБОКс.
    Да и может разработчику ложить на ваше исключение, ну нужно ему по логике программы игнорить исключения, например для проверки занятости компорта.
    Запись от Avazart размещена 11.11.2016 в 22:56 Avazart вне форума
  3. Старый комментарий
    Итог то какой? Ты хочешь сказать что бы я закинул это дело гиблое?
    Запись от popryduhin размещена 11.11.2016 в 22:58 popryduhin вне форума
  4. Старый комментарий
    Аватар для Avazart
    Короче понятно все, убийца всех надежд на жизнь.
    Итог то какой? Ты хочешь сказать что бы я закинул это дело гиблое?
    Ага бросай программирование, одевайся в черный прикид и записывайся в готы.

    А если серьезно:

    1 В разных ЯП есть свои классы для работы с COM-портом, нет смысла писать такое, разве что dll заточена под конкретное устройство с соблюдением протокола итп.

    2. Я указал как можно решить проблему с ошибками, остается подумать и исправить/доработать/переписать.
    Запись от Avazart размещена 11.11.2016 в 23:03 Avazart вне форума
  5. Старый комментарий
    Цитата Сообщение от Avazart
    Ага бросай программирование, одевайся в черный прикид и записывайся в готы.
    в Ёги
    Запись от popryduhin размещена 11.11.2016 в 23:04 popryduhin вне форума
  6. Старый комментарий
    Вот логически рассудить если, Arduino шлет строку в ком порт я ее получаю, какие проблемы?
    Запись от popryduhin размещена 11.11.2016 в 23:06 popryduhin вне форума
  7. Старый комментарий
    Аватар для Avazart
    Мм кто очень умный в этот момент выдергивает вашу дуню руками и компа, что произойдет?
    Или вы не заметили как запустили второй экземпляр программы и долго чешите репу почему ничего не принимается(порт уже занят первым экземпляром программы "Отказано в доступе")

    http://screencast.com/t/1z5BICB83

    Кстати в компоненте я бы использовал виндовсовское описание ( GetLastError()+FromatMessage() ) , а не зашивал в массив.
    Запись от Avazart размещена 11.11.2016 в 23:10 Avazart вне форума
  8. Старый комментарий
    Цитата Сообщение от Avazart
    Мм кто очень умный в этот момент выдергивает вашу дуню руками и компа, что произойдет?
    Даже не подумал что такие бывают
    Запись от popryduhin размещена 11.11.2016 в 23:12 popryduhin вне форума
  9. Старый комментарий
    Аватар для Avazart
    Даже не подумал что такие бывают
    А если USB разъём еле дышит и то контачит то нет?
    Запись от Avazart размещена 11.11.2016 в 23:18 Avazart вне форума
  10. Старый комментарий
    Аватар для HighPredator
    Вы бы слушали, что вам Avazart говорит. Все по делу же.
    Запись от HighPredator размещена 14.11.2016 в 14:30 HighPredator вне форума
  11. Старый комментарий
    Цитата Сообщение от HighPredator
    Вы бы слушали, что вам Avazart говорит. Все по делу же.
    А Вы все делаете что вам говорят?

    Речь конкретно шла о концепции передачи информации, просто сменили тему.
    Запись от popryduhin размещена 14.11.2016 в 22:11 popryduhin вне форума
  12. Старый комментарий
    Аватар для HighPredator
    Все ясно с вами.
    Запись от HighPredator размещена 15.11.2016 в 08:51 HighPredator вне форума
 
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru