处理串口上收到的大量数据

时间:2015-12-17 11:45:26

标签: c# serial-port

我每秒收到串行端口250个数据包的数据,每个数据包大小为23个字节。我正在使用以下代码处理串行端口上收到的数据。

    private SerialPort connectComPort = new SerialPort();
    List<byte> receivedBytes1 = new List<byte>();
    public Form1()
    {
        InitializeComponent();

        connectComPort.DataReceived += new SerialDataReceivedEventHandler(receiveData);


        //Background worker for parsing packet
        m_oWorker = new BackgroundWorker();
        m_oWorker.DoWork += new DoWorkEventHandler(m_oWorker_DoWork);
        m_oWorker.ProgressChanged += new ProgressChangedEventHandler(m_oWorker_ProgressChanged);
        m_oWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(m_oWorker_RunWorkerCompleted);
        m_oWorker.WorkerReportsProgress = true;
        m_oWorker.WorkerSupportsCancellation = true;
    }

    private void buttton_Click(object sender, EventArgs e)
    {
        m_oWorker.RunWorkerAsync();
    }

    void m_oWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        modprocessReceivedBuffer();
        m_oWorker.ReportProgress(100);
    }

    private void receiveData(object sender, SerialDataReceivedEventArgs e)
    {
        while (connectComPort.BytesToRead > 0)
            receivedBytes1.Add((byte)connectComPort.ReadByte());
    }

    private void modprocessReceivedBuffer()
    {
        while (1 == 1)
        {
            if (receivedBytes1.Count() != 0)
            {
                var tiff = receivedBytes1.GetRange(0, (int)receivedBytes1[4]).ToList<byte>();
                receivedBytes1.RemoveRange(0, (int)receivedBytes1[4]);
                modifiedProcess(tiff);
            }
            else
            {
                Thread.Sleep(100);
            }
        }
    }

因此,我只是将列表中的串行端口上收到的数据排队,我正在后台线程上运行一个进程,其工作是解析数据包。我的问题是他们处理这么大的数据比这更好的方法。目前它的250包/秒,但这个速率可以增加到16000包/秒。

1 个答案:

答案 0 :(得分:1)

这(VB转换为C#)就是我要做的。这将消除您最终将有两个线程访问列表的问题。我还改变了代码,一次读取所有字节。代码中有注释指向要解决的区域。

System.Threading.AutoResetEvent dataRcvd = new System.Threading.AutoResetEvent(false);

private void receiveData(object sender, SerialDataReceivedEventArgs e)
{
    dataRcvd.Set();
}

private void modprocessReceivedBuffer()
{
    while (1 == 1) {
        dataRcvd.WaitOne();
        while (connectComPort.BytesToRead > 0) {
            byte[] buf = new byte[connectComPort.BytesToRead];
            int bytsRead = connectComPort.Read(buf, 0, buf.Length);
            if (buf.Length != bytsRead) {
                Array.Resize(ref buf, bytsRead);
            }
            //what if there is more than one message in receivedBytes1
            if (receivedBytes1.Count() != 0) {
                //I think a check is needed for enoung bytes in receivedBytes1????????
                var tiff = receivedBytes1.GetRange(0, Convert.ToInt32(receivedBytes1(4))).ToList<byte>();
                receivedBytes1.RemoveRange(0, Convert.ToInt32(receivedBytes1(4)));
                modifiedProcess(tiff);
            }
        }
    }
}