ComPort.WriteStr - dziwne zachowanie

Odpowiedz Nowy wątek
2020-06-28 18:49

Rejestracja: 1 miesiąc temu

Ostatnio: 1 miesiąc temu

0

Cześć,

Piszę program do obsługi robota przez USB w Delphi. Wykorzystuję bibliotekę ComPort. W laptopie podłączenie USB do robota poprawnie zgłasza się jako Virtual Port Com. Gdy wysyłam komendę:

ComPort.WriteStr('komenda');

to procesor w robocie w ogóle jej nie zauważa. Natomiast gdy wysyłam z programu Terminal to jest OK.

Ustawienia transmisji mam takie same.

Gdzie może być przyczyna tego problemu?

Pozdrawiam.

edytowany 2x, ostatnio: furious programming, 2020-06-28 18:53

Pozostało 580 znaków

2020-07-02 06:55

Rejestracja: 1 miesiąc temu

Ostatnio: 1 miesiąc temu

0

Nie wstawiałem, ponieważ do otwarcia portu za dużo kodu to nie ma:

procedure TForm1.btnOpenClick(Sender: TObject);
begin
    if ComPort.Connected = false then
    begin
        if ComComboBox1.Text = '' then exit;
        ComPort.Port:= ComComboBox1.Text;
        ComPort.Open;
        btnOpen.Caption := 'Close';
    end else
    begin
        ComPort.Close;
        btnOpen.Caption := 'Open';
    end
end;
Właśnie dlatego powinieneś go od razu wrzucić – skoro nie ma tego dużo. ;) - furious programming 2020-07-02 14:27

Pozostało 580 znaków

2020-07-02 09:18

Rejestracja: 9 lat temu

Ostatnio: 4 dni temu

2

I to są właśnie uroki tworzenia aplikacji KLIKANIE+KODOWANIE
Jak wysyłasz taki kawałek kodu to nikt nie wie co jest w środku obiektu "ComPort" bo masz go WYKLINANEGO na FORMIE

Masz ustawione poprawne parametry transmisji ?
Zacznij moze od jakiego "terminal-a" i wyslij komendę przez coś co na 100% działa , potwierdzisz tym sposobem ze jest komunikacja WINDOWS -> robot

Ewentualnie zacznij od kodu 
var
  ComPort:TComport; 
begin
  ComPort:=TComport.create(...)
  // ustaw parametry 

Nie przyjmuję reklamacji za moje rady, używasz na własną odpowiedzialność
edytowany 1x, ostatnio: furious programming, 2020-07-02 14:27
ustawienie comportu recznie o ile pamietam nie jest takie proste na pierwszy rzut oka, juz lepiej jakby pokazal plik dfm gdzie te wlasciwosci śą ustawione - lampasss 2020-07-02 09:35
@lampasss może zabrzmi to grubiańsko, ale jeśli ktoś nie umie skorzystać z dokumentacji i poświęcić godziny na poczytanie MSDN to faktycznie ustawienie parametrów jest trudne. Link do artykułu który mi posłużył jako punktu wyjścia przy pisaniu własnego unita https://docs.microsoft.com/en[...]=msdn.10)?redirectedfrom=MSDN - Mr.YaHooo 2020-07-02 18:22
jesli widze if ComPort.Connected = false then to wiem, ze moze byc ciezko, nie pisalem o sobie :)! zreszta 'wyklikujesz' na formatce, patrzysz w plik DFM i masz to co potrzebujesz - lampasss 2020-07-02 18:38
@lampasss aaaa no to w takim razie wszystko ok :) - Mr.YaHooo 2020-07-04 20:09

Pozostało 580 znaków

2020-07-02 14:10

Rejestracja: 12 lat temu

Ostatnio: 11 godzin temu

1
Markoni napisał(a):

Błąd pojawia się podczas otwierania portu.

A czy ty przypadkiem nie masz otwartego tego portu w terminalu i próbujesz go równocześnie otworzyć w swoim programie? 🤔

Pozostało 580 znaków

2020-07-02 16:11

Rejestracja: 1 miesiąc temu

Ostatnio: 1 miesiąc temu

0

