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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2009, 18:35   #1
RockForr
Форумчанин
 
Аватар для RockForr
 
Регистрация: 28.04.2009
Сообщений: 112
По умолчанию Управление внешними устройствами средствами Delphi

Это листинг программы-вольтметра, которая считывает инф-ю с модуля подключенного к компу и и выдает кол-во вольт.
Как переделать эту прогу, чтобы она считывала инф-ю с датчиков модуля подключенного к компу и выводила состояние датчиков на экран, например, ЕСЛИ ДАТЧИК СРАБОТАЛ, то картинка на форме отображается красным цветом.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, mmsystem, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Edit1: TEdit;
    Label2: TLabel;
    Edit2: TEdit;
    Label3: TLabel;
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  MyTimer: TTimer;
  uTimerID: word;
  i: word;
  CommHandle : hFile;
  DCB : TDCB;
  PortString: string;
  CommTimeOuts: TCOMMTIMEOUTS;

  p: PChar;
  BinBuf: array[0..1023] of Char;
  buffer: string;
  ADC_Res: array[0..64] of Char;
  ADCFloat: Double;
  CRbyte: Shortint;
  LFbyte: Shortint;
  NumberWritten : DWORD; 

implementation

{$R *.dfm}


procedure FNTimeCallBack(uTimerID, uMessage: UINT;dwUser, dw1, dw2: DWORD);stdcall;
begin

ReadFile(CommHandle, BinBuf, 128, NumberWritten, nil);
if(NumberWritten > 0) then
begin
p := BinBuf;
for i:=1 to NumberWritten do
begin
//**************
if (p^ = '#') then
begin
  if(StrLComp(p, PChar('#ADC,'), 4) = 0) then
  begin 
    p := p + 5;
    StrLCopy(ADC_Res, p, 4);
    ADCFloat := (StrToInt(ADC_Res)/1024)*5;
    Form1.Edit2.Text := FloatToStr(ADCFloat);
  end;
  inc(p);
end
//****************
end;
end;  
end; 


procedure TForm1.Button1Click(Sender: TObject);
begin
PortString := '\\.\COM' + Edit1.Text;   
CommHandle := CreateFile(PChar(PortString), GENERIC_READ or 
			GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0);

if (CommHandle = INVALID_HANDLE_VALUE) then
begin
  MessageDlg('Error. Can`t Open port', mtError, [mbOK], 0);
end
else
begin
  GetCommState(CommHandle, DCB);
  DCB.BaudRate  := CBR_9600; // FORMALLY, CONNECT BAUD DOESN`T MATTER (Virtual Com Port)
  DCB.Parity    := NOPARITY;
  DCB.ByteSize  := 8;
  DCB.StopBits  := OneStopBit;
  
  CommTimeOuts.ReadIntervalTimeout          := 0;
  CommTimeOuts.ReadTotalTimeoutMultiplier   := 0;
  CommTimeOuts.ReadTotalTimeoutConstant     := 1000;
  CommTimeOuts.WriteTotalTimeoutMultiplier  := 0;
  CommTimeOuts.WriteTotalTimeoutConstant    := 1000;
  SetCommTimeouts(CommHandle, CommTimeOuts);
  SetCommState(CommHandle, DCB);

  uTimerID := timeSetEvent(1000,0,@FNTimeCallBack,100,TIME_PERIODIC);

  CRbyte := 13; // HEX 0x0D
  LFbyte := 10; // HEX 0x0A
  buffer := '$KE,ADC,1' + Char(CRbyte) + Char(LFbyte);
  WriteFile(CommHandle, PChar(buffer)^, Length(buffer), NumberWritten, nil);

  MessageDlg('Port Open Ok', mtInformation, [mbOK], 0);
end 
end;

end.

Последний раз редактировалось rpy3uH; 29.04.2009 в 19:58.
RockForr вне форума Ответить с цитированием
Старый 29.04.2009, 19:41   #2
ScorpioN_T
Пользователь
 
