Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
2 / 2 / 6
Регистрация: 11.06.2013
Сообщений: 170
1

Отправка данных через COM-порт

11.12.2014, 14:24. Просмотров 3105. Ответов 3
Метки нет (Все метки)

Добрый день.
Знаю что эта тема 1000 раз обсуждалась и есть куча тем ,но я не смогла найти то что мне нужно.
есть датчик подключенный по ком порту к компьютеру.
на него нужно отправлять через делфи определенные значения в 16й СИ, это у меня получается ,если я руками напишу все значения и отправляю их через ком порт.
но мне нужно это делать допустим из едита , т.е ввели число в 10й СИ ,а отправили на датчик в 16.
вообщем перевод из одной СИ в другую я сделала.
а вот не могу понять как добавить к определенному набору байт,которые обозначают адресс прибора и т.д ,мои цифры переведенные в 16 СИ.
Подскажите как поправить код .
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, CPort, ExtCtrls;
 
type
  TForm1 = class(TForm)
    ComPort1: TComPort;
    Button1: TButton;
    Memo1: TMemo;
    Edit1: TEdit;
    Button2: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject;adr: byte);
    procedure FormCreate(Sender: TObject);
    procedure ComPort1RxChar(Sender: TObject; Count: Integer);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  N, R: integer;
  Bin: string;
 
implementation
 
{$R *.dfm}
 Function crc16 (DATA : Array of BYTE): Word;       //CRC16
Var
R1: WORD;
n,i,j: integer;
begin
{                                     Алгоритм генерации CRC:
    1. 16-ти битовый регистр загружается числом FF hex (все 1), и используется далее как регистр CRC.
    2. Первый байт сообщения складывается по ИСКЛЮЧАЮЩЕМУ ИЛИ с содержимым регистра CRC. Результат помещается в регистр CRC.
    3. Регистр CRC сдвигается вправо(в направлении младшего бита) на 1 бит, старший бит заполняется 0.
    4. (Если младший бит 0): Повторяется шаг 3 (сдвиг)
    (Если младший бит 1): Делается операция ИСКЛЮЧАЮЩЕЕ ИЛИ регистра CRC и полиномиального числа A001 hex.
    5. Шаги 3 и 4 повторяются восемь раз.
    6. Повторяются шаги со 2 по 5 для следующего сообщения. Это повторяется до тех пор пока все байты сообщения не будут обработаны.
    7. Финальное содержание регистра CRC и есть контрольная сумма.
}
  R1:=$FFFF;
  n:=0;
  n:=length(DATA);
  for i:=0 to n-1 do
  begin
    R1 := DATA[i] xor (R1);
  for j:=0 to 7 do
    if (R1 and 1)=1 then
      begin
      R1:=R1 shr 1;
      R1:=R1 xor $A001;
      end
    else
      begin
      R1 := R1 shr 1;
      end;
  end;
  Result:=R1;
end;
procedure TForm1.Button1Click(Sender: TObject;adr: byte);
//const WriteData : Array [0..17] of Byte =($23,$48,$47,$47,$49,$4e,$47,$54,$47,$47,$47,$47,$47,$4d,$4a,$49,$53,$0d);
 const WriteData : Array [0..6]of Byte =($64,$10,$00,$19,$00,$01,$02); // рабочий способ , при перечеслении всех байт данных.
 var CRC: Word; //  WriteData : Array [0..7] of Byte;
begin
  WriteData[0]:= $64; //  адрес прибора
  WriteData[1]:= $10; //  функция 10 - запись регистра
  WriteData[2]:= $00; // 
  WriteData[3]:= $19; //  номер первого регистра
  WriteData[4]:= $00; //  
  WriteData[5]:= $01; //  кол-во регистров
  WriteData[6]:= $02; //  кол-во  байт
  WriteData[7]:=StrToInt( bin); //  младшая часть адреса регистра
 
Comport1.Write(@WriteData,8);
 //Comport1.Write(100);
CRC := CRC16(WriteData);
  ComPort1.Write(@CRC,2);
 
 
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  N := StrToInt(Edit1.Text);
  Label1.Caption := '';
  Bin := ' ';
  while N>0 Do
  begin
    R:=N mod 16;
    N:=N div 16;
    case R of
      0..9 : Bin := IntToStr(R) + Bin;
      10   : Bin := 'A' + Bin;
      11   : Bin := 'B' + Bin;
      12   : Bin := 'C' + Bin;
      13   : Bin := 'D' + Bin;
      14   : Bin := 'E' + Bin;
      15   : Bin := 'F' + Bin;
    end
  end;
  Label1.Caption := Bin;
end;
 
procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
 var
str:AnsiString;
begin
ComPort1.readstr(str,Count);
Memo1.Text:= Memo1.Text+str;
 
end;
 
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   ComPort1.Close;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
 
begin
ComPort1.Open;
 
end;
 
 
 
end.
Добавлено через 5 часов 24 минуты
up
никто помочь не может?(
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.12.2014, 14:24
Ответы с готовыми решениями:

Передача данных через Com порт
Добрый день форумчане! Мне с помощью программы "free-serial-port-monitor" удалось считал данные,...

Передача и приём данных через COM порт
Задача такая, нужно через ком порт передавать и принимать пачки байтов, всё это по протоколу modbus...

Прием данных через USB порт
кто-нить может подсказать компоненты для работы с USB из Delphi, если точнее нужно считывание...

Отправка и прием данных через порты
вопрос собственно вот в чем, имеются 3 программки, 1 отвечает за прием данных она используется в...

3
пофигист широкого профиля
4207 / 2741 / 779
Регистрация: 15.07.2013
Сообщений: 15,931
11.12.2014, 15:30 2
Цитата Сообщение от Виктория1992 Посмотреть сообщение
на него нужно отправлять через делфи определенные значения в 16й СИ
Нет там никакой шестнадцатой СИ
Delphi
1
WriteData[7]:=StrToInt(Edit1.Text);
0
0 / 0 / 0
Регистрация: 12.02.2014
Сообщений: 35
11.12.2014, 17:05 3
Виктория1992, 16 СИ больше для удобства чаще всего используется, если например в инструкции так написаны адреса, а нужно отладить быстренько. Вот и пишишь в 16 СИ, чтобы не заморачиваться.
0
2 / 2 / 6
Регистрация: 11.06.2013
Сообщений: 170
12.12.2014, 14:39  [ТС] 4
спасибо за помощь ,я сама разобралась уже ))
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.12.2014, 14:39

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Подключение/чтение/отправка данных на сторонние устройства через usb COM порт
сабж: как подключить к андроид устройству сторонние девайсы по COM порту и впоследствии...

Отправка данных в COM порт
Доброго дня, ребята, прошу мне помочь с лабой. Надо написать программу которая открывает и...

Отправка запроса на прибор через сом-порт
Имеется прибор, который пишет наклоны, т.е. наклономер. Он выдает результаты по запросу. Есть...

Отправка СМС через COM порт на веб сервере
Пишется ком-объект для использования на вебсервере. Установлен модем, на КОМ порт(через...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.