Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
4 / 4 / 1
Регистрация: 20.11.2014
Сообщений: 44
1

Передача и приём данных через COM порт

03.12.2014, 15:19. Просмотров 5674. Ответов 12
Метки нет (Все метки)

Задача такая, нужно через ком порт передавать и принимать пачки байтов, всё это по протоколу modbus rtu.
Установил библиотеки ком порта и modbus. Но вобще не понимаю как сформировать и отправить данные. подскажите пожалуйста.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.12.2014, 15:19
Ответы с готовыми решениями:

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

Передача и приём данных через COM-порт
Добрый день! Передо мной поставили задачу написать программу для работы с адаптером OBD2 Elm327...

Прием/передача текстовых файлов через 80 порт
Установил выделенную линию в инет и теперь хочу сделать что бы клиенты могли передавать файлы на...

Прием и передача данных в последовательный порт
Добрый день, отправляю вот так static void configDevSer(void){ struct termios...

12
Модератор
3468 / 2594 / 738
Регистрация: 19.09.2012
Сообщений: 7,959
03.12.2014, 16:17 2
Посмотри тут:
_http://kbyte.ru/ru/Programming/Articles.aspx?id=80&mode=art
(Работа с протоколом Modbus RTU в среде Delphi 7)
0
17 / 17 / 2
Регистрация: 24.02.2014
Сообщений: 42
03.12.2014, 18:22 3
для работы с сом-портом из под делфи есть прекрасный (ИМХО) компонент гражданина Брусникина Игоря Викторовича TBComPort.
0
4 / 4 / 1
Регистрация: 20.11.2014
Сообщений: 44
05.12.2014, 17:54  [ТС] 4
спасибо. сделал по статье с kbyte.ru
0
4 / 4 / 1
Регистрация: 20.11.2014
Сообщений: 44
10.12.2014, 14:45  [ТС] 5
Всё сделал как в статье, но, передачу и приём данных через COM порт наладил библиотекой CComLib.
Программа отправляет и получает данные, проверил путём соединения между собой двух com-портов. Но не знаю как обработать принятые данные, проверить на соответствие информационные поля.

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
procedure TForm1.tmr1Timer(Sender: TObject);
var
  Count: longint;
  crc: Word;
  i,j,k,l,m,n: Integer;
  b: array[1..100] of Word;
  frame, decoded, ansdec, dagramm :string;
  hexframe: array of byte;
  answer: string;
  ansarray:array[1..7] of char;
  Str: String;
  t1,t2,t3:int64;
begin
    j:=1;
    for i := 1 to Length(edit1.Text) do
    begin
      b[i]:=StrToByte(edit1.Text[j]+edit1.Text[j+1]);
      j:=j+2;
    end;
  crc:= crc16(b, Length(edit1.Text));
  frame :=edit1.Text + IntToHex(crc,4);
  SetLength(hexframe, Length(frame) div 2);
  k := 1;
  for l := 0 to High(hexframe) do begin
    hexframe[l] := StrToInt( '$' + Copy(frame, k, 2) );
    k := k + 2;
  end;
  for m := low(hexframe) to high(hexframe) do
  decoded:=decoded +''+IntToHex (Ord(hexframe [m]),2);
 ComPort.Open;
  ComPort.Write(hexframe);
  memo.Lines.Add('Send: '+decoded);
  ComPort.Read(answer,count);
  Memo.Lines.Add('Read: '+answer);
  End;
0
4 / 4 / 1
Регистрация: 20.11.2014
Сообщений: 44
17.01.2015, 11:56  [ТС] 6
Подскажите, пожалуйста, как лучше реализовать задачу. Я отправляю на железку через ком порт запрос, получаю ответ, далее отправляю другой запрос и снова получаю ответ. Всё это должно работать непрерывно. реализовано так: есть процедура отправки (беру запрос, присобачиваю CRС, шлю в порт), есть процедура приёма из ком порта, она срабатывает при получении данных от железки:
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
procedure TForm1.CPort1RXData(Sender: TBufferedCOMPort; ABuffer: Pointer;
  var ABufSize: Integer; var AddToNext: Boolean);
  var l,i,j, n,m,k : integer;
  b : byte;
  b1: array[1..100] of word;
  hexstring,answer: string;
  amplituda_gen,amplituda_input,nomer_fazy,raznost_faz,napr_termodat, Temperatura:real;
  otvet1:Real;
  Str,grub_kod, tochn_kod: string;
  t1,t2,t3:real;
  s,ansdec,dagramm :string;
  crc : word;
 
    frame, decoded:string;
  hexframe: array of byte;
type
  pba = ^tba;
  TBA = array[0..63] of byte;
 
begin
  AddToNext:=false;
 
  for N:=0 to ABufSize-1 do
   begin
    b:=pba(abuffer)^[N];
    RSBuffer[RSBufL]:=B;
    Inc(RSBufL);
   end;
      //msg
for m:=0 to ABufSize-3 do
         begin
          f:=f+IntToHex((RSBuffer[m]),2);
         end;
      // CRC
         for m:=ABufSize-2 to ABufSize-1 do
         begin
          fCRC:=fCRC+IntToHex((RSBuffer[m]),2);
         end;
     Memo1.Lines.Add('Read: '+f+fcrc);
Если по нажатию кнопки отправлять два разных запроса, железка не успевает ответить, поэтому нужно каким-то образом дождаться полученных данных и отправить следующий запрос.
Пробовал sleep(), но это как-то не правильно.

Подскажите, пожалуйста, как это сделать.
0
Модератор
3468 / 2594 / 738
Регистрация: 19.09.2012
Сообщений: 7,959
17.01.2015, 12:16 7
Например, добавь флаг (логическую переменную), сигнализирующий о том, можно ли посылать запрос или нет.
0
4 / 4 / 1
Регистрация: 20.11.2014
Сообщений: 44
17.01.2015, 12:20  [ТС] 8
Я пробовал. Но процедура отправки выглядит таким образом, нажатие кнопки "запустить":
Delphi
1
2
sendmsg(mes1);
sendmsg(mes2);

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
procedure TForm1.sendmsg(var mes: string);
  var
  s:integer;
  crc: Word;
  i,j,k,l,m,n: Integer;
  b: array[1..100] of Word;
  frame, decoded, ansdec, dagramm :string;
  hexframe: array of byte;
  s1,answer: string;
  t:Boolean;
begin
j:=1;
for i := 1 to Length(mes) do
begin
  b[i]:=StrToByte(mes[j]+mes[j+1]);
  j:=j+2;
end;
crc:= crc16(b, Length(mes));
frame :=mes + IntToHex(crc,4);
SetLength(hexframe, Length(frame) div 2);
  k := 1;
  for l := 0 to High(hexframe) do begin
    hexframe[l] := StrToInt( '$' + Copy(frame, k, 2) );
    k := k + 2;
  end;
for m := low(hexframe) to high(hexframe) do
decoded:=decoded +' '+IntToHex(Ord(hexframe[m]),2);
memo1.Lines.Add('Send: '+decoded);
cport1.Send(hexframe);
end;

Как сделать чтобы в процедуре нажатия кнопки отсылался первый запрос sendmsg(mes1);, а дальше ждал приёма данных? пробовал repeat и провыерку логической переменной, но почему-то не работает
0
Модератор
3468 / 2594 / 738
Регистрация: 19.09.2012
Сообщений: 7,959
17.01.2015, 12:28 9
Цитата Сообщение от zudogav Посмотреть сообщение
пробовал repeat и провыерку логической переменной
Надо
Delphi
1
Application.ProcessMessages;
в цикл добавить.

Или sendmsg(mes2) запускать из процедуры приема.
0
4 / 4 / 1
Регистрация: 20.11.2014
Сообщений: 44
17.01.2015, 12:53  [ТС] 10
так получается на кнопке отправления запроса должен выглядеть код:
Delphi
1
2
3
4
5
6
7
8
9
10
sendmsg(mes1);
Sleep(300);
repeat
  if ok=1 then
  begin
    sendmsg(mes2);
    ok:=0;
  end;
  Application.ProcessMessages;
  until ok=1 ;
В конце процедуры приёма ok присваиваю 1, в начале приёма присваиваю 0.
Чую нагородил)
0
Модератор
3468 / 2594 / 738
Регистрация: 19.09.2012
Сообщений: 7,959
17.01.2015, 12:58 11
Delphi
1
2
3
4
5
ok := False;
sendmsg(mes1);
while not ok do
  Application.ProcessMessages;
