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…
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…
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;
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
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? 🤔
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.
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:
Oczywiście zakładam, że nie popełniasz głupiego błędu jak łączenie się do portu przez dwa programu na raz
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?
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?
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;
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.