Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Технологии > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 14.06.2019, 14:39   #1
Fedia74
Пользователь
 
Регистрация: 24.03.2019
Сообщений: 24
По умолчанию [РЕШЕНО][Delphi] TLazSerial. программа отправляет в СОМ порт данные с промежутками в 200 и 1000 мс и переодически подвисает не на долго , а потом опять работает.

Здравствуйте

Прошу помощи разобраться в зависаниях проги , программа отправляет в СОМ порт данные с промежутками в 200 и 1000 мс и переодически подвисает не на долго , а потом опять работает. Причём на разных компах интервалы зависания разные, зависает только если подключена к СОМ порту .

Подскажите почему и как исправить.


Код:
uses
  Classes, LazSerial, Forms,StdCtrls, ExtCtrls, LazSynaSer,dos;

type

  { TForm1 }

  { TTenesi_Creator }

  TTenesi_Creator = class(TForm)
    ConBut: TButton;
    deviceList: TComboBox;
    Label1: TLabel;
    Label10: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label9: TLabel;
    Tenesi: TLazSerial;
    Timer1: TTimer;
    Timer2: TTimer;
    procedure ConButClick(Sender: TObject);
    procedure deviceListDropDown(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);

  private

  public

  end;

var
  Tenesi_Creator: TTenesi_Creator;
  ModeFly:byte;
  Bat,Lat,Lon,Alt,AltG,Cog,GPSVSI,Sat,Speed,VSI,Curs:double;
  Pitch,Roll:integer;


implementation

{$R *.lfm}

{ TForm1 }

procedure TTenesi_Creator.deviceListDropDown(Sender: TObject);
begin
 deviceList.Items.CommaText:=LazSynaSer.GetSerialPortNames;
end;

procedure TTenesi_Creator.FormCreate(Sender: TObject);
begin
end;

procedure TTenesi_Creator.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
 If Tenesi.Active then Tenesi.Close;
end;

procedure TTenesi_Creator.Timer1Timer(Sender: TObject);
Var comanda,s:string;
begin
 if Bat<21 then Bat:=25.2
           else bat:=bat-0.1;
 if Curs>360 then Curs:=Curs-360
             else Curs:=Curs+1;
 Lat:=56.1234567;
 Lon:=35.7654321;
 if alt>1000 then alt:=-100
             else alt:=alt+0.3;
 ModeFly:=2;
 VSI:=435.67;

 str(Pitch:4,s);          Label2.Caption:= 'Pit '+s;
 str(Roll:4,s);           Label9.Caption:= 'Rol '+s;
 str(Bat:2:2,s);          Label10.Caption:='Bat '+s;
 str(Lat:3:7,s);          Label6.Caption:= 'Lat '+s;
 str(Lon:3:7,s);          Label13.Caption:='Lon '+s;
 str(AltG:5:2,s);         Label5.Caption:= 'AlG '+s;
 str(Alt:5:2,s);          Label14.Caption:='Alt '+s;
 str(Curs:4:2,s);         Label15.Caption:='Crs '+s;
 str(Speed:4:2,s);        Label3.Caption:= 'Spe '+s;
 Label16.Caption:='Модель ПК A2';
 Label4.Caption:='Fly Mode GPS';

 Label1.Caption:='111111111111';
 if Tenesi.Active
  then
   begin
    Label1.Caption:='222222222222';
    Comanda:='PK_A2,';
    comanda:=comanda+'Mode: ';
    case ModeFly of
     0:comanda:=comanda+' MAN,';
     1:comanda:=comanda+' ATT,';
     2:comanda:=comanda+' GPS,';
    end;
    str(Bat:2:2,s);      comanda:=comanda+' Bat: '+s+#13#10;
    Tenesi.WriteData(Comanda);
    str(Lat:2:7,s);      comanda:='Lat: '+s+',';
    str(Lon:2:7,s);      comanda:=comanda+' Lon: '+s+',';
    str(AltG:4:2,s);     comanda:=comanda+'GPS alt: '+s+',';
    str(Cog:3:2,s);      comanda:=comanda+'COG: '+s+',';
    str(Speed:2:2,s);    comanda:=comanda+'Speed: '+s+',';
    str(GPSVSI:3:2,s);   comanda:=comanda+'GPS VSI: '+s+',';
    str(Sat:2:2,s);      comanda:=comanda+'Sat: '+s+#13#10;
    Tenesi.WriteData(Comanda);
    str(Alt:3:2,s);      comanda:='Alt: '+s+',';
    //str(VSI:3:0,s);      comanda:=comanda+'VSI: '+s+',';
    str(Curs:3:2,s);     comanda:=comanda+' Heading: '+s+#13#10;
    Label1.Caption:='333333333333';
    Tenesi.WriteData(Comanda);
    Label1.Caption:='444444444444';
   end;
 Label1.Caption:='555555555555';
end;

procedure TTenesi_Creator.Timer2Timer(Sender: TObject);
Var HH,MM,CC,KK:word;
    s,Comand:string;
begin
 Label1.Caption:='66666666666';
 GetTime(HH,MM,CC,KK);
 str(HH:2,s);
 Comand:='Date/Time: 05.07.19 '+s+':';
 str(MM:2,s);Comand:=Comand+s+':';
 str(CC:2,s);Comand:=Comand+s+#13#10;
 Label1.Caption:='77777777777';
 If Tenesi.Active then Tenesi.WriteData(Comand);
 Label1.Caption:='88888888888';
