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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2015, 09:15   #11
CHEburaschka
 
Регистрация: 02.04.2015
Сообщений: 9
По умолчанию

Программа заработала, но есть проблема.
После 30 секунд работы программы, считывание данных прекращается и такое впечатление, что связь с устройством рвётся.
Судя по логу, каждый раз на 1910 итерации из прочитанного массива выпадает 2 элемента, а ещё через 20 итераций считывание данных полностью прекращается.
Думал, что может дело в настройках таймера и 1мс - это слишком маленький интервал, но видимо дело не в нём, поскольку увеличение до 5мс не влияет на время работы программы и первая ошибка также возникает на 1910 шагу.

В чём тут может быть дело?

Лог (конец):

0 0 255 255 129 186 126 159 127 36 127 244 119 116 127 155 126 217
0 0 255 255 128 192 127 71 127 78 127 244 117 68 127 157 126 225
0 0 255 255 129 202 126 156 127 19 127 242 119 120 127 155 126 224
0 0 255 255 128 176 127 67 127 76 127 241 117 58 127 157 126 225
0 0 255 255 130 42 126 142 127 32 127 242 119 181 127 156 126 222
0 0 255 255 128 254 127 80 127 85 127 243 117 145 127 155 126 218
0 0 255 255 129 245 126 164 127 34 127 242 119 159 127 155 126 227
0 0 255 255 129 31 127 82 127 83 127 239 117 156 127 155 126 219
0 0 255 255 129 213 126 179 127 35 127 244 119 132 127 154 126 221
0 0 255 255 129 131 127 101 127 86 127 243 117 240 127 155 126 220
0 0 255 255 130 138 126 178 127 42 127 242 120 35 127 155 126 212
0 0 255 255 129 237 127 101 127 102 127 243 118 98 127 157 126 222
0 0 255 255 131 29 126 188 127 47 127 242 120 180 127 154 126 225
0 0 255 255 130 64 127 127 127 96 127 241 118 145 127 158 126 220
0 0 255 255 131 28 127 231 127 127 127 245 120 178 127 155 126 225
0 0 255 255 129 221 125 233 126 232 127 243 118 95 127 156 0 0 - выпало 2 элемента и массив сместился
255 255 130 162 128 47 127 138 127 237 120 123 127 156 126 224 126 224
0 0 255 255 131 68 127 7 127 67 127 240 121 29 127 157 126 219
0 0 255 255 131 68 127 7 127 67 127 240 121 29 127 157 0 0
255 255 130 237 125 183 126 232 127 242 119 114 127 155 126 224 126 224
0 0 255 255 130 135 126 96 127 6 127 244 119 49 127 156 126 224
0 0 255 255 130 135 126 96 127 6 127 244 119 49 127 156 0 0
255 255 131 4 128 192 127 174 127 243 119 148 127 155 126 224 0 0
255 255 131 4 128 192 127 174 127 243 119 148 127 155 0 0 255 255
131 14 126 140 127 18 127 240 119 182 127 156 126 230 0 0 255 255
131 14 126 140 127 18 127 240 119 182 127 156 0 0 255 255 133 17
127 223 127 114 127 242 122 172 127 155 126 222 0 0 255 255 133 17
127 223 127 114 127 242 122 172 127 155 0 0 255 255 131 139 126 191
127 33 127 241 120 78 127 155 126 230 126 230 0 0 255 255 132 220
126 183 127 23 127 241 122 171 127 156 126 226 0 0 255 255 132 220
126 183 127 23 127 241 122 171 127 156 0 0 255 255 132 244 128 253
127 189 127 242 122 238 127 157 126 216 0 0 255 255 132 244 128 253
127 189 127 242 122 238 127 157 0 0 255 255 132 26 126 10 126 231
127 242 120 247 127 154 126 226 0 0 255 255 132 26 126 10 126 231
127 242 120 247 127 154 0 0 255 255 133 140 128 33 127 139 127 241
123 120 127 156 126 221 0 0 0 0 0 0 0 0 0 0 0 0 (считывание прекратилось)
CHEburaschka вне форума Ответить с цитированием
Старый 21.05.2015, 09:16   #12
CHEburaschka
 
Регистрация: 02.04.2015
Сообщений: 9
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Memo1: TMemo;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
    Form1: TForm1;
    f: THandle;
    ct: TCommTimeouts;
    dcb: TDCB;
    result1: boolean;
    result2: cardinal;
    result3: integer;
    result4: integer;
    i: cardinal;
    p: char;
    j: integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject); //открыть порт

