سؤال

هل يعرف أحد عن فئة جيدة (نأمل أن تكون مجانية) لتحل محل فئة .net SerialPort؟إنه يسبب لي مشكلات وأحتاج إلى واحدة أكثر مرونة قليلاً.

راجع موضوعي الآخر حول مشكلتي, ، ولكن في الأساس أحتاج إلى منع إصدار أوامر IOCTL_SERIAL_SET_DTR وIOCTL_SERIAL_CLR_DTR عندما أقوم بفتح المنفذ، لذلك أحتاج إلى شيء أكثر مرونة من الفئة التي يوفرها إطار عمل .net.

هل كانت مفيدة؟

المحلول

منذ عدة سنوات كنت OpenNETCF.IO.Serial قبل إضافة الدعم التسلسلي إلى .net.إنه مخصص للإطار المضغوط ولكني استخدمته لكل من الأجهزة المدمجة وتطبيقات Windows العادية.تحصل على الكود المصدري حتى تتمكن من تعديله بنفسك وهو ما فعلته.

يقوم بشكل أساسي بإنشاء غلاف c# حول الوظيفة التسلسلية المستوردة من kernel32.dll.

قد ترغب أيضًا في إلقاء نظرة على كيفية التقاط منفذ تسلسلي يختفي بسبب فصل كابل USB

هذا هو الرمز الذي استخدمته للاتصال به

     using OpenNETCF.IO.Serial;

     public static Port port;
     private DetailedPortSettings portSettings;
     private Mutex UpdateBusy = new Mutex();

     // create the port
     try
     {
        // create the port settings
        portSettings = new HandshakeNone();
        portSettings.BasicSettings.BaudRate=BaudRates.CBR_9600;

        // create a default port on COM3 with no handshaking
        port = new Port("COM3:", portSettings);

        // define an event handler
        port.DataReceived +=new Port.CommEvent(port_DataReceived);

        port.RThreshold = 1;    
        port.InputLen = 0;      
        port.SThreshold = 1;    
        try
        {
           port.Open();
        }
        catch
        {
           port.Close();
        }
     }
     catch
     {
        port.Close();
     }

     private void port_DataReceived()
     {

        // since RThreshold = 1, we get an event for every character
        byte[] inputData = port.Input;

        // do something with the data
        // note that this is called from a read thread so you should 
        // protect any data pass from here to the main thread using mutex
        // don't forget the use the mutex in the main thread as well
        UpdateBusy.WaitOne();
        // copy data to another data structure
        UpdateBusy.ReleaseMutex();

     }

     private void port_SendBuff()
     {
        byte[] outputData = new byte[esize];
        crc=0xffff;
        j=0;
        outputData[j++]=FS;
        //  .. more code to fill up buff
        outputData[j++]=FS;
        // number of chars sent is determined by size of outputData
        port.Output = outputData;
     }

     // code to close port
     if (port.IsOpen)
     {
        port.Close();
     }
     port.Dispose();

نصائح أخرى

لم أجرب هذا ولكن ربما يمكنك:

  • احصل على الكود المصدري من System.IO.Ports.SerialPort باستخدام العاكس أو مشابه
  • قم بتغيير كود المصدر هذا كما تريد
  • إعادة إنشاء النسخة المعدلة في مساحة اسم مختلفة، واستخدامها

وو. NET منفذ تسلسلي هو معيار ليس فئة مغلقة - أي فرصة يمكنك الحصول على السلوك تحتاجها من فئة فرعية

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top