Nie rozumiem tych ostatnich postów, przecież wcześniej napisałem, że bez problemu łącze się między Terminalem i ComPortem, przy pomocy przejściówek COM-USB .
Problem jest w łączności USB<->USB.

Pozostało 580 znaków

2020-07-02 18:07

Rejestracja: 5 lat temu

Ostatnio: 4 godziny temu

2
Markoni napisał(a):

Prawdę mówiąc to otwieram klasycznie, przez wprowadzenie parametrów transmisji do TComPort, podania numeru portu i komendę ComPort.Open.
Jak powinno się "profesjonalnie" otwierać port COM?

Klasycznie w stylu Delphi ;) Wziąć komponent, ustawić parametry i już. To jak robi się klasycznie widziałeś w linku który Ci przesłałem wcześniej https://docs.microsoft.com/pl[...]-resource?redirectedfrom=MSDN Plus CreateFile, WriteFile oraz ReadFile Niestety nie wiemy co komponent robi pod spodem i jak jest oprogramowany. Z drugiej strony podałeś też chyba nie do końca cały kod, ponieważ pisałeś w poprzednim poście

Markoni napisał(a):

Zainstalowałem API Monitor i w funkcji SetCommState ustawienia dla Terminala i ComPort są te same. Różnica jest tylko w wReserved, XonLim, XoffLim.
Często mam też problemy z otwarciem portu: SetCommState=Error: 87.
Ale w Terminalu otwiera się zawsze.

Jak można usunąć problem z SetCommState=Error: 87?

Zatem gdzie jest wywołanie tej metody i jak sprawdzasz wystąpienie błędu w wyniku czego wiesz, że to akurat błąd 87?

Markoni napisał(a):

Nie rozumiem tych ostatnich postów, przecież wcześniej napisałem, że bez problemu łącze się między Terminalem i ComPortem, przy pomocy przejściówek COM-USB .
Problem jest w łączności USB<->USB.

Nic bardziej mylnego. Skoro inny program łączy się poprawnie z robotem, to winą jest Twój program, a konkretnie podejrzewałbym komponent którego używasz TComPort. Osobiście nie znalazłem w miarę nowego komponentu/klasy o tej nazwie. A w swoim projekcie po prostu zakodowałem sam swoją klasę do wysyłania danych po porcie COM. Zajęło mi to 100 linijek (niestety piszę w C++) i takich problemów jak Ty nie miałem nigdy.

Zatem albo po prostu masz parę możliwości:

  • zrobisz jak ja i napiszesz własną krótką klasę
  • poszukasz innego, nowszego komponentu
  • przeanalizujesz kod źródłowy komponentu i znajdziesz błąd
  • zgłosisz ticketa u dostawcy komponentu

Oczywiście zakładam, że nie popełniasz głupiego błędu jak łączenie się do portu przez dwa programu na raz

Pozostało 580 znaków

2020-07-02 19:32

Rejestracja: 1 miesiąc temu

Ostatnio: 1 miesiąc temu

0

Mr.YaHooo, przesłany przez ciebie kod jest do C++. Jak to zamienić do Delphiego (pascala)?

Co do błędu 87, to wyskakuje taki komunikat podczas otwierania portu.

To że błąd leży po stronie TComPortu to oczywiste i od dłuższego czasu próbuję to rozwiązać.

Napisać własną krótką klasę - na to jestem jeszcze za cienki ;)

Na jakich komponentach od COM-a pracujecie, na których nie macie problemów?

Pozostało 580 znaków

2020-07-02 21:27
Moderator Delphi/Pascal

Rejestracja: 8 lat temu

Ostatnio: 6 godzin temu

Lokalizacja: Tuchów

0
Markoni napisał(a):

Napisać własną krótką klasę - na to jestem jeszcze za cienki ;)

Nie umiesz napisać kodu otwierającego plik np. o nazwie COM1 oraz zapisujący do i odczytujący z niego dane? A później opakować go w jakąś małą klasę, żeby zamknąć całą logikę związaną z komunikacją w jednym kontenerku?


edytowany 1x, ostatnio: furious programming, 2020-07-02 21:27

Pozostało 580 znaków

2020-07-02 22:46

