21 / 14 / 11
Регистрация: 09.06.2011
Сообщений: 832
Записей в блоге: 3
1

Delphi + Arduino (чтение из порта)

22.12.2015, 17:26. Показов 18797. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток ребята. Подскажите, в общем не могу понять почему не идет считывание с порта в программе

Delphi
1
2
3
4
5
6
7
8
9
var
  buffer: String;
  conversao: String;
  i: integer;
begin
  buffer := '';
  Sleep(250);
  i := ComPort1.InputCount;
  Form1.Memo1.Lines.Add(IntToStr(Form1.ComPort1.ReadStr(buffer, i)));
Получаю только 0. А в мониторе порта получаю данные которые мне надо:

1___734.76 2___27.40 3___2.67
1___734.75 2___27.40 3___2.15
1___734.77 2___27.40 3___3.01
1___734.81 2___27.40 3___2.75
1___734.75 2___27.40 3___2.41
1___734.81 2___27.40 3___3.27
1___734.73 2___27.40 3___2.75


Использую компонент ComPort. Буду очень признателен за любую подсказку.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.12.2015, 17:26
Ответы с готовыми решениями:

Чтение COM порта
Не отсылайте в гугл, я от туда весь день не вылазию.... Помогите разобраться с чтением порта....

Асинхронное чтение из COM-порта
Уважаемые спецы! Помогите, плиз, понять небольшую проблему. написал чтение с COM-порта....

Чтение данных с COM-порта
Доброго времени суток. Уверен тема поднималась не раз, уже все прочитал разобраться не смог. В...

Чтение и запись СОМ порта
Привет ребят, нужна небольшая помощь от вас, начал работать с СОМ портом, и немного не догоняю тут...

17
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
22.12.2015, 17:40 2
там в наборе компонентов есть такой компонент как ComDataPacket, у меня через него хорошо только получалось принимать по UART данные, как строку. А еще там есть маркеры как признак начала строки и как признак конец строки(входных данных). т.е. указывает откуда до куда я хочу получитьс троку из входного буффера. а то часто очень бывало, что пакет данных(как строка) приходили "рванными", а вот с этими маркерами, указывал четко от сих до сих принять как одно. Полазь и сам разберешься в общем
0
21 / 14 / 11
Регистрация: 09.06.2011
Сообщений: 832
Записей в блоге: 3
22.12.2015, 18:40  [ТС] 3
Что то не понимаю. Использую этот компонент. Создал процедуру, пытаюсь вывести данные

Delphi
1
2
3
4
procedure TForm1.ComDataPacket1Packet(Sender: TObject; const Str: string);
begin
  Form1.Memo1.Lines.Add(Str);
end;
Но нечего нет.
0
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
22.12.2015, 19:20 4
а ты его с ком портом соединил? всмысле этот компонент?
0
21 / 14 / 11
Регистрация: 09.06.2011
Сообщений: 832
Записей в блоге: 3
22.12.2015, 19:56  [ТС] 5
Цитата Сообщение от Arcor Посмотреть сообщение
а ты его с ком портом соединил? всмысле этот компонент?
Да конечно же.

Добавлено через 30 минут
Хммм что то так и не пойму....


Может что не так пишу:

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
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, CPort, sComboBox, sLabel,
  Vcl.ExtCtrls, CPortCtl, Vcl.ComCtrls, sMemo, Vcl.Buttons, sSpeedButton,
  sPanel, sStatusBar, sSkinManager;
 
type
  TForm1 = class(TForm)
    ComPort1: TComPort;
    Timer1: TTimer;
    ComDataPacket1: TComDataPacket;
    sSkinManager1: TsSkinManager;
    sStatusBar1: TsStatusBar;
    sPanel1: TsPanel;
    ComLed1: TComLed;
    sSpeedButton1: TsSpeedButton;
    sSpeedButton2: TsSpeedButton;
    sMemo1: TsMemo;
    procedure Timer1Timer(Sender: TObject);
    procedure ComDataPacket1Packet(Sender: TObject; const Str: string);
    procedure sSpeedButton1Click(Sender: TObject);
    procedure sSpeedButton2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.ComDataPacket1Packet(Sender: TObject; const Str: string);
begin
  Form1.sMemo1.Text := Str;
end;
 
procedure TForm1.sSpeedButton1Click(Sender: TObject);
begin
  Form1.ComPort1.ShowSetupDialog;
end;
 
procedure TForm1.sSpeedButton2Click(Sender: TObject);
begin
  try
    Form1.ComPort1.Open;
    if Form1.ComPort1.Connected then
    begin
      Form1.Caption := 'Подключились';
      Form1.Timer1.Enabled := true;
    end
    else
    begin
      Form1.Caption := 'Не подключены';
      Form1.Timer1.Enabled := false;
    end;
  finally
 
  end;
end;
 
procedure TForm1.Timer1Timer(Sender: TObject);
var
  buffer: String;
  conversao: String;
  i: Integer;
begin
  buffer := '';
  Sleep(250);
  i := ComPort1.InputCount;
  //Form1.sMemo1.Lines.Add(IntToStr(Form1.ComPort1.ReadStr(buffer, i)));
end;
 
end.
0
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
22.12.2015, 20:08 6
вот пример на скорую руку

ардуиновский код
C++
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
void setup() 
{
 
  Serial.begin(9600);
}
 
char c;
 
