3 — Умный дом на Ардуино. Глава II — Передача и чтение данных. Часть 2 — Delphi 4

В продолжении о передачи и получении данных с Ардуино, рассмотрим пример с использованием 2009.

Для передачи и чтения данных по Seial при помощи Delphi2009 требуется библиотека компонентов TCOMPORT(загружена с этого сайта).

Создадим новый проект и добавим на форму:

  • timer(задержку ставим 100 миллисекунд и выключаем таймер)
  • comport(В настройках указываем номер и скорость порта)
  • button
  • memo
  • 2 label
SendReaDelphi2009.png

Создадим обработчики событий:

  • Нажатия кнопки(button)
1
2
3
4
5
6
procedure TForm1.Button_SendClick(Sender: TObject);
begin
memo.Clear;
ComPort.Write(#01,1);
Timer1.Enabled:=True;
end;
procedure TForm1.Button_SendClick(Sender: TObject);
begin
memo.Clear;
ComPort.Write(#01,1);
Timer1.Enabled:=True;
end;
  • Загрузки формы(form)
1
2
3
4
procedure TForm1.FormCreate(Sender: TObject);
begin
  ComPort.Open;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  ComPort.Open;
end;
  • Таймера
1
2
3
4
5
6
procedure TForm1.Timer1Timer(Sender: TObject);
begin
   Timer1.Enabled:=False;
   Label1.Caption:='Температура теплого пола кухни:'+Memo.Lines[1];
   Label2.Caption:='Температура теплого пола ванной:'+Memo.Lines[2];
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
   Timer1.Enabled:=False;
   Label1.Caption:='Температура теплого пола кухни:'+Memo.Lines[1];
   Label2.Caption:='Температура теплого пола ванной:'+Memo.Lines[2];
end;
  • Чтения ком порта
1
2
3
4
5
6
7
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
  Str: ansistring;
begin
  ComPort.ReadStr(Str, Count);
  Memo.Text := Memo.Text + Str;
end;
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
  Str: ansistring;
begin
  ComPort.ReadStr(Str, Count);
  Memo.Text := Memo.Text + Str;
end;

Запустим приложение, подождем 10 секунд, пока мастер-контроллер получит данные о температуре и нажмем нашу кнопку(button)

SendReadDelphi2009.png

ЗЫ. Немного модифицировали Масте-Контроллера в прошлой статье

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
//Модифицированный скетч мастр-контроллера из статьи http://bigbarrel.ru/?p=1257
String
temp_kitchen_pol, //температура пола кухни
temp_bath_pol;//температура пола ванной
int pin_inter=9;//not 13,12,11,10 //посылаем сигнал прерывание на Slave контроллер
 
void setup() {
.begin(19200);
pinMode(pin_inter, OUTPUT);
 
}
 
void loop() {
synch();//Опрос слейв контроллера
if (Serial.available())//Ожидаем опроса
{
int sr;
sr = Serial.read();
if (sr==0x01 || sr-'0'==0x01 || sr=='1')//команда для начала передачи
{
Serial.println("begin");//начало передачи, для отсеиания мусора в сериал
Serial.println(temp_kitchen_pol);//отпраляем температуру теплого пола кухни
Serial.println(temp_bath_pol); //отправляем температуру теплого пола ванной
}else Serial.println(sr);
}
}
 
void synch(){
if (my_timer(10000,0))
{
send_serial(0xf1);//опрос первого контроллера
seria_input();
 
}
}
 
void seria_input(){//прием сообщения от Слейв контроллера
int val;
if (Serial.available())
{
val=Serial.read();
if (val==0xf1)//1
{
temp_kitchen_pol=get_temp_float_serial();// получаем температуру
temp_bath_pol=get_temp_float_serial();// получаем температуру
}
}
}
 
void send_serial(int A)//отправляем сообщение Слейв контроллерам
{
digitalWrite(pin_inter, HIGH);
delay(20);
Serial.write(A);
delay(100);//ожидаем ответ от контроллера
digitalWrite(pin_inter, LOW);
}
//Модифицированный скетч мастр-контроллера из статьи http://bigbarrel.ru/?p=1257
String
temp_kitchen_pol, //температура пола кухни
temp_bath_pol;//температура пола ванной
int pin_inter=9;//not 13,12,11,10 //посылаем сигнал прерывание на Slave контроллер

void setup() {
Serial.begin(19200);
pinMode(pin_inter, OUTPUT);

}

void loop() {
synch();//Опрос слейв контроллера
if (Serial.available())//Ожидаем опроса
{
int sr;
sr = Serial.read();
if (sr==0x01 || sr-'0'==0x01 || sr=='1')//команда для начала передачи
{
Serial.println("begin");//начало передачи, для отсеиания мусора в сериал
Serial.println(temp_kitchen_pol);//отпраляем температуру теплого пола кухни
Serial.println(temp_bath_pol); //отправляем температуру теплого пола ванной
}else Serial.println(sr);
}
}

void synch(){
if (my_timer(10000,0))
{
send_serial(0xf1);//опрос первого контроллера
seria_input();

}
}

void seria_input(){//прием сообщения от Слейв контроллера
int val;
if (Serial.available())
{
val=Serial.read();
if (val==0xf1)//1
{
temp_kitchen_pol=get_temp_float_serial();// получаем температуру
temp_bath_pol=get_temp_float_serial();// получаем температуру
}
}
}

void send_serial(int A)//отправляем сообщение Слейв контроллерам
{
digitalWrite(pin_inter, HIGH);
delay(20);
Serial.write(A);
delay(100);//ожидаем ответ от контроллера
digitalWrite(pin_inter, LOW);
}

4 комментс для “3 — Умный дом на Ардуино. Глава II — Передача и чтение данных. Часть 2 — Delphi

  1. Ответить Павел Янв 11, 2015 12:09

    пишу в Delphi XE7
    использую библиотеку TCOMPORT 4.11f
    функция ComPort.ReadStr не читает в переменную типа ansistring
    если у str тип String то ошибок нет

    procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
    var
    Str: ansistring;
    begin
    ComPort.ReadStr(Str, Count);
    Memo.Text := Memo.Text + Str;
    end;

    выдает ошибку [dcc32 Error] ComMainForm.pas(93): E2033 Types of actual and formal var parameters must be identical

    как прочитать данные с com порта в ANSI с этой компонентой?

    • Ответить Slava Янв 11, 2015 17:47

      Попробуйте так

      Откройте файл компоненты
      «CPort.pas»

      Найдите строку
      function TCustomComPort.ReadStr(var Str: string; Count: Integer): Integer;

      Замените на
      function TCustomComPort.ReadStr(var Str: AnsiString; Count: Integer): Integer;

  2. Ответить Milen Ноя 24, 2016 18:33

    ComPort.Write(#01,1);
    [Error] Unit1.pas(39): Variable required

  3. Ответить Slava Янв 15, 2017 19:25

    проблема решена?

Добавить комментарий