2009-06-29 25 views
9

मैं एक यूएसबी पोर्ट (COM25 जब डिवाइस कनेक्ट होता है) से पढ़ता है जो मेरे कोड का परीक्षण करने की कोशिश कर रहा है जो तब बनाया जाता है जब कोई डिवाइस मेरे कंप्यूटर और नाव से कनेक्ट होता है। नाव पर नहीं होने पर मैं यूएसबी डिवाइस को सशक्त नहीं कर सकता इसलिए परीक्षण मुश्किल है। क्या कोई मुझे एक COM पोर्ट अनुकरण करने और डेटा लिखने के बारे में बता सकता है, इसलिए मेरा परीक्षण प्रोग्राम उस अनुरूपित COM पोर्ट से कनेक्ट करने और उस डेटा को पढ़ने में सक्षम है?मैं एक COM पोर्ट का अनुकरण कैसे कर सकता हूं, डेटा लिख ​​सकता हूं और उससे डेटा पढ़ सकता हूं?

मैं इसे जावा प्रोग्राम से पढ़ रहा हूं लेकिन अनुकरण को जावा या किसी विशिष्ट भाषा में होने की आवश्यकता नहीं है। बस एक कार्यक्रम जो COM पोर्ट अनुकरण करेगा और मुझे उससे कनेक्ट करने की अनुमति देगा। मैंने एजीजी सॉफ्टवेयर से एक COM पोर्ट एमुलेटर डाउनलोड किया और ऐसा प्रतीत होता है कि यह मुझे COM25 मानने के लिए लिख रहा है लेकिन मैं इसे अपने जावा परीक्षण से कनेक्ट करने में सक्षम नहीं हूं।

उत्तर

5

इस तरह की समस्या का सामान्य उत्तर उस कोड को लपेटना है जो एक इंटरफ़ेस लागू करने वाले वर्ग में COM पोर्ट से बात करता है। यदि आप इसे फेकाडे (पैटर्न) के रूप में करते हैं तो आप उन COM विधियों को भी बना सकते हैं जिन्हें आप अपने अंत से समझदार कहते हैं।

इंटरफ़ेस को फिर परीक्षण के लिए नकली या फिक्र किया जा सकता है। (टेस्ट ऑब्जेक्ट्स पर एक अच्छा लेख है, लेकिन मैं इसे अभी तक नहीं ढूंढ पाया है।) यहां एक फायदा यह है कि आप एक नकली संस्करण बना सकते हैं जो अपवाद फेंकता है या अन्यथा ऐसा करता है जो बंदरगाह के लिए संभव है लेकिन अभ्यास में इसे करने के लिए मुश्किल है।

2

जहां मैं काम करता हूं, हमने अपने एमुलेटर को COM पोर्ट को खराब नहीं होने के कारण एक ही समस्या हल की। यहाँ कैसे आप यह कर सकते है:

  • IUsbCommService
  • की तरह अपने COM पोर्ट के साथ बात कर के लिए एक इंटरफेस को परिभाषित करें, कुछ अपने वास्तविक कॉम कम्युनिकेशन के सेवा को लागू करें, मानक जावा कॉम एपीआई
  • अपने एमुलेटर के लिए का उपयोग कर, बस एक थ्रेड का किक करें जो उसी प्रकार के डेटा को थकाता है जिसे आप अपने यूएसबी डिवाइस से नियमित अंतराल पर उम्मीद कर सकते हैं।
  • या तो एमुलेटर या वास्तविक सेवा को तार करने के लिए अपनी आईओसी ढांचे का चयन करें (उदाहरण के लिए, वसंत)।
  • जब तक आप अपना कार्यान्वयन तर्क उचित रूप से छिपाते हैं, और जब तक आप अपने इंटरफ़ेस को कोड करते हैं, तब तक आपका सेवा-उपभोक्ता कोड इस पर ध्यान नहीं देगा कि यह वास्तविक यूएसबी डिवाइस या एम्यूलेटर से बात कर रहा है या नहीं।

उदाहरण के लिए:

import yourpackage.InaccessibleDeviceException; 
import yourpackage.NoDataAvailableException; 

public interface IUsbProviderService { 

    public void initDevice() throws InaccessibleDeviceException; 

    public UsbData getUsbData() 
     throws InaccessibleDeviceException, NoDataAvailableException; 
} 

// The real service 
import javax.comm.SerialPort; //....and the rest of the java comm API 

public class UsbService implements IUsbProviderService { 
. 
. 
. 
} 

// The emulator 
public class UsbServiceEmulator implements IUsbProviderService { 
    private Thread listenerThread; 
    private static final Long WAITTIMEMS = 10L; 
    private String usbData; 

