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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.06.2014, 09:40   #1
ProtonFox
 
Регистрация: 12.11.2012
Сообщений: 7
Восклицание DMX сигнал отображается не весь

Здравствуйте, уважаемые форумчане!
Есть устройство - источник DMX сигналов, после стоит RS485-USB преобразователь, с помощью которого данные передаются в виртуальный COM-порт компьютера. При приёме DMX сигнала столкнулся с проблемой отображения байт. Должно приходить 512 байт (каждый отображается как FE, 7A и т.д.), скорость передачи довольно-таки высокая (чтобы не приходил хлам приходится ставить максимальную скорость COM-порта - 256000 бит/с), соединительный кабель короткий. При подаче устройством DMX одинаковых байт на все 512 адресов, моя программа отображает динамическое изменение сигнала с каждым нажатием на устройство, хотя отображает лишь часть информации, но если отсылать данные по адресам отдельно, то программа не воспринимает эти данные. С DMX передатчиком всё в порядке, всё отображается, как надо, если пользоваться программой terminal для COM-порта, единственное что напрягает в этой программе -подвисание при работе на такой скорости.

Вопрос: как мне обрабатывать эти байты и принимать в первоначальном виде (числами от 0 до 255 - желательно, но необязательно)?

Ну а теперь моё программное решение:
Мне необходимо принимать все 512 байт так, чтобы каждый находился в своей ячейке. Для приёма сигнала использую компонент BComPort, код программы прилагаю:
Код:
unit pas;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, BCPort;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Timer1: TTimer;
    BComPort1: TBComPort;
    ComboBox1: TComboBox;
    ConnectBut: TButton;
    ComboBox2: TComboBox;
    DisconnectBut: TButton;
    procedure Timer1Timer(Sender: TObject);
    procedure BComPort1RxChar(Sender: TObject; Count: Integer);
    procedure ConnectButClick(Sender: TObject);
    procedure DisconnectButClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function StringtoHex(Data: string): string;
var
  i, i2: Integer;
  s: string;
begin
  i2 := 1;
  for i := 1 to Length(Data) do
  begin
    Inc(i2);
    if i2 = 2 then
    begin
      s  := s + ' ';
      i2 := 1;
    end;
    s := s + IntToHex(Ord(Data[i]), 2);
  end;
Result := s;
end;

procedure TForm1.BComPort1RxChar(Sender: TObject; Count: Integer);
var
  Fail: String;
begin
  BComPort1.ReadStr(Fail, Count);
  Fail := Fail + #10;
  Memo1.Text := Memo1.Text + StringtoHex(Fail);
end;

procedure TForm1.ConnectButClick(Sender: TObject);
begin
    BComPort1.Port:= ComboBox1.Text;
 //  BComPort1.BaudRate := TBaudRate(ComboBox2.ItemIndex);
   if BComPort1.Open then
  begin

  end;
end;

procedure TForm1.DisconnectButClick(Sender: TObject);
begin
  if BComPort1.Close then
  begin

  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
 var hComm: THandle;
     i: Integer;
begin
     ComboBox1.Clear;
     ComboBox2.ItemIndex := 6;
 for i:= 1 to 16 do
begin
 try
     hComm:= CreateFile(PChar('\\.\COM'+IntToStr(i)), GENERIC_READ or GENERIC_WRITE,
                              0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
 if  hComm <> INVALID_HANDLE_VALUE then
begin
     ComboBox1.Items.Add('COM'+IntToStr(i));
     CloseHandle(hComm);
     ComboBox1.ItemIndex:= 0;
end;
  except
end;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Memo1.Clear;
end;

end.
ProtonFox вне форума Ответить с цитированием
Старый 03.06.2014, 16:38   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
скорость передачи довольно-таки высокая (чтобы не приходил хлам приходится ставить максимальную скорость COM-порта - 256000 бит/с
1- скорость отнюдь невысокая.
2- чтобы хлам не приходил, контролируйте CRC
3- что значит приходится? На передатчике и приемнике скорости равны должны быть.

Цитата:
столкнулся с проблемой отображения байт
неудивительно. Смотрим код:
Код:
var
  Fail: String;
begin
  BComPort1.ReadStr(Fail, Count);
  Fail := Fail + #10;
  Memo1.Text := Memo1.Text + StringtoHex(Fail);
end;
1- нет проверки на склеенные пакеты
2- отображение из потока приема идет сразу в VCL компонент без буферизации
3- данные накапливаются и накапливаются в визуальном компоненте, память отжирается и отжирается

Да за один вывод из потока приема непоредственно в визуальный VCL по рукам вам надавать, а лучше в тиски. Принятые данные передавайте в отдельный поток, коотрый и пусть занимается обработкой и визуализацией. В сам же визуальный модуль лучше выводить последние, ну тысячу байт, а все принятые данные лучше писать на диск, в файл дозаписывать как и положено при архивации трендов.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 03.06.2014, 18:21   #3
ProtonFox
 
Регистрация: 12.11.2012
Сообщений: 7
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
1- скорость отнюдь невысокая.
Это да, но винда и компонент не позволяют выставлять что-то большее.

Цитата:
Сообщение от raxp Посмотреть сообщение
нет проверки на склеенные пакеты
А может быть вы подскажите, как это осуществляется?

А по поводу потоков, так ни один пример из тех, что в сети нормально не заработал. Хотелось бы программу, которая не будет зависеть ничем от ОС (будь то XP или 8.1). Помогите с реально рабочим примером с потоками и буферизацией, желательно с комментариями, хочется разобраться.
ProtonFox вне форума Ответить с цитированием
Старый 03.06.2014, 18:55   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
Это да, но винда и компонент не позволяют выставлять что-то большее.
не мелите ерунды, у меня спокойненько работает промсеть через FTDI конвертор USB/RS-485 на скорости 921 бит/сек и даже 2 мегабода по виртуальному COM-порту. И к слову, на BComPort обертке.

Цитата:
А может быть вы подскажите, как это осуществляется?
про работу с потоками есть даже на этом форуме, и рабочее.

Про склеенные пакеты http://programmersforum.ru/showpost....31&postcount=4
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 03.06.2014, 23:13   #5
ProtonFox
 
Регистрация: 12.11.2012
Сообщений: 7
По умолчанию

Большое спасибо! )
ProtonFox вне форума Ответить с цитированием
Старый 04.06.2014, 07:41   #6
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

нема за що.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Звуковой сигнал (писк) aank10 Общие вопросы C/C++ 2 05.05.2011 11:37
Сайт не отображается в IE и Opera. Отображается только в FireFox. Roman_K HTML и CSS 3 03.02.2011 22:32
Прочитать сигнал с микрофона Impuls1989 Общие вопросы C/C++ 0 22.06.2010 19:35
Звуковой сигнал Eugenio Microsoft Office Excel 9 18.03.2009 17:24
сигнал WindowsBeep ben95 Общие вопросы Delphi 8 13.05.2008 19:12