Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.06.2016, 01:08   #1
Oksymoron
Новичок
Джуниор
 
Регистрация: 10.06.2016
Сообщений: 10
По умолчанию BComPort в Delphi7

Доброе время суток. Прошу Вашей помощи. Имеется задача:
1. Прочитать ComPort.
2. Если значение 131, тогда изменить checked(RadioButton1) на True, если 130 тогда False.
Прошу строго не ругать, я не работал раньше с ComPort. За ранее спасибо!!!

Последний раз редактировалось Oksymoron; 10.06.2016 в 01:15.
Oksymoron вне форума Ответить с цитированием
Старый 10.06.2016, 06:34   #2
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

...где протокол обмена? Как идет поток данных?

Значит будем искать в массиве принятых:
Код:
procedure Tform1.rec(Sender: TObject; count: integer);
var buf: array[0..255] of byte;
     slovo1: word;
begin
 com.Read(buf, count);
 //
 if (buf[0] = $53 {аски 'S'}) and
    (buf[1] = $53 {аски 'S'}) and
    (buf[14] = $50 {аски 'P'}) and
    (buf[15] = $50 {аски 'P'}) then begin
      slovo1:= (buf[3] shl 8)+ buf[2]; 
      // и т.д.
end;
Но вообще, это плохой стиль рулить из потока приема VCL-ными визуальными компонентами, наступит момент когда будет тормозить ваше приложение. Поэтому для визуальных эффектов лучше завести отдельный поток.

Последний раз редактировалось kutani; 10.06.2016 в 06:40.
kutani вне форума Ответить с цитированием
Старый 10.06.2016, 10:58   #3
Oksymoron
Новичок
Джуниор
 
Регистрация: 10.06.2016
Сообщений: 10
По умолчанию

[QUOTE=kutani;1613056]...где протокол обмена? Как идет поток данных?

У меня получается так, Arduino посылает в ComPort цифровые значения которые показывают состояние портов выхода а прога должна прочитать это значение и изменить RadioButton.
Вот полный код программы:

Цитата:
unit Main;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, BCPort, XPMan;

type
TMainForm = class(TForm)
Panel1: TPanel;
cbPort: TComboBox;
Label1: TLabel;
Label2: TLabel;
cbBaudRate: TComboBox;
Memo1: TMemo;
btnConnect: TButton;
btnDisconnect: TButton;
BComPort1: TBComPort;
Panel2: TPanel;
Edit1: TEdit;
btnSend: TButton;
Image1: TImage;
Image2: TImage;
Image3: TImage;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
btnClear: TButton;
cbCRLF: TCheckBox;
cbSetRTS: TCheckBox;
cbSetDTR: TCheckBox;
RadioButton1: TRadioButton;
XPManifest1: TXPManifest;
procedure FormCreate(Sender: TObject);
procedure btnConnectClick(Sender: TObject);
procedure btnDisconnectClick(Sender: TObject);
procedure btnSendClick(Sender: TObject);
procedure BComPort1RxChar(Sender: TObject; Count: Integer);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
procedure cbBaudRateChange(Sender: TObject);
procedure btnClearClick(Sender: TObject);
procedure BComPort1CTSChange(Sender: TObject; State: Boolean);
procedure BComPort1DSRChange(Sender: TObject; State: Boolean);
procedure BComPort1RLSDChange(Sender: TObject; State: Boolean);
procedure cbSetRTSClick(Sender: TObject);
procedure cbSetDTRClick(Sender: TObject);
procedure RadioButton1Click(Sender: TObject);
private
// Включение-выключение индикаторов
procedure SetLedCTS(Value: Boolean);
procedure SetLedDSR(Value: Boolean);
procedure SetLedRLSD(Value: Boolean);
end;

var
MainForm: TMainForm;

implementation

{$R *.DFM}
{$R Led.res}

procedure TMainForm.SetLedCTS(Value: Boolean);
begin
if Value then
Image1.Picture.Bitmap.Handle := LoadBitmap(HInstance, 'On')
else
Image1.Picture.Bitmap.Handle := LoadBitmap(HInstance, 'Off');
end;

procedure TMainForm.SetLedDSR(Value: Boolean);
begin
if Value then
Image2.Picture.Bitmap.Handle := LoadBitmap(HInstance, 'On')
else
Image2.Picture.Bitmap.Handle := LoadBitmap(HInstance, 'Off');
end;

