Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
 Аватар для Protosha
2 / 2 / 1
Регистрация: 08.02.2012
Сообщений: 76

DMX сигнал отображается не весь

03.06.2014, 09:02. Показов 1326. Ответов 3
Метки нет (Все метки)

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

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

Ну а теперь моё программное решение:
Мне необходимо принимать все 512 байт так, чтобы каждый находился в своей ячейке. Для приёма сигнала использую компонент BComPort, код программы прилагаю:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
unit protoncode;
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, BCPort, Vcl.Grids;
 
type
  TMainForm = class(TForm)
    Panel1: TPanel;
    cbPort: TComboBox;
    btnConnect: TButton;
    btnDisconnect: TButton;
    BComPort1: TBComPort;
    Memo: TMemo;
    Button1: TButton;
    StringGrid1: TStringGrid;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btnConnectClick(Sender: TObject);
    procedure btnDisconnectClick(Sender: TObject);
    procedure btnSendClick(Sender: TObject);
    procedure BComPort1RxChar(Sender: TObject; Count: Integer);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
  end;
 
var
  MainForm: TMainForm;
 
implementation
 
{$R *.DFM}
 
function HexToAsc(strData:string): string;
var sresult:string; sfinal:string; hexc:cardinal; i:integer;
begin
 i:=1;
 while i<=length(strData) do
begin
 hexc := strtoint('$' + copy(strData,i,2));
 sresult := inttostr(hexc);
 sresult := chr(strtoint(sresult));
 sfinal := sfinal + sresult;
 i:=i+2;
end;
 result := sfinal
end;
 
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]), 1);
  end;
  Result := s;
end;
 
function StrToHex(source: String): String;
var i:integer;
    c:Char;
    s:String;
begin
    s := '';
    for i:=1 to 512  do    //  512  * 10 / 16 = 320         Length(source)
    begin
      c := source[i];
      s := s +  IntToHex(Integer(c),2); //  +' '
    end;
    result := s;
end;
 
procedure TMainForm.FormCreate(Sender: TObject);
begin
  EnumComPorts(cbPort.Items);
  cbPort.ItemIndex := 1;
end;
 
procedure TMainForm.btnConnectClick(Sender: TObject);
begin
  BComPort1.Port := cbPort.Text;
  if BComPort1.Open then
  begin
    btnConnect.Enabled := False;
    cbPort.Enabled := False;
    btnDisconnect.Enabled := True;
    end;
end;
 
procedure TMainForm.btnDisconnectClick(Sender: TObject);
begin
  if BComPort1.Close then
  begin
    btnConnect.Enabled := True;
    cbPort.Enabled := True;
    btnDisconnect.Enabled := False;
   end;
end;
 
procedure TMainForm.btnSendClick(Sender: TObject);
begin
  if BComPort1.Connected then
  begin
  end;
end;
 
procedure TMainForm.Button1Click(Sender: TObject);
begin
  Memo.Clear;
end;
 
procedure TMainForm.Button2Click(Sender: TObject);
var row,col ,r,i: integer;
    N: String;
begin
 N:= Memo.Text;
    StringGrid1.ColCount:= 15;  // устанавливаем кол-во ячеек в строке
    StringGrid1.RowCount:= 50;  // устанавливаем кол-во ячеек в столбце
   r:=0;
   row:=0;
   col:=0;
    Button2.Caption:= IntToStr(Length(N));
  While i <= Length(N)-1 do  // пока i меньше либо равно длине строки
      begin
       StringGrid1.Cells[col,row]:=N[r+1]+N[r+2];  //записываем по 2 символа в каждую ячейку StringGrid
       col:= col+1;
        if (col mod 15) = 0 then
           begin
            row:= row+1;
            col:= 0;
           end;
       inc(i); // переходим к следующей позиции (+1)
       r:=r+2;   // набавляем сдвиг по символам
      end;
 
  end;
 
procedure TMainForm.BComPort1RxChar(Sender: TObject; Count: Integer);
var
  S: String;
begin
  BComPort1.ReadStr(S, Count);
  Memo.Text := StrToHex(S);
end;
end.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.06.2014, 09:02
Ответы с готовыми решениями:

как правильно принять DMX сигнал на Attiny?
Здравствуйте, друзья. Возникла необходимость создания светодиодного RGBW диммера/стробоскопа, управляемого по протоколу DMX. Светодиоды...