end;

//Выполняется по нажатию на кнопку Подключение Устройства 1
procedure TTenesi_Creator.ConButClick(Sender: TObject);
begin
 Tenesi.Device := deviceList.Text;
 Tenesi.BaudRate:= LazSerial.br115200;
 if Not Tenesi.Active  then Tenesi.Open
                    else Tenesi.Close;
 if Tenesi.Active
  then ConBut.Caption:='Отключить'
  Else ConBut.Caption:='Подключить';
end;

end.
Решение: https://www.programmersforum.ru/show...36#post1784736

Последний раз редактировалось Вадим Мошев; 18.06.2019 в 19:59.
Fedia74 вне форума Ответить с цитированием
Старый 14.06.2019, 16:36   #2
vexora_man
Пользователь
 
Регистрация: 14.05.2017
Сообщений: 29
По умолчанию

Код:
ByteSize     : Integer;
Parity       : TParityType; { TParityType = (NoneParity, OddParity, EvenParity); }
StopBits     : Integer;
Flags        : TSerialFlags; { TSerialFlags = set of (RtsCtsFlowControl); }
ковыряйся с этими параметрами

Пожалуйста, оформляйте Ваш код согласно правилам.

Последний раз редактировалось Вадим Мошев; 14.06.2019 в 22:10.
vexora_man вне форума Ответить с цитированием
Старый 14.06.2019, 16:57   #3
Fedia74
Пользователь
 
Регистрация: 24.03.2019
Сообщений: 24
По умолчанию

Дело в том что я новичок и только начал разбираться с библиотекой TLazSerial , если не сложно , можно поподробнее ??? ПЛИЗЗЗЗЗЗЗ ))))))))))).
Fedia74 вне форума Ответить с цитированием
Старый 14.06.2019, 17:00   #4
vexora_man
Пользователь
 
Регистрация: 14.05.2017
Сообщений: 29
По умолчанию

ну вам найдо узнать параметры rs232 того устройства которое вы подключаете через com-порт.
vexora_man вне форума Ответить с цитированием
Старый 14.06.2019, 17:34   #5
Fedia74
Пользователь
 
Регистрация: 24.03.2019
Сообщений: 24
По умолчанию

Как это сделать ? где его узнать ?

Перепробовал все параметры Parity , не помогло , всё равно подвисает.

А вот остальные параметры в Инспекторе обьектов LazSerial я не нашёл (((.

Дело в том что нормального описания библиотеки не могу найти .

Нашёл StopBit перепробовал все варианты не помогло.

Цитата:
Сообщение от vexora_man Посмотреть сообщение
ну вам найдо узнать параметры rs232 того устройства которое вы подключаете через com-порт.
Дело в том что нет устройства , я делаю связанные виртуальные порты и принимаю данные от этой проги , потом как я уже писал она виснет даже если её просто подключить к любому ком порту

Последний раз редактировалось Вадим Мошев; 18.06.2019 в 19:59.
Fedia74 вне форума Ответить с цитированием
Старый 14.06.2019, 17:57   #6
vexora_man
Пользователь
 
Регистрация: 14.05.2017
Сообщений: 29
По умолчанию

ну вот нужно параметры порта узнать и настривать его соответственно RTS CTS Flow Control и так далее, по умолчанию 8N1 стоит если про ByteSize,Parity,StopBits говорить
vexora_man вне форума Ответить с цитированием
Старый 14.06.2019, 18:10   #7
Fedia74
Пользователь
 
Регистрация: 24.03.2019
Сообщений: 24
По умолчанию

В этом плане всё настроено , как в конфиге настройки портов виндовс.

Выяснилась ещё одна закономерность , эта и другие проги которые работают с библиотекой LazSerial и подключённые к СОМ порту виснут в хаотическом порядке НО СТРОГО НА 30 СЕКУНД затем продолжают нормально работать .

И так после без сонной ночи )))))) решение было найдено!!!!!!!!

В инспекторе обьектов библиотеки LazSerial есть параметр Имя устройства.SynSer.DeadLockTimeOut по умолчанию эта пауза стоит 30000 мил сек , вот она и тормозила всё . Почему сразу не понял что она , этот параметр не прописывается из инспектора обьектов , по этому даже меняя его зависон оставался .
Нужно после открытия порта добавить строку
ИмяУстройства.SynSer.DeadLockTimeOu t:=100;
100 это задержка этой СМЕРТИ ))))) , так вот для моей проги 100 мил сек не заметно , я и поставил 100 . И О чудо всё заработало отлично !!!!! с 3 одновременно открытыми портами на приём и передачу .

Всем спасибо за помощь !!! ))))))))

РЕШЕНО.

Последний раз редактировалось Вадим Мошев; 18.06.2019 в 19:57.
Fedia74 вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[РЕШЕНО] Не работает программа hienZeit Помощь студентам 2 11.06.2019 00:13
Форма не отправляет данные Morgusha JavaScript, Ajax 2 16.05.2018 13:01
Подвисает программа на Delphi, которая считывает данные с COM-порта(весы), строит график SonicBob Помощь студентам 19 07.09.2011 03:08
Delphi. Можно ли отправить данные через порт открытый другой программой? losticsx Помощь студентам 2 24.08.2010 19:47
как из макроса передать управление пользователю, а потом опять макросу? Тупой Microsoft Office Excel 5 03.09.2009 23:01