ComPort - wysyłanie z RichEdit

0

Witam.
Które zdażenie w komponencie ComPort informuje że dane zostały wysłane?
Potrzebuję wysłać zawartość RichEdit-a w którym znajduję się kilkanaście lini tekstu ale jak to robię to do celu dociera tylko część.

procedure TForm1.Button_SendClick(Sender: TObject);
var
  Str: String;
begin
 for i:=0 to RichEdit.lines.count do
  begin
   Str := RichEdit.lines[i];
   Str := Str + #13#10;
   ComPort.WriteStr(Str);
// czekaj aż zostanie wysłane - jak tu to wpisać?
  end;
end;

próbowałem sprawdzić ComPort.WaitForEvent

.
.
.
        Events := [evTxEmpty];
        ComPort.WaitForEvent(Events, Event.Handle, 500); 
        if evTxEmpty in Events then
        begin
        // coś tam
        end;

.
.
.

ale coś zdażenie evTxEmpty nigdy nie następuje.
Może ktoś podpowiedzieć jak to rozwiązać?

0

pokaż lepiej jak odbierasz

0

Z odbiorem nie mam problemu. Odbieram do Memo:

procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
  Str: String;
begin
  ComPort.ReadStr(Str, Count);
  Memo.Text := Memo.Text + Str;
end;

Komunikuję się z komputerem maszyny przemysłowej. Wysyłam polecenie listowania 'WL' i wtedy maszyna w odpowiedzi wysyła zawartość swojej pamięci w postaci kilkanastu lini tekstu. Z tym nie mam problemu. Gorzej jeśli chcę wysłaś do maszyny treść tych kilkunastu linii. Jeśli robię to jak w przykładzie na początku to np gdy chcę wysłać 10 linii tekstu gdzie każda ma ok 100 znaków to do maszyny dochodzą linie 1, 3, 6, 10 czyli co któraś. Zrobiłem coś takiego

procedure TForm1.Button_SendClick(Sender: TObject);
var
  Str: String;
  i:integer;
begin
 for i:=0 to RichEdit.lines.count do
  begin
   Str := RichEdit.lines[i];
   Str := Str + #13#10;
   ComPort.WriteStr(Str);
   for i:=0 to 9999999 do ; // !!!!!!!!!!!! czekaj chwilę ????????????
  end;
end;

i wtedy jest ok wszystkie linie są przesyłane do maszyny. Więc z tego co kumam to pętla for...do... jest szybsza niż możliwości wysyłania ComPort-a. I dlatego szukam rozwiązania aby tą pętle spowolnić ale tylko na tyle o ile jest to konieczne a nie sztuczne spowalnianie.

0

for i:=0 to 9999999 do ; // !!!!!!!!!!!! czekaj chwilę ????????????
jak już to
sleep(100);

co do samego kodu to może to urządzenie ma jakiś narzut czasowy, albo np. wysyłanie następnej lini dopiero po otrzymaniu odpowiedzi z urządzenia

0

Chyba źle podchodzisz do tematu.
W przypadku portu RS232, w zależności od użytego komponentu do odbioru danych, masz takie parametry jak:
-wielkość buforu
-czas czekania na dane

O wiele lepiej będzie połączyć dane w jeden string i wtedy wysłać:


procedure TForm1.Button_SendClick(Sender: TObject);
var
  Str: String;
  i:integer;
begin
 for i:=0 to RichEdit.lines.count do
  begin
   Str := Str + RichEdit.lines[i];
   Str := Str + #13#10;
  end;
 ComPort.WriteStr(Str);//na koniec posli wszystkie linie z richedit
end;

Jeśli chcesz wysyłać pojedyncze linie to zastosuj sleep - czekaj aż inny komputer odbierze dane z buforu rs232 i jest gotowy pobierać następne.

procedure TForm1.Button_SendClick(Sender: TObject);
var
  Str: String;
  i:integer;
begin
 for i:=0 to RichEdit.lines.count do
  begin
   Str := RichEdit.lines[i];
   Str := Str + #13#10;
   ComPort.WriteStr(Str);
    sleep(25);
  end;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1