Не отображается весь товар в категории
Добрый день! Бьюсь над этим вопросом уже неделю, изрыл весь интернет. Ситуация такая. Создал интернет магазин на движке wordpress все...

Не отображается на сайте весь текст
Добрый день. Возникла одна проблема. На сайте не отоброжается весь текст (раздел объявления). Текст сначала набираю в worde затем копирую...

3
 Аватар для Protosha
2 / 2 / 1
Регистрация: 08.02.2012
Сообщений: 76
07.06.2014, 19:15  [ТС]
Неужели ни у кого нет соображений по этому поводу? Хоть подсказоньку дайте.
0
Пишу на Delphi...иногда
 Аватар для cotseec
1423 / 1278 / 286
Регистрация: 03.12.2012
Сообщений: 3,914
Записей в блоге: 5
07.06.2014, 19:34
Цитата Сообщение от Protosha Посмотреть сообщение
Мне необходимо принимать все 512 байт так
принимаете как строку
Delphi
1
2
3
4
5
var
  S: String;
begin
  BComPort1.ReadStr(S, Count);
....
вполне возможно где-то в недрах метода получения строки (тип string) используемого компонента берется PChar от пришедшей посылки (указателя на начало массива пришедших байт), т.к. судя по всему протокол общения не является текстовым, то проскакивает байт со значением $00, что для PChar является концом строки и на выходе "обрезанная" строка
используйте не чтение строки, а чтение в буфер (или что там есть у используемого компонента), тем более в дальнейшем работаете как с массивом байт

Добавлено через 2 минуты
из документации: используемый компонент имеет замечательный метод
Delphi
1
function Read(var Buffer; Count: Integer): Integer;
0
 Аватар для raxper
10237 / 6615 / 498
Регистрация: 28.12.2010
Сообщений: 21,154
Записей в блоге: 1
07.06.2014, 21:39
вполне возможно где-то в недрах метода получения строки (тип string) используемого компонента берется PChar от пришедшей посылки (указателя на начало массива пришедших байт), т.к. судя по всему протокол общения не является текстовым, то проскакивает байт со значением $00
благополучно осуществляю прием данных, в том числе с нулем. Нет, в кишках pchar не используется, везде только string.

имеет замечательный метод
работает одинаково хорошо.

to TC:
1- вы ограничились 512 байтами при переводе. Замените:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function StringHandling(const Value: String; cbMHex: boolean): String;
var
  N: Integer;
begin
  if cbMHex then
  // Если требуется отображать данные в HEX, конвертируем их
  begin
    Result := '';
    for N := 1 to Length(Value) do
      Result := Result + IntToHex(Ord(Value[N]), 2) + ' ';
  end else
  // Если требуется отображать данные в символьном виде
  begin
      Result := Value;
    // Непечатные символы заменяются на "."
    for N := 1 to Length(Result) do
      if Result[N] < ' ' then Result[N] := '.';
  end;
end;
Но это мелочи.

2- и мы с вами уже это обсуждали - вы по-прежнему дергаете из потока приема VCL-ными компонентами для визуализации. Это приводит и к подвисанию и может даже привести к пропускам данных. Выводы не сделаны, хотя тут вы и не накапливаете пакет, как в коде на программерсе. Создайте отдельный поток для визуализации.

3- у вас нет обработки склеенных пакетов.

p.s.: на скольки еще форумах вы дублируете тему?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.06.2014, 21:39
Помогаю со студенческими работами здесь

Не отображается весь объем ОЗУ
Вообщем ситуация такая что на ноуте установлено 8гб ОЗУ а отображает только 6,94(в Компьютер-&gt;свойства) и 7103 в диспетчере задач на...

В среде программирования весь текст отображается курсивом
у меня такая проблема у pascalabc все курсивным шрифтом как ее решить!!!

Проблема с RichTextbox (весь текст отображается в столбик)
Следующий код: rtfLog.text = fMainForm.rtfLog.text + Str(Now()) + '&gt;' + NewMessage + vbCrLf rtfLog.SelStart =...

Как определить, что не весь текст отображается в textBox?
Необходимо для textbox'a добавить всплывающую подсказку с его текстом, если весь текст не видно, как это работает в DataGridView по...

В модальном окне отображается весь сайт после отправки формы
Есть сайт, потихоньку собираю. Сайт на латышском языке. Ситуация след.: Есть форма обратной связи. Которая вызывается по клику....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru