วิธีการโฮสต์แอปพลิเคชันคอนโซลที่ทันสมัยบนอุปกรณ์ COM อนุกรมดั้งเดิมใน Windows


0

แก้ไข:เปลี่ยนตัวอย่างหลักจาก Zork Dungeon เป็นเชลล์ OS เริ่มต้น

ฉันมีแอปพลิเคชั่นคอนโซลที่ทำงานบนเครื่องที่ทันสมัย ฉันยังมี Apple // e ที่มี Super Serial Card ซึ่งอนุญาตให้มันทำงานเป็นเทอร์มินัลโง่ผ่านการเชื่อมต่อ COM แบบอนุกรม (รายละเอียดไร้ประโยชน์เกินกว่านั้น) ฉันสามารถเชื่อมต่ออุปกรณ์ทั้งสองนี้ได้ดีโดยใช้พอร์ต USB อนุกรม

เมื่อเครื่องที่ทันสมัยลีนุกซ์บูทด้วยการกำหนดการตั้งค่า COM และให้สิทธิ์กับกลุ่มที่ไฟล์อุปกรณ์เป็นของตัวเองฉันสามารถเรียกใช้

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

และรับเซสชัน bash บน Apple - เครื่อง Linux ทำหน้าที่เป็นเซิร์ฟเวอร์และรันโปรแกรม แต่อินพุตและเอาต์พุตไปที่ Apple ซึ่งเป็นไคลเอ็นต์แบบง่าย สิ่งนี้ยังทำงานกับโปรแกรมเฉพาะเพิ่มเติมเช่นdungeon(Zork)

ฉันจะทำสิ่งเดียวกันใน Windows ได้อย่างไร เห็นได้ชัดว่าฉันไม่สามารถทำซ้ำโซลูชันข้างต้นได้อย่างแน่นอนเนื่องจาก Windows อนุญาตให้ฉันCOMเปิดพอร์ตในที่เดียวได้ตลอดเวลาโดยใช้อะนาล็อก Windows ของคำสั่งด้านบน

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

ทำให้ฉันมีข้อผิดพลาดถูกปฏิเสธการเข้าถึง

ฉันสามารถส่งข้อมูลไปยังพอร์ต COM:

C:\> echo "Hello" >COM4

และอ่านข้อมูลดิบ (รวมถึงตัวควบคุมและตัวหนี!) จากพอร์ต COM:

C:\> type <COM4

แต่ฉันไม่สามารถทำทั้งสองอย่างในเวลาเดียวกันในกระบวนการเดียวกันหรือแยกกัน

ฉันลองใช้ PuTTY และ RealTerm แต่ทั้งคู่ให้ฉันใช้งาน Apple จากเครื่อง Windows ซึ่งพิสูจน์ว่าการเชื่อมต่อทำงานได้ แต่เป็นทิศทางตรงกันข้ามกับสิ่งที่ฉันต้องการ ฉันจะโฮสต์แอปพลิเคชันคอนโซล Windows สำหรับการเข้าถึงจากเทอร์มินัลที่เชื่อมต่อได้อย่างไร


"ให้ฉันเปิดพอร์ต COM" - ฉันแน่ใจ 100% ว่าผิด ฉันเพิ่งทำงานเกี่ยวกับโปรเจ็กต์ที่ฉันเปิดหลายพอร์ต COM บนเครื่องเดียวโดยใช้ Putty และภายในโครงการเอง
Ramhound

@ แรมฮาวด์ฉันสามารถเปิดพอร์ต COM หลายพอร์ตได้อย่างง่ายดาย ฉันไม่สามารถเปิด COM พอร์ตเดียวกันกับที่มีไฟล์ได้มากกว่าหนึ่งตัวและไม่มีชุดซอฟต์แวร์ที่ฉันพบว่าสามารถสื่อสารแบบสองทิศทางกับพอร์ต COM สามารถส่งและรับข้อมูลจากโปรแกรมภายนอก
TheHansinator

ถูกต้องและคาดว่าจะเป็น ...
Ramhound

@Ramhound ใช่. แต่แอพพลิเคชันเทอร์มินัลเช่น PuTTY และ RealTerm กำลังทำอะไรบางอย่างเพื่อเปิดใช้งานการสื่อสารแบบสองทิศทางกับพอร์ต COM (แม้ว่าจะอยู่ในทิศทางที่ผิด) คำถามของฉันคือฉันจะไปในทิศทางที่ถูกต้องได้อย่างไร
TheHansinator

การเชื่อมต่อ COM แบบสองทิศทางสามารถเชื่อมต่อผิดทิศทางได้อย่างไร? การเชื่อมต่อ COM จะไม่เป็นแบบสองทิศทางได้อย่างไรการเชื่อมต่อ COM แบบอนุกรมต้องมีชุมชนทั้งสองวิธีเพื่อให้สามารถใช้งานได้
Ramhound