procedure TMainForm.SetLedRLSD(Value: Boolean);
begin
if Value then
Image3.Picture.Bitmap.Handle := LoadBitmap(HInstance, 'On')
else
Image3.Picture.Bitmap.Handle := LoadBitmap(HInstance, 'Off');
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
EnumComPorts(cbPort.Items);
cbPort.ItemIndex := 0;
cbBaudRate.ItemIndex := 6;
{$IFNDEF VER90}
Image1.Transparent := True;
Image2.Transparent := True;
Image3.Transparent := True;
{$ENDIF}
SetLedCTS(False);
SetLedDSR(False);
SetLedRLSD(False);
end;

procedure TMainForm.btnConnectClick(Sender: TObject);
begin
BComPort1.Port := cbPort.Text;
BComPort1.BaudRate := TBaudRate(cbBaudRate.ItemIndex);
BComPort1.Open;
Edit1.Enabled := True; Edit1.Color := clWindow;
btnConnect.Enabled := False;
cbPort.Enabled := False;
btnDisconnect.Enabled := True;
cbSetDTR.Enabled := True; cbSetDTR.Checked := True;
cbSetRTS.Enabled := True; cbSetRTS.Checked := True;
btnSend.Enabled := True;
cbCRLF.Enabled := True;
btnClear.Enabled := True;
Memo1.Enabled := True; Memo1.Color := clWindow;
SetLedCTS(csCTS in BComPort1.Signals);
SetLedDSR(csDSR in BComPort1.Signals);
SetLedRLSD(csRLSD in BComPort1.Signals);
Edit1.SetFocus;
end;

procedure TMainForm.btnDisconnectClick(Sender : TObject);
begin
BComPort1.Close;
btnConnect.Enabled := True;
cbPort.Enabled := True;
btnDisconnect.Enabled := False;
cbSetDTR.Enabled := False;
cbSetRTS.Enabled := False;
btnSend.Enabled := False;
cbCRLF.Enabled := False;
btnClear.Enabled := False;
Memo1.Enabled := False; Memo1.Color := clBtnFace;
Edit1.Enabled := False; Edit1.Color := clBtnFace;
SetLedCTS(False);
SetLedDSR(False);
SetLedRLSD(False);
end;

procedure TMainForm.btnSendClick(Sender: TObject);
begin
if BComPort1.Connected then
begin
BComPort1.WriteStr(Edit1.Text);
Edit1.Text := '';
Edit1.SetFocus;
end;
end;

