Windows'taki eski COM aygıtında modern konsol uygulaması nasıl barındırılır


0

EDIT: Birincil örnek Zork Dungeon'dan varsayılan işletim sistemi kabuğuna değiştirildi.

Modern bir makinede çalışan bir konsol uygulaması var. Ayrıca, bir seri COM bağlantısıyla aptal bir terminal olarak çalışmasını sağlayan Süper Seri Kartlı bir Apple // e'ye sahibim (detaylar bunun ötesinde işe yaramaz). Bu iki cihazı bir USB Seri portu kullanarak gayet iyi bağlayabilirim.

Modern makine Linux'u başlattığında, COM ayarlarını yapılandırarak ve kendime cihaz dosyasının ait olduğu gruba haklar vererek çalıştırabilirim.

$ bash </dev/ttyUSB1 >/dev/ttyUSB1 2>/dev/ttyUSB1

ve Apple'da bir bash oturumu düzenleyin - Linux makinesi sunucu görevi görür ve programı çalıştırır, ancak giriş ve çıkış basit bir istemci olan Apple'a gider. Bu, dungeon(Zork) gibi daha özel programlar ile de çalışır .

Aynı şeyi Windows'ta nasıl yaparım? Açıkçası, yukarıdaki çözümü tam olarak çoğaltamıyorum, çünkü Windows COMbir seferde yalnızca bir yerde bir bağlantı noktası açmamı sağlıyor - yukarıdaki komutun Windows analogunu çalıştırarak,

C:\> cmd <COM4 >COM4 2>COM4

bana bir Erişim Reddedildi hatası veriyor.

COM portuna veri gönderebilirim:

C:\> echo "Hello" >COM4

ve COM girişinden ham girdiyi (kontrol ve kaçış karakterleri dahil!) okuyun:

C:\> type <COM4

fakat ikisini aynı anda, aynı veya ayrı işlemlerde yapamam.

PuTTY ve RealTerm'i kullanmaya çalıştım, ancak ikisi de Apple'ı yalnızca Windows makinesinden çalıştırmama izin verdi, bu da bağlantının işe yaradığını kanıtlıyor, ancak istediğim şeyin tam tersi. Bağlı bir terminalden erişim için bir Windows konsol uygulamasını nasıl barındırırım?


"bir COM portunu açmama izin ver" -% 100 yanlış olduğundan eminim. Putty'yi kullanarak ve projenin kendi içinde dahili olarak tek bir makinede birden fazla COM portu açtığım bir proje üzerinde çalıştım.
Ramhound

@Ramhound Kolayca birden fazla COM bağlantı noktasını açabilirim. Sadece olamaz aynı birden fazla dosya saplı açık COM portu ve COM portu ile çift yönlü iletişim kurabilir buldum hiçbir yazılım paketi harici bir program veri alıp gönderebilirsiniz.
Hansinator

Bu doğru ve beklenen bir şey ...
Ramhound

@Ramhound. Evet. Ancak, PuTTY ve RealTerm gibi bu terminal uygulamaları, COM portu ile iki yönlü iletişimi sağlamak için bir şeyler yapıyor (yanlış yönde de olsa). Sorum şu, doğru yöne nasıl alabilirim?
Hansinator

Çift yönlü COM bağlantısı nasıl yanlış yönde bağlanabilir? Bir COM bağlantısı nasıl iki yönlü olamaz, seri COM bağlantıları çalışabilmeleri için her iki yönde de
toplanmalıdır

Yanıtlar:


1

Düzenleme: soru açıklamasından sonra "yeniden cevaplandı"

Microsoft'a göre ( Using command redirection operatorsWindows için XP'den daha yeni bir bölüm bulamıyorum ):

Çoğaltma kolları

& Yeniden yönlendirme işleci, belirtilen bir tanıtıcıdan belirtilen başka bir tanıtıcıya çıktıyı veya girişi çoğaltır. Örneğin, dir çıkışını File.txt dosyasına göndermek ve hata çıktısını File.txt dosyasına göndermek için şunu yazın:

dir> c: \ file.txt 2> & 1

Bir tanıtıcıyı çoğalttığınızda, tanıtıcının orijinal oluşumunun tüm özelliklerini çoğaltırsınız. Örneğin, bir tanıtıcı salt yazma erişimine sahipse, o tanıtıcının tüm kopyaları yalnızca yazma erişimine sahiptir. Salt okunur erişimi olan bir tanıtıcıyı salt okunur erişimi olan bir tanıtıcıya çoğaltamazsınız.

Yani iyi haber:

  • Değişebilirsin <COM4 >COM4 2>COM4için <COM4 >&1 2>&1.

Kötü haber:

  • Yalnızca okunur karıştırma <COM4ve salt >&1 2>&1erişim gereksinimlerini ve değişiyor Access Deniediçin The handle could not be duplicated during redirection of handle 1.

Eğer değiştirirseniz:

  • <COM4 >&1 2>&1için >COM4 2>&1 <&1(salt okunur ve hala karışık sadece-yazma) çalıştığı ve kullanışlı vermek STDOUTve STDERRfakat STDINyine de * kırılacak gibi görünüyor. (*) Birkaç test yaptım, fakat STDINişe yaramadı galiba ...

Ancak düzeltmek için bir geçici çözüm görebiliyorum:

  • com0comBoş modem emülatörü kullanın ve 3 sanal port çifti tanımlayın:
    • COM_O- COM_O4için STDOUT;
    • COM_E- COM_E4için STDERR;
    • COM_I- COM_I4için STDIN.
  • İle seri bir hub olun hub4com.exe( com0comkısmen) COM_O4, COM_E4, COM_I4ve COM4:

    • hub4com.exe --route=0:1 --route=2,3:0 --baud=19200 --data=8 --parity=no --stop=1 --octs=off --odsr=off --ox=off --ix=off --idsr=off --ito=0 \\.\COM4 \\.\COM_I4 \\.\COM_E4 \\.\COM_O4
    • Doğru (size ait) iletim parametrelerini ayarlamayı unutmayın: --baud...
  • Ve <\\.\COM_I >\\.\COM_O 2>\\.\COM_Ekomut satırı oluşturun.


Sonunda:

hub4com.exe --route=0:1 --route=2,3:0 --octs=off \\.\COM4 \\.\COM_I4 \\.\COM_E4 \\.\COM_O4

ve:

cmd <\\.\COM_I >\\.\COM_O 2>\\.\COM_E

üzerinde bir Windows komut satırı COM4var 19200 8N1...


Üzgünüm, daha net olmalıydım - yayını değiştirdim. Aynı sorun cmd, Windows komut isteminde çalışan ve diğer komut istemlerinde de sorun değil ve burada başarmaya çalıştığım şey bu.
Hansinator

@ Compynerd255 Cevabı biraz güncelledik ...
g2mk

Çok teşekkür ederim - bu umut verici görünüyor. Ancak, merkezi oluşturmak için hangi komutları kullandığınızı açıklayabileceğinizi düşünüyor musunuz? Merkezin ek bir test portu ile çalışmasını sağlayamıyorum.
Hansinator

@ Compynerd255 hub4com komutuyla genişletildi ...
g2mk

@ Compynerd255 Sizin için çalışıyor mu?
g2mk
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.