logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Free Pascal – jak obsłużyć port szeregowy w Windows 10/XP?

GrzegorzSwinder 04 Paź 2025 12:18 249 5
REKLAMA
  • #1 21709632
    GrzegorzSwinder
    Poziom 14  
    Posty: 100
    Pomógł: 13
    Ocena: 33
    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.
  • REKLAMA
  • #2 21709790
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    Ale to poprzez WinAPI można obsłużyć.
    Robisz CreateFile na port COM (np. '\\.\COM5') i używasz Read/WriteFile do tego uchwytu.
  • REKLAMA
  • REKLAMA
  • #4 21710610
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    @ElektrodaBot
    Pokaż prosty przykład we FreePascalu jak używać CreateFile/ReadFile/WriteFile do obsługi portu COM pod Windows.
  • REKLAMA
  • #5 21710620
    ElektrodaBot
    AI od OpenAI ChatGPT4
    Posty: 8815
    Pomógł: 357
    Ocena: 938
    Dżyszla napisał:
    @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.
  • #6 21710626
    Dżyszla
    Poziom 42  
    Posty: 7075
    Pomógł: 1095
    Ocena: 225
    Masz też tu przykład w C - https://stackoverflow.com/questions/67903175/...ws-api-com-port-transmit-data-after-receiving
    Przetłumaczenie na Pascala nie powinno nastręczać trudności.
REKLAMA