    public UsbServiceEmulator(long maxWaitTime) throws InaccessibleDeviceException{ 
     initialize(); 
     boolean success = false; 
     long slept = 0; 

     while (!success && slept < maxWaitTime) { 
      Thread.sleep(WAITTIMEMS); 
      slept += WAITTIMEMS; 

     } 
    } 

    private void initialize() throws InaccessibleDeviceException{ 
     listenerThread = new Thread(); 
     listenerThread.start(); 
    } 

    private class UsbRunner implements Runnable { 
     private String[] lines = {"Data line 1", "Data line 2", "Data line 3"}; 
     public void run() { 
      int line = 0; 
      while(true) { 

       serialEvent(lines[line]); 

       if(line == 3) { 
        line = 0; 
       } else { 
        line++; 
       } 

       try { 
        Thread.sleep(200); 
       } catch (InterruptedException e) { 
        //handle the error 
       } 
      } 

     private void serialEvent(String line) { 
      if(/*you have detected you have enough data */) { 
       synchronized(this) { 
        usbData = parser.getUsbData(); 
       } 
      } 


    } 
} 

आशा इस मदद करता है!

0

मैं fabulatech के आभासी मॉडेम की अनुशंसा करता हूं। http://www.virtual-modem.com

पर यह जाओ आप भी अपने परीक्षण के लिए एक COM पोर्ट पर नजर रखने के पाने के लिए चाहते हो सकता है - आप इसे http://www.serial-port-monitor.com

नाव के साथ गुड लक पा सकते हैं! :)

+0

क्या वर्चुअल मॉडेम में प्रोग्रामर-सुलभ एपीआई है? क्योंकि मैं प्रदान की गई जानकारी से कोई नहीं देख रहा हूं। धारावाहिक बंदरगाह की निगरानी के लिए, उत्पाद अच्छा दिखता है। लेकिन अगर आपको इनपुट के लिए कंसोल की ज़रूरत है, तो हाइपरटर्मिनल भी काम करेगा। – rtperson

2

अब तक सभी उत्तरों के लिए धन्यवाद! काम पर किसी से सिफारिशों के परिणामस्वरूप मैं क्या कर रहा हूं।

  1. डाउनलोड किया AGG सॉफ्टवेयर
  2. डाउनलोड की गई वर्चुअल सीरियल पोर्ट चालक (VSPD) Eltima सॉफ्टवेयर से

(मैं सिर्फ बेतरतीब ढंग से एक नि: शुल्क डेटा एमुलेटर उठाया और आभासी से COM पोर्ट डेटा एम्यूलेटर (CPDE) सीरियल पोर्ट पैकेज। वहाँ विकल्प के बहुत सारे हैं)

  1. VSPD का उपयोग करना, आभासी सीरियल पोर्ट बनाया 24 और 25 और एक आभासी रिक्त मॉडेम केबल के माध्यम से उन्हें जुड़ा हुआ है। यह प्रभावी रूप से 24 पर एक लिखने बंदरगाह और 25.

  2. पर पढ़ने बंदरगाह CPDE Ran, 24 से जुड़ा है और अपने परीक्षण डेटा लिखना शुरू पैदा करता है।

  3. अपने परीक्षण कार्यक्रम, 25 से जुड़ा Ran और से यह

1

मैं com0com का उपयोग परीक्षण डाटा पढ़ने में सक्षम था और यह मैं क्या जरूरत के लिए महान काम करता है।

1

इसके अलावा अन्य सभी, मैं इस अच्छा, मुक्त एमुलेटर https://sites.google.com/site/terminalbpp/ मैं प्रयोग करते हैं जोड़ा करना चाहते हैं। मैं एजीजी कॉम पोर्ट डेटा एमुलेटर का भी उपयोग करता हूं।

2

इस खंड में बहुत से प्रासंगिक उत्तर हैं। लेकिन मेरे लिए, मैं व्यक्तिगत रूप से वर्चुअल सीरियल पोर्ट ड्राइवर का उपयोग करता हूं, जो मेरे लिए सही काम करता है। लेकिन मुझे यह स्वीकार करना होगा कि वर्चुअल पोर्ट बनाने की बात आने पर बहुत सारे विकल्प हैं: freevirtualserialports.com; comOcom कुछ नाम देने के लिए। लेकिन मुझे उनका उपयोग करने का मौका नहीं मिला है, इसलिए इस समस्या को हल करने की मेरी सिफारिश वर्चुअल सीरियल पोर्ट चालक है।

संबंधित मुद्दे