Тонкости работы с COM портом

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Re: Тонкости работы с COM портом

Сообщение @lex » 23.06.2023 18:09:52

Добрый день, коллеги!
Столкнулся с проблемой при работе с COM-портом (RS485, MOXA CP-114) с использованием Synapse в Windows.
Имеется несколько портов, на который висят разные устройства, у каждого порта отличаются настройки (скорость, чётность).
Никакие устройства не отвечают на запросы программы после перезагрузки ПК, но если перед её запуском, открыть другую, которая обменяется данными с устройствами, то после этого моя программа работает отлично и бесконечно долго!
Опытным путём выяснил, что запустить программу для настройки модулей icpDas (DCON_utility) и прочитать модули на одном из портов, то моя программа после этого будет видеть только этот порт, а если с помощью той-же DCON_utility поискать модули icpDAS на порту, где их нет, но есть другие устройства (специализированные, со своим бинарным протоколом), то моя программа устройства с этого порта всё равно не видит. Если почитать там-же устройства другой программой, которая обменяется с ними данными, то после этого и моя будет прекрасно работать.
Не помогает и то, если в DCON_utility выставить правильные настройки порта.
При перезагрузке ПК, питание с устройств не снимается.

Код, отвечающий за работу с портом с устройствами DCON.
Код: Выделить всё
...

const
COM_TIMEOUT = 300;

var
  ...
  ser: TBlockSerial;
  Baud: integer = 38400;

...

procedure TECfgForm.FormCreate(Sender: TObject);
begin
...
ser:=TBlockSerial.Create;
...
end;

procedure TECfgForm.FillITO;
var
n: integer;
r: ansistring;
i: shortint;
b: byte;
h: string;
ofs: single;
begin
ITOgrid.Enabled:=True;
t_tin.Enabled:=True;
b_set.Enabled:=True;
b_reset.Enabled:=True;
ITOgrid.Clean;
ITOgrid.Cells[0,0]:='Адрес';
ITOgrid.Cells[1,0]:='Порт';
ITOgrid.Cells[2,0]:='Данные';
ITOgrid.Cells[3,0]:='Смещение';
if (l_a7015.Items.Count<3) then exit;
if (l_a7015.ItemIndex > 0) and (toint(l_com2.Text)>0) then
  begin
   for n:=1 to 12 do
    begin
     ITOgrid.Cells[0,n]:=inttostr((n-1) div 6 + l_a7015.ItemIndex);
     ITOgrid.Cells[1,n]:=inttostr((n-1) mod 6);
    end;
   //Получаем данные от IcpCon i-7015
   try
    ser.Connect(l_com2.Text);
    ser.Config(Baud, 8, 'N', 1, False, False);
    for n:=1 to 12 do
     begin
      ProgressBar1.Position:=100*n div 12;
      r:='#0'+inttostr((n-1) div 6 + l_a7015.ItemIndex) + inttostr((n-1) mod 6);
      ITOgrid.Cells[2,n]:=r;
      Application.ProcessMessages;
      ser.SendString(r+CRC(r)+chr(13));
      r:=ser.RecvPacket(COM_TIMEOUT);
      //В ответ ничего не приходит, если до этого не запустить DCON_utility
      if (length(r)>1) then ITOgrid.Cells[2,n]:=FloatToStrF(todouble(r),ffFixed,2,2) else ITOgrid.Cells[2,n]:='н/д';
      Application.ProcessMessages;
      r:='@0'+inttostr((n-1) div 6 + l_a7015.ItemIndex) + 'A3C' + inttostr((n-1) mod 6);
      ser.SendString(r+CRC(r)+chr(13));
      ITOgrid.Cells[3,n]:=r;
      Application.ProcessMessages;
      r:=ser.RecvPacket(COM_TIMEOUT);
      if (length(r)>5) then
       begin
        h:='$'+r[4]+r[5];
        b:=strtoint(h);
        i:=0;
        move(b,i,1);
        ofs:=i / 10;
        if (toint(r[3])=(n-1) div 6 + l_a7015.ItemIndex) then
         ITOgrid.Cells[3,n]:=FloatToStrF(ofs,ffFixed,1,1) else ITOgrid.Cells[3,n]:='н/д';
       end
        else ITOgrid.Cells[3,n]:='н/д';
      Application.ProcessMessages;
     end;
   finally
    ser.CloseSocket;
    ProgressBar1.Position:=0;
   end;
  end else
   begin
    ITOgrid.Enabled:=False;
    t_tin.Enabled:=False;
    b_set.Enabled:=False;
    b_reset.Enabled:=False;
   end;
end;


Добавление:
Код: Выделить всё
ser.Flush;
ser.Purge;

вместе и по отдельности после подключения к порту не решают проблему.

Может кто-то сталкивался с подобной проблемой?
@lex
постоялец
 
Сообщения: 180
Зарегистрирован: 19.06.2006 13:16:29
Откуда: Невинномысск

Re: Тонкости работы с COM портом

Сообщение delphius » 23.06.2023 19:22:05

delphius
постоялец
 
Сообщения: 122
Зарегистрирован: 18.03.2020 13:40:11

Re: Тонкости работы с COM портом

Сообщение @lex » 25.06.2023 10:35:45

Не изучен. Почитаю, спасибо!
@lex
постоялец
 
Сообщения: 180
Зарегистрирован: 19.06.2006 13:16:29
Откуда: Невинномысск

Re: Тонкости работы с COM портом

Сообщение @lex » 26.06.2023 16:53:40

После быстрого ознакомления с книгой, появилась только одна идея - попробовать воспользоваться WinAPI, но там в консольном примере для Delphi не задаются настройки порта, только в примерах для C++. Разобраться наверное было бы не сложно, но в этом примере всё показано достаточно полно и понятно - всё заработало.
@lex
постоялец
 
Сообщения: 180
Зарегистрирован: 19.06.2006 13:16:29
Откуда: Невинномысск

Пред.

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 30

Рейтинг@Mail.ru