ComPort.WriteStr - dziwne zachowanie

1
Markoni napisał(a):

Prawdę mówiąc to otwieram klasycznie, przez wprowadzenie parametrów transmisji do TComPort, podania numeru portu i komendę ComPort.Open.

Wklej kod zamiast opisywać jak on wygląda…

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;
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 
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? 🤔

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.

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

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?

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?

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;  
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.

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