Rejestracja: 17 lat temu

Ostatnio: 2 godziny temu

3

Synapse:

uses
  synaser;

procedure TForm1.Button1Click(Sender: TObject);
var
  com: TBlockSerial;
begin
  try
    com:=TBlockSerial.Create;
    com.Connect('COM1');
    com.Config(9600, 8, 'N', 1, False, False); 
    com.SendString('komenda'+#13#10);
  finally
    com.Free;
  end;
end;  

pozdrawiam
paweld
edytowany 1x, ostatnio: Paweł Dmitruk, 2020-07-02 22:46
popieram - synapse to chyba najlepsza opcja :) - cerrato 2020-07-02 22:48

Pozostało 580 znaków

2020-07-04 20:14

Rejestracja: 5 lat temu

Ostatnio: 4 godziny temu

1
Markoni napisał(a):

Na jakich komponentach od COM-a pracujecie, na których nie macie problemów?

To jest na tyle proste, że sam oprogramowałem klasę. Zmieścisz się w mniej niż 100 liniach kodu.

Co do rozumienia C/C++. Jeśli poważnie traktujesz programowanie pod Windows to musisz nauczyć się czytać kod C/C++ ponieważ wszystkie przykłady WinAPI (które czasami jest niezbędne) są właśnie w tych językach.

Paweł Dmitruk napisał(a):
com.Connect('COM1');

A co w przypadku gdy mamy port większy niż 9? Synapse nie wymaga składni takiej jak funkcja https://support.microsoft.com[...]serial-ports-larger-than-com9 Akurat w przypadku portów wirtualnych instalowanych po podłączeniu różnych urządzeń pod USB często ustawia się numer portu większy od 10 i można się nadziać w ten sposób.

com.Connect('COM28'); - Paweł Dmitruk 2020-07-04 21:15
@Paweł Dmitruk super sprawa w takim razie :) Niestety z pobieżnego przeszukania dokumentacji metody Connect nie znalazłem odpowiedzi na moje pytanie. A w źródłach nie szukałem. - Mr.YaHooo 2020-07-04 21:56

Pozostało 580 znaków

2020-07-04 23:35

Rejestracja: 13 lat temu

Ostatnio: 7 godzin temu

2

Wtrącę trochę do tematu.
Swego czasu skonstruowałem tzw. wyświetlacz klienta. Gdy oprogramowanie drukuje paragon w trybie tzw. offline to klient na bieżąco nie wie jaka jest wartość paragonu. Właśnie do tego stosuje się wyświetlacze klienta. Prosta sprawa, wyświetlacz LCD 2x20 znaków i jakieś sterowanie.
Oczywiście nie wymyślałem wszystkiego od podstaw i odnalazłem dokumentacje popularnego wyświetlacza IBM, moje oprogramowanie emuluje ten właśnie protokół a jest on prosty. Zawsze wysyłane są 40 znaków, sterownik po prostu 21 i następne znaki umieszcza w nowej linii i to wszystko.

Sprawa była bardzo prosta, użyłem najtańsze Arduino NANO z portem USB na Atmedze 328 i kontrolerem CH340 i jak wysyłałem na nie 40 znaków z terminala wszystko działało. Jednak mój program używający komponentu ComPort nie działał? Jednak uwaga, gdy oprogramowanie wgrałem do Arduino Pro Micro na Atmedze 32U4 (która ma kontroler USB w sobie) wszystko działało i z terminala i z komponentu ComPort.
Dla zbadania sprawy nawet zrobiłem analizę ramki wysyłanej przez komputer na oscyloskopie (który potrafi dekodować ramki COM) i nie znalazłem różnicy. Zdekodowana ramka wyglądała tak samo. Chociaż nie przesądza to że fizycznie może ona wyglądać troszkę inaczej, ciężko jednak to analizować na domowym sprzęcie.

W każdym razie, jeśli do sterowania tego robota używasz jakieś Andino, zmień na próbę na inne.
Następna sprawa, jakiej wersji ComPorta używasz, jest tego od groma na rynku i może pomyśl nad zmianą na inny komponent.

Pozostało 580 znaków

Odpowiedz

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