Регистрация: 27.10.2008
Сообщений: 62
По умолчанию

ну ты кадр
чуток разберись в коде....
найди там строку где меняются значения и поставь УСЛОВИЕ при изменений значений, менять форме цвет...
Сразу скажу в коде не разбирался, но суть в этом

if DATCHIK>0 then Form1.color:=clBtnFace;

DATCHIK- переменная (просто привел пример)
ScorpioN_T вне форума Ответить с цитированием
Старый 29.04.2009, 20:32   #3
RockForr
Форумчанин
 
Аватар для RockForr
 
Регистрация: 28.04.2009
Сообщений: 112
По умолчанию

На тему проги "Пароль". Я все также вставил как у тебя в свою прогу, но при запуске экзэшника вылетает ошибка, а потом все нормально, Как от ошибки избавиться?
RockForr вне форума Ответить с цитированием
Старый 29.04.2009, 20:37   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

какая ошибка, на какой строке?
ты хоть чтото сам собираешься делать?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 29.04.2009, 20:46   #5
RockForr
Форумчанин
 
Аватар для RockForr
 
Регистрация: 28.04.2009
Сообщений: 112
По умолчанию

Ошибка НЕ В СТРОКЕ!!!, а на экране
RockForr вне форума Ответить с цитированием
Старый 29.04.2009, 22:58   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

блин я удивляюсь нежеланию чтото самому делать..
за тебя делать не намерен, своих проблем хватает, но помочь могу...
так вот, как я понимаю этот код выводит значение в Эдит, так?
мой тебе совет воспользуйся Бряками и трассировкой и поймешь, какие строки выводят это значения и куда(то есть где надо заменить)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 03.05.2009, 17:36   #7
RockForr
Форумчанин
 
Аватар для RockForr
 
Регистрация: 28.04.2009
Сообщений: 112
По умолчанию

Меня интересует эта часть кода, как ее изменить
procedure FNTimeCallBack(uTimerID, uMessage: UINT;dwUser, dw1, dw2: DWORD);stdcall;
begin

ReadFile(CommHandle, BinBuf, 128, NumberWritten, nil);
if(NumberWritten > 0) then
begin
p := BinBuf;
for i:=1 to NumberWritten do
begin
//**************
if (p^ = '#') then
begin
if(StrLComp(p, PChar('#ADC,'), 4) = 0) then
begin
p := p + 5;
StrLCopy(ADC_Res, p, 4);
ADCFloat := (StrToInt(ADC_Res)/1024)*5;
Form1.Edit2.Text := FloatToStr(ADCFloat);
end;
inc(p);
end
//****************
end;
Как переделать эту прогу, чтобы она считывала инф-ю с датчиков модуля подключенного к компу и выводила состояние датчиков на экран, например, ЕСЛИ ДАТЧИК СРАБОТАЛ, то картинка на форме отображается красным цветом.
RockForr вне форума Ответить с цитированием
Старый 03.05.2009, 22:04   #8
Sergey13666
 
Регистрация: 03.05.2009
Сообщений: 8
По умолчанию

Добрый день или вечер Мужики.
Дайте пожалуйста совет чаго почитать или помогите обьясните но только по проще я только начинаю вникать в это дело, мне надо каким нибуть образом подключать датчики и считывать с них информацию а на другие датчики отправлять задания. проблема в том что, как изготовить плату и написать дрова под них?
Sergey13666 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как средствами Delphi опросить USB порты? beegl Общие вопросы Delphi 3 24.03.2009 17:40
Работа с внешними устройствами через COM порт Georgios Помощь студентам 11 11.02.2009 15:59
Может ли Excel, управлять внешними устройствами valerij Microsoft Office Excel 5 28.01.2009 06:42
Управление системными устройствами в Делфи )Игнат( Общие вопросы Delphi 1 07.09.2008 12:13
Управление устройствами компьютера ilmar Помощь студентам 5 22.07.2008 16:04