begin
  f := Windows.CreateFile(PChar('COM4'), GENERIC_READ or
                              GENERIC_WRITE,
                              FILE_SHARE_READ or FILE_SHARE_WRITE,
                              nil, OPEN_EXISTING,
                              FILE_ATTRIBUTE_NORMAL, 0);
  if (f < 0) or not Windows.SetupComm(f, 2048, 2048)or not
      Windows.GetCommState(f, dcb) then exit; //init error

  dcb.BaudRate := 9600;
  //dcb.StopBits := стоп-биты;
  //dcb.Parity := четность;
  dcb.ByteSize := 8;
  if not Windows.SetCommState(f, dcb)
  or not Windows.GetCommTimeouts(f, ct) then exit; //error
  ct.ReadTotalTimeoutConstant := 50;
  ct.ReadIntervalTimeout := 50;
  ct.ReadTotalTimeoutMultiplier := 1;
  ct.WriteTotalTimeoutMultiplier := 0;
  ct.WriteTotalTimeoutConstant := 10;
  if not Windows.SetCommTimeouts(f, ct)
  or not Windows.SetCommMask(f, EV_RING + EV_RXCHAR + EV_RXFLAG + EV_TXEMPTY)
then exit; //error
  result1 := true;
end;

procedure TForm1.Button2Click(Sender: TObject);   //закpыть поpт
begin
Windows.CloseHandle(f);
end;

procedure TForm1.Button3Click(Sender: TObject); //включение передачи данных с устройства
begin
  p := chr($B);
  WriteFile(f, p, 1, i, nil);
end;


procedure TForm1.Button4Click(Sender: TObject); //выключение передачи данных с устройства
begin
  p := chr($63);
  WriteFile(f, p, 1, i, nil);
end;


procedure TForm1.Button4Click(Sender: TObject); //пеpедача команды остановки в поpт
begin
  p := chr($10);
  WriteFile(f, p, 1, i, nil);
end;


procedure TForm1.Timer1Timer(Sender: TObject); //вывод данных в memo1
var
  MyBuff: array[0..17] of byte; //буфер для чтения данных
  ByteReaded: cardinal; //количество считанных байт
  Str: string; //вспомогательная строка
  Status: DWord; //статус устройства
  k: integer;
begin {QueryPort}
  //получим статус COM-порта устройства
  if not GetCommModemStatus(f, Status) then
  begin {ошибка при получении статуса устройства}
    //ошибка, все выключаем и выходим
    SysErrorMessage(GetLastError);
    Exit;
  end; {ошибка при получении статуса устройства}
  //читаем буфер из Com-порта
  FillChar(MyBuff, SizeOf(MyBuff), #0);
  if not ReadFile(f, MyBuff, SizeOf(MyBuff), ByteReaded, nil) then
  begin {ошибка при чтении данных}
    //ошибка, все закрываем и уходим
    SysErrorMessage(GetLastError);
    Exit;
  end; {ошибка при чтении данных}
  //данные пришли
  if ByteReaded > 0 then
  begin {Печать в memo1}
    //отправляем строку на просмотр
    for k := 1 to Length(MyBuff) do  begin
    Str := Str + ' ' + inttostr(Ord(MyBuff[k-1]));
    end;
    Memo1.Lines.Add(Str);
  end; {Печать в memo1}
end; {QueryPort}
end.

Последний раз редактировалось CHEburaschka; 21.05.2015 в 09:18.
CHEburaschka вне форума Ответить с цитированием
Старый 21.05.2015, 09:24   #13
CHEburaschka
 
Регистрация: 02.04.2015
Сообщений: 9
По умолчанию

И ещё... Пробовал остановить программу на 1908 шагу и вручную, пошагово прогнать её до 1911 итерации. В этом случае ошибок не возникает и массив считывается корректно.
CHEburaschka вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мгновенное чтение и вывод данных Parallelogram JavaScript, Ajax 2 08.04.2014 10:03
Дикий тупняк - чтение данных с com порта. GMX Компоненты Delphi 8 26.03.2014 15:39
Delphi.Чтение файла в Memo, вычисление, добавление строк в Memo antonio_sk Помощь студентам 0 26.04.2013 18:01
Вывод и чтение данных Joker_vad Общие вопросы Delphi 3 30.03.2013 16:03
Чтение данных с COM порта 232 Dimitr_88 Общие вопросы C/C++ 10 03.09.2010 10:39