port szeregowy

0

Witam.

Mam problem z wysłaniem przez port szeregowy do urządznia komunikatu (przykładowo $aa $62 $00 $00 $00 $00 $01 $02 $03). Korzystam z gotowych i sprawdzonych rozwiązań stosowanych przez p. Daniluka. Wszystko byłoby OK gdyby nie $00. Nie mogę sobie z tym poradzić. To jest pusty znak i Delphi nie wysyła tego. Pomocy. Proszę o wszelkie rady.

Pozdrawiam i z góry dziękuję.

0

:| moze kod bys pokazal to byloby latwiej.
a w ogole to moze jeszcze poszukaj troche... bo postow o porcie szeregowym jest masa, nie wierze zeby nikt nigdy nie wysylal $00.
byl jakis czas temu post o obsludze drukarki fiskalnej, moze tam bedzie.

0

Używam standardowych funkcji i procedur obsługi portu.
Poniżej zamieszczam jedynie fragmenty kodu, to co pamiętam (nie mam go przy sobie).

</delphi>

var
query:Pchar=chr($aa)+chr($33)+chr($62)+chr($00)+chr($00)+chr($00)+chr($00)+chr($01)+chr($02)+chr($03);

function TForm1. Write_Comm(hCommDev: THANDLE; nNumberOfBytesToWrite: DWORD): Integer;
var NumberOfBytesWritten: DWORD;

begin

//---------------------Zapis danych do bufora wyjściowego-----------------------

 WriteFile(hCommDev, Buffer_O, nNumberOfBytesToWrite, NumberOfBytesWritten, NIL);
 if (WaitCommEvent(hCommDev,fdwEvtMask, NIL)=TRUE) Then
   Write_Comm:=1
 Else
     Write_Comm:=0;

end;

procedure TF_Wazenie.SpeedButton10Click(Sender: TObject);

begin
StrCopy(Buffer_O,query);

 Repeat
       FlushFileBuffers(hCommDev);
 Until (Form1.Write_Comm(hCommDev, StrLen(Buffer_O))<>0);

end;</delphi>

Za wszelką pomoc serdecznie dziękuję.

0

PChar to "null terminated string" więc jak mu wstawisz gdzieś #0 to on się tam skończy. Użyj zwykłych stringów albo tablicy bajtów

function TForm1. Write_Comm(hCommDev: THANDLE; buffer: string): Integer;
var NumberOfBytesWritten: DWORD;
begin

     WriteFile(hCommDev, Buffer[1], Length(Buffer), NumberOfBytesWritten, NIL);
     if (WaitCommEvent(hCommDev,fdwEvtMask, NIL)=TRUE) Then
       Write_Comm:=1
     Else
         Write_Comm:=0;
end;

całkiem inna sprawa, że możesz skorzystać z gotowych rozwiązań jak np. TComPort

0

Dzięki Misiekd za szybką odpowiedź.

Wprowadziłem w życie Twoje sugestie, ale niestety dalej nie działa. Problem jest w tym, że wysyłając zapytanie w postaci String de facto wysyła jego kody ASCII (może się mylę). Tutaj mamy do czynienia z typowym RTU.
Nie wiem za bardzo co dalej.
Ps. Próbowałem z CompPortem i to samo.

Pozdrawiam

0

wysyła kody ascii no ale przecież takie chciałeś. Piszę programy, które współpracują z różnymi urządzeniami i nie miałem jakichś większych problemów przy komunikacji.

nie wiem jak składasz stringa ale spróbuj tak

s := #$aa#$62#$00#$00#$00#$00#$01#$02#$03;
0

Uruchomiłem na Comporcie.
Wszystko działa przepięknie. Dzięki wielkie Misiekd za pomoc.

Pozdrawiam.

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