sendmsg(mes2);
В процедуре приема:
Delphi
1
ok := True;
1
4 / 4 / 1
Регистрация: 20.11.2014
Сообщений: 44
17.01.2015, 16:29  [ТС] 12
Спасибо, работает
0
4 / 4 / 0
Регистрация: 18.07.2013
Сообщений: 361
09.04.2015, 14:15 13
Начал разбираться передачей данных, скачал программу на _http://kbyte.ru/ru/Programming/Articles.aspx?id=80&mode=art
запускаю в своем DELphi7, у меня ругается на MSCommLib, как ее установить и где скачать, все недастающие библиотеки. Извините за тупые вопросы, но очень нужно!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.04.2015, 14:15

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

Прием данных через COM порт
Доброго времени суток Всем ! У меня такой вопрос помогите разобраться с приемом данных с COM...

Прием данных через COM - порт
Привет! Мне нужно реализовать прием данных с МК на компьютер через COM порт. Пишу в VS 2005, С++....

Прием данных через LPT-порт
подскажите как это можно выполнять и как написать программу!заранее спассибо

(MCS-51) Выполнить прием из внешней памяти данных 20 байт и передать через последовательный порт в режиме 3
Как я понял, помогают тут и так с неохотой. А под такую ерундовину, как МСS-51 – это вообще абзац. ...


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

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

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