Delphi 7/2009 OnRead TSocketClient

0

Witam serdecznie mam nietypowy problem, którym chciałem się raczej z wami podzielić niż pytać o rozwiązanie (aczkolwiek jeżeli ktoś zna takowe to chętnie posłucham). Mam pewne urządzenie, z którym bez żadnych problemów można się połączyć po TCP/IP. Urządzenie posiada wyświetlacz i wysyłając odpowiednią ramkę (przy użyciu TSocketClient) można np wyświetlić napis, obrazek bądź sterować przekaźnikiem. Niestety problem pojawia się przy odczycie. Mianowicie wysyłając do urządzenia informację >A01# urządzenie powinno odpowiedzieć <A00# lub <A01# w zależności czy wykonało polecenie czy nie. Kombinowałem na wszystkie możliwe sposoby i urządzenie zawsze zwracało głupoty. Już myślałem, że jest popsute aż otrzymałem oryginalny program do tego urządzenia WRAZ Z KODAMI i co się okazało... Urządzenie odpowiada tak jak powinno na wszystkie moje zapytania. No więc odpaliłem Delphi2009 przekompilowałem program i .... urządzenie znowu zwraca głupoty. Okazuje się, że TSocketClient ostatni raz działał dobrze na Delphi7 i każda następna wersja już posiada błędy.

Czy spotkaliście się z takim problemem?

0

Nie jestem ekspertem od komunikacji sieciowej z urządzeniami i w ogóle przez TCP/IP, ale skoro standardowe TSocket powodują problemy, to może jak znajdziesz dłuższą chwilę czasu, wypróbuj moduł z http://piechnat.pl/article/simpletcp.html (są krotkie przykłady dla HTTP) i nim się spróbuj łączyć wysyłając polecenia. Bo o ile dobrze zrozumiałem, to te urządzenie działa jako jakiś serwer na jakimś IP na przykład lokalnym i porcie? Ja ostatnio mam taką fazę, że tworzę wcześniej napisane dla swoich potrzeb Downloadery i inne nowsze tylko pod WinAPI, czyli wiadomo żeby exek nie "spuchł" za bardzo używam tego SimpleTCP. Misiekd polecił mi do tego moduły specjalnie dla WinAPI i Delphi 7 z http://kolmck.net/sys/SysDcu7.zip co powoduje, że UPX'niete exeki są jeszcze mniejsze. Wiem, że przy dzisiejszych przepustowościach łączy i pojemnościach dysków twardych czy program ma 20 kb czy 2000 kb to wielu "rybka", ale jak już coś tworzyć to małe i zgrabne, poza tym modząc w WinAPI można się coś przy okazji nauczyć. A wracając do tematu ten moduł SimpleTCP to taka prosta "nakładka' na WinSock. Dla HTTP sprawdziła się świetnie, napisałem sobie proste funkcje i procedury do: pobierania kodu html stron, pobierania kodu błedów HTTP, pobierania pliku, pobierania linku do przekierowania, sprawdzania nagłowków i takie tam inne proste. Może w Twoim przypadku też Tobie ten moduł lepiej sprawdzi się w komunikacji niż korzystanie z klas Delphi. Ewentualnie jeżeli dasz rade możesz sobie przerobić lub wzbogacić źródło tego SimpleTCP. Ja przy całym moim uwielbieniu do Synapse, to sposobał mi się ten twór SimpleTCP, bo dla rzeźbienia w WinAPI - idealny. A jeżeli to Ciebie nie urządza, to tradycyjnie niemal dodam, że może ktoś inny tutaj ćoś lepszego Tobie podpowie.

1

obstawiam, że po prostu wysyłasz komunikat jako string (przez SendText) a nie jako tablicę byte, a jak wiadomo (albo i nie) od (chyba) D2k6 string jest unicode i pewnie zamiast >A01# wysyła >A01# albo ˙ţ> czy podobnie

1

Może to pomoże. Kiedyś pod 2009 też miałem problem z socketami, i ten kod działał OK (znaleziony kiedyś w sieci)
Tak czy owak, nie tam Synapse czy Indy, ale Overbyte ICS jest porządnym sprawdzonym pakietem do zadań sieciowych.

procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  s: AnsiString;
begin
  SetLength(s, Socket.ReceiveLength);
  SetLength(s, Socket.ReceiveBuf(Pointer(s)^, Length(s)));

  ShowMessage(s);
end;
0

Normalne zaćmienie mózgu. Misiekd masz 100% racji zapomniałem całkowicie o tym Unicodzie, a zmyliło mnie to, że urządzenie reaguje na komendę wysłaną wprost.

maciejmt dzięki za ten kawałek kodu, też mi pomógł aczkolwiek podpowiedź miskad nakierowała mnie na właściwy tor. Dziękuje za pomoc.

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