คำตอบ:


1

แก้ไข: "ตอบอีกครั้ง" หลังจากการชี้แจงคำถาม

ตามMicrosoft (ฉันไม่พบUsing command redirection operatorsส่วนสำหรับ Windows ที่ใหม่กว่า XP):

หมายเลขอ้างอิงที่ซ้ำกัน

ตัวดำเนินการ & การเปลี่ยนเส้นทางทำซ้ำเอาต์พุตหรืออินพุตจากหมายเลขอ้างอิงที่ระบุหนึ่งไปยังหมายเลขอ้างอิงที่ระบุอื่น ตัวอย่างเช่นในการส่งเอาต์พุต dir ไปยัง File.txt และส่งเอาต์พุตข้อผิดพลาดไปที่ File.txt ให้พิมพ์:

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

เมื่อคุณทำซ้ำหมายเลขอ้างอิงคุณทำซ้ำลักษณะทั้งหมดของการเกิดขึ้นเดิมของหมายเลขอ้างอิง ตัวอย่างเช่นหากหมายเลขอ้างอิงมีสิทธิ์เข้าถึงแบบเขียนอย่างเดียวรายการซ้ำทั้งหมดของหมายเลขอ้างอิงนั้นมีสิทธิ์เข้าถึงแบบเขียนอย่างเดียว คุณไม่สามารถทำซ้ำหมายเลขอ้างอิงที่มีการเข้าถึงแบบอ่านอย่างเดียวลงในหมายเลขอ้างอิงที่มีการเข้าถึงแบบเขียนอย่างเดียว

ข่าวดีก็คือ:

  • คุณสามารถเปลี่ยนไป<COM4 >COM4 2>COM4<COM4 >&1 2>&1

ข่าวร้ายคือ:

  • คุณกำลังผสมอ่านอย่างเดียว<COM4และเขียนเท่านั้น>&1 2>&1จัดการกับความต้องการการเข้าถึงและคุณกำลังจะเปลี่ยนไปAccess DeniedThe handle could not be duplicated during redirection of handle 1

หากคุณเปลี่ยน:

  • <COM4 >&1 2>&1เพื่อ>COM4 2>&1 <&1(อ่านอย่างเดียวและการเขียนเท่านั้นที่ยังคงผสม) ที่ทำงานและให้คุณสามารถใช้งานได้STDOUTและSTDERRแต่STDINยังดูเหมือนว่าการจะเสีย (*) ฉันได้ทำการทดสอบเล็กน้อย แต่ดูเหมือนSTDINว่าไม่ได้ผล ...

อย่างไรก็ตามฉันสามารถเห็นวิธีแก้ไขปัญหาเดียวเพื่อแก้ไข:

  • ใช้com0comnull-modem emulatorและกำหนดพอร์ตเสมือน 3 คู่:
    • COM_O- COM_O4สำหรับSTDOUT;
    • COM_E- COM_E4สำหรับSTDERR;
    • COM_I- สำหรับCOM_I4STDIN
  • ให้เป็นศูนย์กลางการอนุกรมกับhub4com.exe( com0comบางส่วน) จากCOM_O4, COM_E4, COM_I4และ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
    • อย่าลืมตั้งค่าพารามิเตอร์การส่งผ่านที่เหมาะสม (คุณเป็นเจ้าของ): --baud...
  • และ<\\.\COM_I >\\.\COM_O 2>\\.\COM_Eรูปแบบบรรทัดคำสั่ง


ในที่สุดสำหรับ:

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

และ:

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

คุณมีบรรทัดคำสั่ง Windows COM4บน19200 8N1...


ขออภัยฉันควรชัดเจนยิ่งขึ้น - ฉันได้แก้ไขโพสต์แล้ว ปัญหาเดียวกันก็เกิดขึ้นกับcmdและโปรแกรมอื่น ๆ ที่ทำงานในพรอมต์คำสั่งของ Windows ก็ใช้ได้และนั่นคือสิ่งที่ฉันพยายามทำที่นี่
TheHansinator

@ Compynerd255 ฉันได้อัปเดตคำตอบเล็กน้อย ...
g2mk

ขอบคุณมาก - ดูเหมือนว่าจะมีแนวโน้ม อย่างไรก็ตามคุณคิดว่าคุณสามารถอธิบายคำสั่งที่คุณใช้เพื่อสร้างฮับได้หรือไม่ ฉันไม่สามารถทำให้ฮับทำงานกับพอร์ตทดสอบเพิ่มเติมได้
TheHansinator

@ Compynerd255 ขยายด้วยคำสั่ง hub4com ...
g2mk

@ Compynerd255 มันใช้งานได้สำหรับคุณหรือไม่
g2mk
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.