Последовательная связь, прочитайте 9-й бит

У меня есть приложение, которое соединяется с внешним протоколом используя последовательную связь.

Мне нужно знать, установлен ли бит пробуждения для каждого отправляемого мной пакета (9 бит), а так как скорость связи должна быть ниже 40 мс, а ответ должен быть отправлен менее 20 мс. Структура, инкапсулирует биты, считанные из порта, и отправляет только 8 бит данные мне. Кроме того, я не могу дождаться события ошибки четности из-за проблем с timming.

Мне нужно знать, как я могу прочитать 9 бит, или если есть бесплатная альтернатива http://www.wcscnet.com/CdrvLBro.htm

Ответ 1

Вы пытались поместить функцию последовательного чтения в обработчик события ошибки четности? В зависимости от драйвера это может быть достаточно быстро.

Это не произойдет для определенного протокола игрового автомата, не так ли? Я сделал это для удовольствия для вас. Может быть, это сработает?

{
    public Form1()
    {
        InitializeComponent();
    }

    SerialPort sp;
    private void Form1_Load(object sender, EventArgs e)
    {
        sp = new SerialPort("COM1", 19200, Parity.Space, 8, StopBits.One);
        sp.ParityReplace = 0;
        sp.ErrorReceived += new SerialErrorReceivedEventHandler(sp_SerialErrorReceivedEventHandler);          
        sp.ReadTimeout = 5;
        sp.ReadBufferSize = 256;
        sp.Open();
    }

    object msgsLock = new object();
    Queue<byte[]> msgs = new Queue<byte[]>();
    public void sp_SerialErrorReceivedEventHandler(Object sender, SerialErrorReceivedEventArgs e)
    {
        if (e.EventType == SerialError.RXParity)
        {
           byte[] buffer = new byte[256];            
           try
           {                   
               int cnt = sp.Read(buffer, 0, 256);
               byte[] msg = new byte[cnt];
               Array.Copy(buffer, msg, cnt);
               if (cnt > 0)
               {
                   lock (msgsLock)
                   {
                       msgs.Enqueue(msg);
                   }
               }
           }
           catch
           {
           }              
        }
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        if (msgs.Count > 0)
        {
            lock (msgsLock)
            {
                listBox1.Items.Insert(0, BitConverter.ToString(msgs.Dequeue()));
            }
        }
    }
}

}

В любом случае, для большего контроля над последовательным портом я предлагаю использовать вызовы win32, чтобы получить то, что вы хотите.

http://msdn.microsoft.com/en-us/magazine/cc301786.aspx