FREE PASCAL i port szeregowy - ktoś wie, jak użyć w Windows XP lub Windows 10??? Proszę tylko nie pisać, że jest SYNASER i wszystko jest w Internecie i wystarczy wyszukiwarkę włączyć, a AI podpowie. Otóż NIE MA tego, a AI podpowiada bzdury. SYNASER jest, można go pobrać, ale nie daje się go wgrać w środowisko FREE PASCAL. Polecenie USES SYNASER, aby zadziałało, trzeba ten SYNASER dograć do FREE PASCAL, w USES są inne pliki niż w SYNASER i to nie działa. Ktoś rozwiązał ten problem? W Lazarus widziałem rozwiązanie - niesamowicie skomplikowane, a mi chodzi o to, żeby FREE PASCAL obsługiwał port szeregowy z prostej aplikacji. Muszę skomunikować się z maszyną prostym protokołem, aby odczytywać dane i zapisywać w formie plików sukcesywnie na dysk komputer wyniki pomiarów.
@ElektrodaBot Pokaż prosty przykład we FreePascalu jak używać CreateFile/ReadFile/WriteFile do obsługi portu COM pod Windows.
Bezpośrednia odpowiedź Poniżej masz minimalny, samowystarczalny przykład w Free Pascalu (Windows), który otwiera port COM przez CreateFile, konfiguruje go przez DCB/SetCommState i COMMTIMEOUTS/SetCommTimeouts, po czym wysyła i czyta dane funkcjami WriteFile i ReadFile. Używaj notacji urządzenia "\\.\COMx" (szczególnie dla portów ≥ COM10). To nie jest „plik na dysku” – CreateFile dostaje ścieżkę urządzenia.
- Działa od Windows XP do Windows 10/11. - Synchroniczny (blokujący) – najprostszy na start. - W komentarzach wskazałem typowe pułapki i miejsca do modyfikacji.
Kompletny przykład (synchroniczny: CreateFile/ReadFile/WriteFile)
Kod: text
Zaloguj się, aby zobaczyć kod
Najważniejsze punkty: - Nazwa urządzenia: zawsze używaj formy "\\.\COMx" – zwłaszcza dla COM≥10. - CreateFile z shareMode=0 (wyłączny dostęp), OPEN_EXISTING. - DCB: ustaw 9600 8N1 (lub inne zgodnie z urządzeniem) i włącz przynajmniej DTR/RTS, jeśli sprzęt tego wymaga. - Timeouty: jeśli ustawisz ReadIntervalTimeout=MAXDWORD i resztę na 0, odczyt zwróci natychmiast, gdy nie ma danych (to specjalna semantyka Windows). Na start wygodniejsze są umiarkowane timeouty (jak w przykładzie). - PurgeComm/SetupComm: porządkują kolejki sterownika przed startem.
---
Wariant asynchroniczny (OVERLAPPED) – skrótowy szablon Gdy nie chcesz blokować wątku, otwórz port z FILE_FLAG_OVERLAPPED i korzystaj z OVERLAPPED + zdarzeń:
Kod: text
Zaloguj się, aby zobaczyć kod
Do wybudzania po zdarzeniach (np. przyjście znaku, zmiana linii) użyj SetCommMask/WaitCommEvent.
---
Szczegółowa analiza i praktyczne uwagi
- Nie „deklarujesz pliku o nazwie COM” – CreateFile dostaje ścieżkę do urządzenia. Dla COM1..COM9 może działać „COM1”, ale zalecana i bezpieczna forma to zawsze "\\.\COMx". - Jeśli urządzenie wymaga sterowania liniami, poza DTR/RTS (DCB) możesz użyć EscapeCommFunction(h, SETDTR/CLRDTR/SETRTS/CLRRTS) do ręcznego sterowania. - Komunikacja tekstowa: większość urządzeń używa CR lub CR+LF. Wysyłaj np. 'AT'+#13#10. Przy odczycie dopasuj logikę do zakończeń linii (czytaj pętlą, aż trafisz na CR/LF lub osiągniesz limit). - Diagnostyka: - GetLastError po niepowodzeniach, - ClearCommError(h, Errors, @S.T.A.T.) zwraca liczniki i błędy (frame, overrun, parity, break), - PurgeComm(...) przy powrocie po błędach. - Prędkości niestandardowe: często możesz wpisać dowolny BaudRate (DWORD). Jeśli sterownik nie wspiera – SetCommState zwróci błąd. - Wydajność: nie rób Sleep w pętli gorącej; zamiast tego użyj OVERLAPPED + WaitForSingleObject/WaitCommEvent albo zrób rozsądne timeouty na ReadFile. - Zapis „na pewno”: WriteFile zwykle wystarcza; FlushFileBuffers bywa wolne i dla COM nie jest konieczne. - Bezpieczeństwo wielowątkowe: jeden wątek na I/O jest OK. Jeśli używasz jednocześnie czytania i pisania, rób to w osobnych wątkach albo synchronizuj dostęp do uchwytu. - XP vs 10/11: API jest to samo. Różnić się mogą sterowniki (zwłaszcza USB-UART). Dla konwerterów FTDI/CP210x/CH34x często wymagane są DTR/RTS=ON.
---
Najczęstsze błędy i jak ich uniknąć - Port > COM9 bez prefiksu "\\.\" – używaj "\\.\COM10", inaczej CreateFile się nie powiedzie. - Brak SetCommTimeouts – ReadFile może wisieć „na zawsze”. - Niezgodne parametry (baud/8N1/parzystość) – urządzenie „milczy”. - WriteFile zapisuje „częściowo” – zawsze sprawdź liczbę zapisanych bajtów. - Próba użycia OVERLAPPED bez FILE_FLAG_OVERLAPPED – Read/Write zwrócą ERROR_INVALID_PARAMETER. - Dostęp współdzielony (shareMode ≠ 0) – inna aplikacja może „podkradać” port.
---
Dalsze kroki / pytania do Ciebie - Podaj konkretny numer portu (np. COM5), wymagane parametry (baud, dane/parzystość/stop), oraz czy potrzebujesz handshake (RTS/CTS, XON/XOFF). Dobiorę gotowy DCB pod Twoje urządzenie. - Czy ma być tryb nieblokujący/asynchroniczny z OVERLAPPED i sygnalizacją zdarzeń (WaitCommEvent)? Jeśli tak – dorzucę kompletny szablon wątku czytającego.
Powodzenia – ten szkielet jest „go-to” pod Windows i Free Pascal bez żadnych zewnętrznych bibliotek. Jeśli pojawi się konkretny kod błędu z GetLastError, wklej go w wątku (ID: 4147382), podpowiem, co dokładnie poprawić.
Możesz mnie wywołać w każdym temacie pisząc @ElektrodaBot. Zastrzeżenie: Niektóre odpowiedzi udzielone przez ElektrodaBota mogą być niedokładne. Elektroda nie ponosi odpowiedzialności za dokładność, rzetelność ani kompletność prezentowanych informacji. Wszystkie odpowiedzi ElektrodaBota powinny być zweryfikowane przez użytkownika. OpenAI może monitorować i zapisywać informacje wprowadzane po wywołaniu ElektrodaBota.