void loop() 
{
 
  if (Serial.available() > 0)
  {
    c = Serial.read(); 
    switch(c)
    {
      case '0': 
        Serial.println("<Bye bye First>"); 
        break; 
        
      case '1': 
        for(int i = 0; i < 20; i++)
        {
          Serial.println("<Hello Cyberforum>");
          Serial.println("<Hello First>"); 
        }
        break;
    }
  
  }
}
дельфовский код
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, CPort;
 
type
  TForm1 = class(TForm)
    ComPort1: TComPort;
    ComDataPacket1: TComDataPacket;
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure ComDataPacket1Packet(Sender: TObject; const Str: string);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
 
var
  Form1: TForm1;
  k: Integer;
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  ComPort1.Connected := not ComPort1.Connected;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  ComPort1.WriteStr('1');
  k := 0;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
  ComPort1.WriteStr('0');
  k := 0;
end;
 
procedure TForm1.ComDataPacket1Packet(Sender: TObject; const Str: string);
begin
  Memo1.Lines.Add(IntToStr(k) + ') ' + Str);
  k := k + 1;
end;
 
end.
на картинке видим, все что отправили из ардуины, все получили в дельфи назад без какой либо проблемы
Миниатюры
Delphi + Arduino (чтение из порта)  
2
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
22.12.2015, 20:13 7
Лучший ответ Сообщение было отмечено First как решение

Решение

вот ситуация как выглядит без "маркеров" входных данных
видим что пакеты приходят "рванными" до ужаса, маркерами я обозвал

<
>

вот эти 2 штуки я обзываю макркерами, ими я обрамил все что отпарвлял в порт

в дельфи же компоненту датапакет, я поставил
StartString := '<'
StopString := '>';

теперь он ловит все, что между ними и одним целым "куском" пропускает
Миниатюры
Delphi + Arduino (чтение из порта)  
0
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
22.12.2015, 20:16 8
вот так вот все вместе, если будут трудности, вот рабочие коды
Вложения
Тип файла: 7z Arduino+Delphi.7z (553.7 Кб, 486 просмотров)
0
21 / 14 / 11
Регистрация: 09.06.2011
Сообщений: 832
Записей в блоге: 3
22.12.2015, 20:17  [ТС] 9
Спасибо огромное, все я разобрался.
0
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
22.12.2015, 20:19 10
Цитата Сообщение от First Посмотреть сообщение
Спасибо огромное
кушайте, не обляпайтесь
0
0 / 0 / 0
Регистрация: 23.12.2015
Сообщений: 1
24.12.2015, 10:04 11
Спасибо большое форуму и тем кто помогает, добивал связь с компом ардуинки почти 2 недели, все никак не получалось, пробовал на компонентах, потом на WinApi потом попалась эта страничка и по примеру сделал себе заготовку , теперь все работает отлично без рваных частей в обмене..
Сори что тему поднял старую..
0
21 / 14 / 11
Регистрация: 09.06.2011
Сообщений: 832
Записей в блоге: 3
24.12.2015, 13:41  [ТС] 12
Цитата Сообщение от Baks05 Посмотреть сообщение
Спасибо большое форуму и тем кто помогает, добивал связь с компом ардуинки почти 2 недели, все никак не получалось, пробовал на компонентах, потом на WinApi потом попалась эта страничка и по примеру сделал себе заготовку , теперь все работает отлично без рваных частей в обмене..
Сори что тему поднял старую..

Да я сам голову ломал - теперь вот все хорошо работает.
0
0 / 0 / 1
Регистрация: 14.07.2015
Сообщений: 10
19.12.2016, 20:02 13
Уважаемый Arcor, а как установить компонент ComPort1?
и где его скачать можно?
в инете нарыл только AdpComPort и BCom.
0
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
19.12.2016, 20:09 14
вот, не трудно было бы догадаться где найти там же как установить и как пользоваться
Миниатюры
Delphi + Arduino (чтение из порта)  
0
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
19.12.2016, 20:29 15
0
0 / 0 / 1
Регистрация: 14.07.2015
Сообщений: 10
19.12.2016, 21:11 16
А на ХЕ3 станет компонент?
ругается на [dcc32 Fatal Error] CPortLibDXE.dpk(1): E2225 Never-build package 'CPortLibDXE' must be recompiled
0
21 / 14 / 11
Регистрация: 09.06.2011
Сообщений: 832
Записей в блоге: 3
19.12.2016, 22:27  [ТС] 17
Цитата Сообщение от slaupok Посмотреть сообщение
А на ХЕ3 станет компонент?
ругается на [dcc32 Fatal Error] CPortLibDXE.dpk(1): E2225 Never-build package 'CPortLibDXE' must be recompiled
Я на X10 ставил.
0
5705 / 2296 / 466
Регистрация: 20.11.2009
Сообщений: 7,720
Записей в блоге: 1
20.12.2016, 00:39 18
попробуй другие пакеты поустанавливать, авось что-то установится, ну или на крайняк без компонентов - классом работать, из исходников
0
20.12.2016, 00:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.12.2016, 00:39
Помогаю со студенческими работами здесь

Чтение данных из виртуального COM-порта
Все привет. Суть дела. Мне человек пишет чтение и парсинг данных из виртуального СОМ-порта....

Чтение и обработка данных полученных из COM порта
Есть микроконтроллер с датчиком (акселерометр), эмулируется COM порт на USB, выводиться ~20...

ARDUINO + COM PORT + DELPHI
Здравствуйте. В программировании новичек, нужна помощ ваша. На терминал получаю данные с ардуино,...

Некорректный вывод данных через comport Delphi 7 - Arduino
Хай! Как показано на картинке вывод данных через com порт программы Arduino и программы Delphi...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru