Показать сообщение отдельно
  #3  
Старый 17.03.2011, 21:34
AnderoN AnderoN вне форума
Прохожий
 
Регистрация: 18.02.2011
Сообщения: 31
Репутация: 10
По умолчанию

Я написал программу, вот код

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,StdCtrls,Ariphm,DateUtils;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    ComboBox1: TComboBox;
    StaticText1: TStaticText;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ComboBox1Select(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  hCOM:hFile=0;
  pDCB:TDCB;
  comtime:TCOMMTIMEOUTS;
  xb:byte;
  xn:dword;
  ab:array[1..8] of byte;
  st,stcom:string;
  ttime,told:TDateTime;

implementation

{$R *.dfm}


procedure IniCOM;
var i:integer;
begin
  hCOM:=CreateFile(Pchar(stcom),
  GENERIC_READ+GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0);
  if (hCom=INVALID_HANDLE_VALUE) then
    begin
      st:=stcom+' не найден';
      Application.MessageBox(Pchar(st),'Error',MB_OK);
      exit;
    end;
  if GetCommState(hCOM,pDCB) then
    st:=stcom+': baud=2400 parity=N data=8 stop=1';
  if BuildCommDCB(Pchar(st),pDCB) then
    SetCommState(hCOM,pDCB)
  else
    begin
      st:=stcom+' занят или заданы неверные параметры';
      Application.MessageBox(Pchar(st),'Error',MB_OK);
      exit;
    end;
  GetCommTimeouts (hCom,comtime);
  comtime.WriteTotalTimeoutMultiplier:=1;
  comtime.WriteTotalTimeoutConstant:=10;
  comtime.ReadIntervalTimeout:=10;
  comtime.ReadTotalTimeoutMultiplier:=1;
  comtime.ReadTotalTimeoutConstant:=2000;
  SetCommTimeouts(hCom,comtime);
  ab[1]:=ord('A');
  ab[2]:=ord('T');
  ab[3]:=13;
  ab[4]:=10;
  WriteFile(hCOM,ab,4,xn,nil);
  if ReadFile (hCOM,ab,10,xn,nil) then
    begin
      st:='';
      for i:=1 to 10 do st:=st+chr(ab[i]);
      if pos('OK',st)<>0 then
        begin
          st:=stcom+' занят модемом';
          Application.MessageBox(Pchar(st),'Error',MB_OK);
          CloseHandle(hCOM);
          hCOM:=0;
          Form1.Label2.Caption:='COM?';
          exit;
        end;
    end;
  Form1.Label2.Caption:=stcom+' 2400';
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  stcom:='COM1';
  IniCOM;
end;


procedure TForm1.FormDestroy(Sender: TObject);
begin
  CloseHandle(hCOM);
end;


procedure TForm1.ComboBox1Select(Sender: TObject);
begin
  CloseHandle(hCOM);
  stcom:=ComboBox1.Text;
  IniCOM;
end;


procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
  if (hCOM=0) or (hCOM=INVALID_HANDLE_VALUE) then
    exit;
  PurgeComm(hCOM,PURGE_RXCLEAR);
  xb:=$A2;
  WriteFile(hCOM,xb,1,xn,nil);
  told:=Time;
  if ReadFile(hCOM,ab,8,xn,nil) then
    begin
      ttime:=Time;
      if SecondsBetween(told,ttime)>0 then
        begin
          Application.MessageBox('Устройство не обнаружено','Error',MB_OK);
          exit;
        end;
      if xn<>8 then
        begin
          Application.MessageBox('Неправильный формат данных','Error',MB_OK);
          exit;
        end;
      for i:=0 to 7 do
        StaticText1.Caption:=hexb(ab[i])+'';
    end else
    begin
      Application.MessageBox('COM сломался','Error',MB_OK);
      exit;
    end;
end;

end.


Она принимает информацию от микроконтроллера, правда только один байт, вместо задуманных мной 8, может ли быть такое из-за того, что микроконтроллер посылает информацию с некоторой задержкой?

И подскажите пожалуйста, если нетрудно, как реализовать так, чтобы программа без кнопки запуска просто принимала информацию от микроконтроллера беспрерывно, т.е. все что он шлет, чтобы отображалось в поле statictext? Если кто знаком с программой СОМ2000, то мне вот нужно, чтобы на подобии как там было, подключаешь микроконтроллер и выдается вся передаваемая информация.
Ответить с цитированием