procedure TMainForm.BComPort1RxChar(Sender: TObject; Count: Integer);
var
S: String;
begin
BComPort1.ReadStr(S, Count);
if cbCRLF.Checked and (S[Length(S)] = #13) then // Добавление перевода строки
S := S + #10;
Memo1.Text := Memo1.Text + S;
end;

procedure TMainForm.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if BComPort1.Connected and (Key = #13) then
begin
BComPort1.WriteStr(Edit1.Text + Key);
Edit1.Text := '';
end;
end;

procedure TMainForm.cbBaudRateChange(Sender: TObject);
begin
BComPort1.BaudRate := TBaudRate(cbBaudRate.ItemIndex);
end;

procedure TMainForm.btnClearClick(Sender: TObject);
begin
Memo1.Clear;
Edit1.SetFocus;
end;

procedure TMainForm.BComPort1CTSChange(Sender : TObject; State: Boolean);
begin
SetLedCTS(State); // Изменилось состояние входной линии CTS
end;

procedure TMainForm.BComPort1DSRChange(Sender : TObject; State: Boolean);
begin
SetLedDSR(State); // Изменилось состояние входной линии DSR
end;

procedure TMainForm.BComPort1RLSDChange(Sende r: TObject; State: Boolean);
begin
SetLedRLSD(State); // Изменилось состояние входной линии RLSD
end;

procedure TMainForm.cbSetRTSClick(Sender: TObject);
begin
BComPort1.SetRTS(cbSetRTS.Checked);
Edit1.SetFocus;
end;

procedure TMainForm.cbSetDTRClick(Sender: TObject);
begin
BComPort1.SetDTR(cbSetDTR.Checked);
Edit1.SetFocus;
end;

procedure TMainForm.RadioButton1Click(Sender: TObject);
begin

end;

end.
Вложения
Тип файла: rar проба.rar (189.1 Кб, 17 просмотров)

Последний раз редактировалось Oksymoron; 10.06.2016 в 11:20.
Oksymoron вне форума Ответить с цитированием
Старый 10.06.2016, 12:55   #4
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

...где код скетча?

При отсылке из скетча можно использовать команды записи в порт как с переводом каретки writeln(), так и без write(). Но в любом случае буратино шлет поток данных по UART побайтно. Cо стороны приемника на верхнем уровне, поскольку ОС Windows не realtime, байты эти могут склеиваться драйвером в один пакет, так и разрываться, идти одиночно и группами. Следует задать для себя примитивный протокол обмена, признак начала или окончания приема, этого у вас нет.

Использовали асинхронное чтение в строку, оки. Допустим вы просто шлете байты и сделаем поиск по принятым:
Код:
procedure TMainForm.BComPort1RxChar(Sender: TObject; Count: Integer);
var s: string;
  i: integer;
begin
  s:= '';
  BComPort1.ReadStr(str, count);

  for i:= 1 to count do begin
    if Ord(str[i])=134 then RadioButton1.checked:= true;
    if Ord(str[i])=130 then RadioButton1.checked:= false;
  end;
kutani вне форума Ответить с цитированием
Старый 10.06.2016, 16:39   #5
Oksymoron
Новичок
Джуниор
 
Регистрация: 10.06.2016
Сообщений: 10
По умолчанию

Спасибо. Только при компиляции выбивает ошибку в строке
BComPort1.ReadStr(str, count);
Вот коды:
Цитата:
[Error] Main.pas(223): '(' expected but ',' found
[Error] Main.pas(225): '(' expected but '[' found
[Error] Main.pas(225): Type of expression must be BOOLEAN
[Error] Main.pas(226): '(' expected but '[' found
[Error] Main.pas(226): Type of expression must be BOOLEAN
[Error] Main.pas(231): Statement expected but end of file found
[Fatal Error] Terminal.dpr(5): Could not compile used unit 'Main.pas'
Прошу строго не ругать я самоучка.

Последний раз редактировалось Oksymoron; 10.06.2016 в 16:56.
Oksymoron вне форума Ответить с цитированием
Старый 10.06.2016, 17:30   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
2. Если значение 131, тогда изменить checked(RadioButton1) на True, если 130 тогда False.
а если значение = 176 или более другое?
Цитата:
BComPort в Delphi7
почему именно так?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 10.06.2016, 17:34   #7
Oksymoron
Новичок
Джуниор
 
Регистрация: 10.06.2016
Сообщений: 10
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
а если значение = 176 или более другое?
Цифровые значения означают номер порта и его состояние, например
130- порт 13 на выходе 0,
131- порт 13 на выходе логическая 1.
Oksymoron вне форума Ответить с цитированием
Старый 10.06.2016, 17:40   #8
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

а 132?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 10.06.2016, 18:01   #9
Oksymoron
Новичок
Джуниор
 
Регистрация: 10.06.2016
Сообщений: 10
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
а 132?
значения 132 не может быть. Значение могут быть 20,21,30,31,40,41,50,51,60,61,70,71 ,80,81,90,91,100,101,110,111,120,12 1,130,131,
значение обусловлены только номерами цифровых выходов Arduino, а последняя цифра это состояние выхода 0 или 1.
Oksymoron вне форума Ответить с цитированием
Старый 10.06.2016, 18:01   #10
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

Цитата:
при компиляции выбивает ошибку в строке
так поправьте переменную на вашу 's' при чтении вместо 'str' )

Код:
procedure TMainForm.BComPort1RxChar(Sender: TObject; Count: Integer);
var s: string;
  i: integer;
begin
  s:= '';
  BComPort1.ReadStr(s, count);

  for i:= 1 to count do begin
    if Ord(s[i])=134 then RadioButton1.checked:= true;
    if Ord(s[i])=130 then RadioButton1.checked:= false;
  end;
И потом, приведите дамп с portmon вашего обмена с буратиной, так будет видно что реально шлется и будет понятно чего выделять. Скетч-то отсутствует по-прежнему )
kutani вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как установить компонент bcomport в delphi7? Виктор dubStep Общие вопросы Delphi 4 22.02.2015 00:04
Терминал BComPort выдает иероглифы. azzzazzzelDEAN Компоненты Delphi 32 09.04.2014 16:18
Delphi7 PAREN_DEFO Помощь студентам 0 08.11.2011 18:20
unable to rename 'C:\ProgramFiles\Borland\Delphi7\Bi n\Delphi32.$$$' to 'C:\Program Files\Borland\Delphi7\ KazBoy Помощь студентам 1 12.04.2011 18:07