Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2019, 20:27   #1
Alex711
Пользователь
 
Регистрация: 21.09.2018
Сообщений: 99
По умолчанию нет ли у кого нибудь рабочего примера(исходника) терминала для работы с COM-портом для Delphi7?

Здравствуйте, нет ли у кого нибудь рабочего примера(исходника) терминала для работы с COM-портом для Delphi7? Заранее благодарю!
Alex711 вне форума Ответить с цитированием
Старый 22.07.2019, 01:51   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Вас интересует какой-то конкретный терминал? Их много разных.
northener вне форума Ответить с цитированием
Старый 22.07.2019, 06:15   #3
Alex711
Пользователь
 
Регистрация: 21.09.2018
Сообщений: 99
По умолчанию

Пробовал BComPort вообще примеры не работают, CPortLib примеры работают через раз, точнее намного реже.
Alex711 вне форума Ответить с цитированием
Старый 22.07.2019, 11:56   #4
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Ariphm, ExtCtrls,DateUtils, AfDataDispatcher,
  AfComPort;

const
  wmCOMPORT=wm_User+11; {сообщение от порта}

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label7: TLabel;
    ComboBox1: TComboBox;
    Label8: TLabel;
    Memo1: TMemo;
    Timer1: TTimer;
    AfComPort1: TAfComPort;
    Memo2: TMemo;
    Memo3: TMemo;
    Memo4: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ComboBox1Select(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure AfComPort1DataRecived(Sender: TObject; Count: Integer);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  xb:byte;
  ab: array[1..1024] of byte;
  st,stcom:string;
  ttime,told:TDateTime;
  FlagCOM:boolean=False;
  FlagSend:boolean=False;
  tall:integer;
  ishodn125: Integer;
  ishodn_str : string;
  ASCIIsimvol: string;   // знак ASCII полученный из COM порта
implementation

{$R *.dfm}
{ **** UBPFD *********** by delphibase.endimus.com ****Преобразование набора чисел, предопределённых символом "#" в строку
Функция преобразует набор десятичных чисел кода символа по ASCII таблице.
Например, если AsciiString '#72#101#108#108#111', то Result = 'Hello'; }
function ASCIIToStr(AsciiString: string): string;
var
I, X, L, Lastpos: Integer;
CurDIGChar, CurrAddChar, RS: string;
begin
RESULT := '';
L := Length(AsciiString);
if L = 0 then
   Exit;
X := 0;
LASTPOS := 1;
repeat
   I := X;
   CurDIGChar := '';
   repeat
     I := I + 1;
     if AsciiString[I] <> '#' then
       CurDIGChar := CurDIGChar + AsciiString[I];
   until (AsciiString[I] = '#') or (i = l);
   X := I;
   if CurDIGChar <> '' then
   begin
     try
       CurrAddChar := CHR(STRTOINT(CurDIGChar));
     except CurrAddChar := '';
     end;
     Insert(CurrAddChar, RS, lastpos);
     LastPos := LastPos + Length(CurrAddChar);
   end;
until (X >= L) or (I >= L);
Result := RS;
end;

// Преобразование целого в двоичную строку и дополнение слева нулями до длины P
// Максимальное кол-во разрядов:P=8 количество бит в байте (нужно знать заранее)
function Int2Bin(const X: Integer; const P: Byte): string;
var
  ishodn125, Index: Integer;            //заменяю i на  ishodn125
begin
  
  //FillChar(Result[1], P, Ord('0')); //это было до исправления
  Result := StringOfChar('0', P); //исправление #5 DNK(Абитуриент)(спасибо ему)
                                  // http://expert.delphi.int.ru
  ishodn125:= X;

  for Index:= P downto 1 do
    begin
      if (ishodn125 and 1) <> 0
        then Result[Index]:= '1';
 
      ishodn125:= ishodn125 shr 1;
 
      if ishodn125 = 0
        then Break;
    end;
end;
procedure TForm1.AfComPort1DataRecived(Sender: TObject; Count: Integer);
{чтение очередного байта по сообщению wmCOMPORT}
var i:integer;
   dat: string;    // десятичный номер знака таблицы ASCII
   j: string;      // бинарное (8 знаков) изображение номера знака в  таблице ASCII
   //  ASCIIsimvol: string;   // знак ASCII полученный из COM порта
   data:integer;
begin
 if FlagCOM=False then exit; {если модем еще не опрошен}
 if count<>0 then {если что-то принято}
 begin
    {если порт существует}
    ttime:=Time; {фиксируем время прихода байта}
    if MilliSecondsBetween(told,ttime)>500 then {если больше полсекунды очищаем строку}
    st:='';
    AfComPort1.ReadData(ab,count); {читаем буфер}
    for i:=1 to count do
      dat:=IntToStr(ab[i]);
      st:=st+dat+' ';
    if Form1.Memo1.Lines.Count>65000 then Form1.Memo1.Lines.Clear;
    {больше 64К строк нельзя}

   // Form1.Memo3.Text:=dat  ;  // работает



    Form1.Memo1.Lines.Add(st); {десятичный номер знака в таблице ASCII}    //   работает
    data:=StrToInt(dat);
    ishodn_str:=IntToStr(data);
    j:=Int2Bin(data,8);//от уважаемого min@y™ expert.delphi.int.ru
    ASCIIsimvol:=ASCIIToStr(ishodn_str);
   //     Form1.Memo2.Text:=ishodn_str  ;      //   работает
  //   Form1.Memo2.Text:=ASCIIsimvol  ;     //   работает
  //  Form1.Memo2.Lines.Add(ASCIIsimvol);    //   работает
    if Form1.Memo2.Lines.Count>65000 then Form1.Memo2.Lines.Clear;
    {больше 64К строк нельзя}
    Form1.Memo4.Lines.Add(j);//{изображение бинарного 8 разрядного числа} 
    if Form1.Memo4.Lines.Count>65000 then Form1.Memo4.Lines.Clear;
    //Form1.Memo3.Lines[i] := Form1.Memo3.Lines[i] + str;
    //Form1.Memo3.Lines[data]:=Form1.Memo3.Lines[data]+'rty';; //
    //Form1.Memo3.Lines[j]+'rty'; //  IntToStr(Ord(i)     data:integer
    //  Memo3.Lines[0][StrToInt(dat)]:=dat;
    //  Memo3.Lines[0][StrToInt(dat)] := dat;
  //  Form1.Memo3.Text:='Предыдущий текст'+#13+#10+'Это уже новая строка'  ;


     //  Form1.Memo3.Lines.Add(ASCIIsimvol);//{выводим в Memo полученный знак таблицы ASCII}
   // if Form1.Memo3.Lines.Count>65000 then Form1.Memo3.Lines.Clear;
   told:=ttime; {для сравнения в следующий раз}
    if (SecondsBetween(told,ttime)<1) and FlagSend then {если это была посылка}
    begin
      FlagSend:=False;
      st:='';  {очищаем строку}
      Timer1.Enabled:=False; {выключаем таймер}
    end;
 end;
end;

procedure IniCOM;
var i, err :integer;
begin
  FlagCOM:=False;
  Form1.Label7.Caption:='COM?';
{инициализация COM - номер с строке stcom}
  Form1.AfComPort1.Close; {закрывем старый СОМ, если был}
  val(stcom[length(stcom)],i,err);
  if err=0 then  Form1.AfComPort1.ComNumber:=i else exit; {номер порта}
  Form1.AfComPort1.BaudRate:=br9600; {скорость 9600}
  try
    Form1.AfComPort1.Open;
  except
   if not Form1.AfComPort1.Active then {если не открылся}
   begin
      st:=stcom+' does not be present or occupied.';
      Application.MessageBox(Pchar(st),'Error',MB_OK);
      exit {выход из процедуры - неудача}
   end;
  end;
  ab[1]:=ord('A');  {будем посылать инициализацию модема}
  ab[2]:=ord('T');
  ab[3]:=13;{CR}
  ab[4]:=10;{LF}
  for i:=1 to 4 do Form1.AfComPort1.WriteData(ab[i],1); {ответ не сразу}
  Form1.Timer1.Enabled:=True;
  tall:=0;
  while tall<1 do application.ProcessMessages; {пауза в 1 с}
  Form1.Timer1.Enabled:=False;
  st:=Form1.AfComPort1.ReadString; {ответ модема 10 знаков}
  if pos('OK',st)<>0 then  {модем}
  begin
       st:=stcom+' занят модемом';
       Form1.Timer1.Enabled:=False;
       Application.MessageBox(Pchar(st),'Error',MB_OK);
       exit;
  end else  {все нормально, открывaем СОМ}
  begin
       Form1.Label7.Caption:=stcom+' 9600';
       st:=''; {очищаем строку для вывода}
       FlagCOM:=True;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin    {запрос}
  if FlagCOM=False then exit;
  {если порт еще не инициализирован - выход}
  AfComPort1.PurgeRX; {очищаем буфер на всякий случай}
  xb:=125;
  AfComPort1.WriteData(xb,1); {посылаем команжу}
  st:='Послано: '+IntToStr(xb); //hex -вывод HEX чисел, chr -символы( кроме нуля!!! "0",IntToStr - десятичные
  Form1.Memo1.Lines.Add(st); {записали в Memo}
  Form1.Memo2.Lines.Add(st); {записали в Memo}
  st:=''; {очистили строку}

  told:=Time; {зафиксировали момент посылки}
  FlagSend:=True; {обозначаем посылку}
  Timer1.Enabled:=True;  {запускаем таймер}
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
{инициализация COM1 при запуске}
  stcom:='COM1';
  IniCOM;
end;

procedure TForm1.ComboBox1Select(Sender: TObject);
begin
  stcom:=ComboBox1.Text;  {устанавливаем порт COM1,2,3,4}
  IniCOM;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin   {таймер на ошибку}
  ttime:=Time;
  inc(tall);
  if FlagCOM=False then exit;{запрос модема}
  if SecondsBetween(told,ttime)>1 then {если через две секунды ничего нет}
  begin
   Timer1.Enabled:=False;
   FlagSend:=False;
   Application.MessageBox('Устройство не обнаружено','Error',MB_OK);
  end;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  AfComPort1.Close; {закрыие порта}
end;

end.
Репутация: полный "0"
zvygin1964 вне форума Ответить с цитированием
Старый 22.07.2019, 12:03   #5
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию

Не влезло:
Вложения
Тип файла: 7z COMproba.7z (163.2 Кб, 47 просмотров)
Репутация: полный "0"
zvygin1964 вне форума Ответить с цитированием
Старый 22.07.2019, 19:42   #6
Alex711
Пользователь
 
Регистрация: 21.09.2018
Сообщений: 99
По умолчанию

Цитата:
Сообщение от zvygin1964 Посмотреть сообщение
Не влезло:
Спасибо, только скорость порта ни настроить, а устройство работает на 2400
Alex711 вне форума Ответить с цитированием
Старый 23.07.2019, 01:47   #7
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,859
По умолчанию

Цитата:
Сообщение от Alex711 Посмотреть сообщение
Спасибо, только скорость порта ни настроить
Это почему? Уж что-что а настройка параметров СОМ-порта никогда не вызывала проблем.
northener вне форума Ответить с цитированием
Старый 25.07.2019, 21:21   #8
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,239
По умолчанию

тут скорость
Код:
Form1.AfComPort1.BaudRate:=br9600; {скорость 9600}
Alter вне форума Ответить с цитированием
Старый 31.07.2019, 20:25   #9
Alex711
Пользователь
 
Регистрация: 21.09.2018
Сообщений: 99
По умолчанию

Здравствуйте, собрал, изменил скорость, только как мне отправить не 125 а Q1?
Alex711 вне форума Ответить с цитированием
Старый 31.07.2019, 20:30   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

А выше глаза не поднимаются?
Код:
  ab[1]:=ord('Q');  {будем посылать инициализацию модема}
  ab[2]:=ord('1');
  for i:=1 to 2 do Form1.AfComPort1.WriteData(ab[i],1); {ответ не сразу}
p51x на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Описание примера из delphi7 NetChat Illusiony Работа с сетью в Delphi 6 21.10.2015 19:08
Интервью у кого-нибудь из форумчан. New man Свободное общение 3 30.09.2014 22:16
Реализация терминала/консоли на вебсайте, средствами SCREEN сессий/виртуального терминала TonoLb Фриланс 1 25.10.2012 22:54
У кого-нибудь есть IdSSLIntercept.dcu? O'NeiLL Компоненты Delphi 2 04.04.2012 19:27
У кого нибудь есть БД? Verwolf Помощь студентам 9 02.06.2011 22:31