Selam dostlar, eski bir projeyi diriltmeye çalışıyorum. Bir endüstriyel tartıdan RS-232 üzerinden veri alıp Turbo Pascal 7.0 ile işlemem gerekiyor. Seri portu açıp veri beklerken program komple donuyor, tuşa bassam da yanıt vermiyor. Portu $03F8 (COM1) olarak ayarladım, baud rate 9600, no parity, 8 bit, 1 stop bit. Veri gelene kadar beklemesi için bir döngü kuruyorum ama sanırım bir yerde hata yapıyorum. Kullanıcıdan bir tuşa basmasını bekler gibi değil, sürekli porttan veri okuyup ekrana yazması lazım. İşe yarar bir kod parçası veya kütüphane bilen var mı? Yoksa MS-DOS altında mı çalıştırmalıyım? Şimdiden teşekkürler.
Turbo Pascal ile COM port üzerinden veri okurken program donuyor, yardım!
Cevaplar (4)
23.07.2026 19:26
Merhaba, benzer bir sorunu geçen sene ben de yaşadım. Turbo Pascal'ın standart CRT birimi ile seri port okumaya çalışmak genelde donmaya sebep olur çünkü port hazır olana kadar beklerken programın olay döngüsü bloke olur. Bunun için ya kesme tabanlı bir sürücü yazman gerekir ya da portu poll ederken bir zaman aşımı (timeout) mekanizması kurmalısın. Ben şöyle bir çözüm kullandım: Önce Line Status Register'dan (port adresi+5) veri gelip gelmediğini kontrol et, eğer Data Ready biti (bit 0) set değilse beklemek yerine döngüde bir sayacı arttır ve belli bir değere ulaşınca döngüden çık. Bu şekilde program kilitlenmez. Ayrıca Turbo Pascal 7.0 için TPro serial unit diye bir kütüphane var, onu da araştırmanı öneririm.
23.07.2026 19:53
Aynen katılıyorum, LSR polling yapmak en temiz çözüm. Ek olarak şunu da belirteyim: Eğer programı Windows XP'de veya DOSBox'ta çalıştırıyorsan, doğrudan port erişimi için I/O izni gerekebilir. Windows NT tabanlı sistemlerde (2000/XP) direkt port erişimi engellenmiştir. O yüzden mutlaka MS-DOS (FreeDOS da olur) altında test et. Ayrıca Baud rate ayarını yaparken Divisor Latch Access Bit'ini (DLAB) doğru ayarladığından emin ol. 9600 baud için bölen değeri 12 (115200/9600) olmalı. Eğer bunu unutursan port hiç çalışmaz. Kolay gelsin.
23.07.2026 21:08
Hobidaşlar, bence işin içine bir de UART'ın FIFO buffer'ı giriyor olabilir. 16550 UART kullanıyorsan FIFO'yu enable etmek veri kaybını önler ama aynı zamanda polling ile okurken dikkatli olmak gerek, çünkü FIFO'da birden fazla byte birikebilir. Ben genelde portu açtıktan sonra FIFO Control Register'ı (port adresi+2) $C7 yaparak hem FIFO'yu aktif ediyorum hem de 14 byte eşik değeri ayarlıyorum. Sonra LSR'de Data Ready biti geldiğinde arka arkaya okuyorum. Ayrıca program donmasın diye bir de klavye kesmesini kontrol etmek iyi olur, yoksa sonsuz döngüde Ctrl+C bile işe yaramaz. Kısacası: LSR poll, FIFO ayarı, ve bir adet de klavye kontrolü ekle, sorun çözülür.
24.07.2026 00:08
Arkadaşlar hepinize çok teşekkür ederim! Özellikle gamerdigger28 ve vectormaster52'nin tavsiyeleriyle sorunu çözdüm. LSR polling ile Data Ready bitini kontrol edip, FIFO'yu da $C7 yapınca program artık donmuyor. Ayrıca DOSBox yerine FreeDOS altında çalıştırınca port erişim sorunu da kalmadı. Şu an tartıdan gelen veriyi sorunsuz okuyorum. İyi ki varsınız, bu projeyi bitirebileceğim artık. Herkese selamlar!
Bu konuya cevap yazabilmek için retro topluluğumuza üye olmalı veya giriş yapmalısınız.
İlgili Konular & Benzer Paylaşımlar
PIC16F628A ile C'de RF alıcı-verici protokolü: Manchester kodlama sorunu
Kategori: Programlama
PHP'de PDO ile MySQL bağlantısı neden hata veriyor? (Fatal error: Uncaught PDOException)
Kategori: Programlama
ESP32'de FreeRTOS ile Task Önceliklendirme Sorunu - Watchdog Reset Yiyorum
Kategori: Programlama