串行通信、读取第9位

13

我有一个应用程序,它使用串口通信连接外部协议。

我需要知道每个发送到我的数据包中是否设置了唤醒位(第9位),并且通信速率必须低于40毫秒,并且在20毫秒内必须发送响应。该框架封装了从端口读取的位,并仅向我发送8位数据。此外,由于时间问题,我不能等待奇偶校验错误事件。

我需要知道如何读取第9位,或者是否有免费替代方案,可参考http://www.wcscnet.com/CdrvLBro.htm


1
无法使用标准串口硬件、驱动程序和操作系统可靠地实现此功能。您无法可靠地将额外的位与数据字节同步,并且在Windows用户模式下无法获得保证的20毫秒响应。这些方案是为了将用户绑定到专有和昂贵的供应商解决方案而发明的。要么购买它,要么放弃它。 - Hans Passant
我已经在那个时间之前了。我只需要知道第9位是否被设置,因为基于这个,我的响应应该改变。我将发布更多声称在 .net 上实现此功能的库的示例,就像我发布给免费替代品的那一个一样。 - miguel.hpsgaming
1个回答

8

你尝试过将串口读取函数放在奇偶校验错误事件处理程序中吗?根据驱动程序的不同,这可能足够快。

这难道不是为某个老虎机协议而做的吗?我为了你的乐趣做了这个。也许它会起作用?

{
    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


我已经尝试过那个方法,但在错误事件发生之前,我可能已经解析了多个数据包,这就是为什么我在寻求另一种解决方法。时间非常关键。 - miguel.hpsgaming
请问您使用的是哪种串口硬件设备?USB转串口,内置COM端口等? - rare
我同时使用它们,并且如果需要,可以将串行硬件设备更改为我找到解决方案的系统要求。 - miguel.hpsgaming
好的,这可能与此相关或不相关,但无论如何,你都应该知道。大多数USB串口设备在快速定时方面都不能正常工作。然而,内置的COM端口通常可以正常工作。 - rare
1
更多:一些USB设备具有高级定时设置,这将有意引入100毫秒或更长的延迟,或者可以将缓冲区大小设置为仅64字节。对于这些设备,您几乎无能为力,无法使它们正常触发事件。USB可能具有延迟设置,您必须尽可能地将其设置为低(1ms等)。通常情况下内置COM端口是可以工作的。我需要做的就是将内置设备的“接收缓冲区”大小更改为尽可能小,以便触发事件。以太网串行设备永远不起作用。 - rare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接