串口通信延迟的c#实现

本文关键字:实现 延迟 通信 串口 | 更新日期: 2023-09-27 18:03:03

我正在尝试编写一个c#应用程序,读取UART数据在115200bps。数据格式为:

ID: XXX Data: XX XX XX XX XX XX XX XX
ID: XXX Data: XX XX XX XX XX XX XX XX
ID: XXX Data: XX XX XX XX XX XX XX XX

其中X代表十六进制值。

每个传输以换行符(''n')结束。下面是我的c#应用程序的代码。它只是逐行读取数据,将ID和data字段解析为变量,然后将数据插入dataGridView对象。如果表中不存在ID条目,则添加它和它的数据。如果ID条目已经存在(是一个重复),则使用新数据更新重复ID条目的现有数据。这让我可以看到列出的ID中的数据是如何变化的。

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            serialPort.PortName = "COM11";
            serialPort.BaudRate = 115200;
            serialPort.Open();
            serialPort.DiscardOutBuffer();
            serialPort.DiscardInBuffer();
        }
        private delegate void SetTextDeleg(string text);
        private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            string CAN_tx = serialPort.ReadLine();
            this.BeginInvoke(new SetTextDeleg(processCAN), new object[] { CAN_tx });
        }
        void processCAN(string CAN_tx)
        {
            CANout_txtbox.Text = CAN_tx;
            Match match = Regex.Match(CAN_tx, @"^ID:'s([A-F0-9]+)'s+Data:'s([^'r]+)", RegexOptions.IgnoreCase);
            if (!match.Success) return;
            string pid = match.Groups[1].Value.Trim();
            string data = match.Groups[2].Value.Trim();
            string raw = pid + " " + data;
            string[] row = raw.Split(' ');
            int rowIndex = -1;
            try
            {
                DataGridViewRow matchRow = dataTable.Rows
                    .Cast<DataGridViewRow>()
                    .Where(r => r.Cells["PID"].Value.ToString().Equals(match.Groups[1].Value))
                    .First();
                rowIndex = matchRow.Index;
            }
            catch { }
            if (rowIndex != -1)
            {
                dataTable.Rows[rowIndex].SetValues(row);
            }
            else
            {
                dataTable.Rows.Add(row);
            }
        }
    } 
}

程序工作,然而,似乎有一个问题与串行通信性能。当我在控制台中查看数据流时,我可以看到每秒发送数百个ID。(ID每10、20、50、100、110毫秒重复一次,这取决于ID)当我在c#应用程序中查看数据时,我可能每秒看到50个ID。这将导致数据发送到c#应用程序的时间和数据在c#应用程序中更新的时间之间的巨大延迟。

是否有某种方法可以设置我正在使用的COM端口的优先级?还是有更深层次的问题?我尝试降低串行缓冲区,更改超时和触发接收到的数据事件所需的字节数,但没有任何影响。

我已经在Python中开始了一种新的方法,因为我能够近乎实时地显示数据,但是,我想了解在我的c#应用程序中发生了什么,阻碍了我所需的性能。

谢谢!

串口通信延迟的c#实现

我看到每秒大约50个ID。

这在生理上是不可能的,你的眼睛还不够好,看不清这么快的变化。您用控制台模式程序欺骗了自己,您从在控制台窗口中滚动的行速度推断出每秒数百次更改。当然,我从来没有真正读过这些书。

当你更新网格中的行时,这种生理效应停止工作。现在你所做的和电影院里的放映机所做的是一样的。它以每秒24帧的速度更新帧。或者你在电视上看节目,它以每秒25或30帧的速度更新。你不能看到单独的帧,它们变化太快,你的眼睛无法观察到。虽然24帧是较低的,但在数字投影普及之前的原始速率,闪烁往往是明显的。

人的眼睛以每秒20次左右的速度更新,再快一点,它就会变得模糊。这在其他方面是一件好事,它帮助广播公司和电影院的剥削者在昂贵的设备上花了很多钱,这种设备会在几分钟内吃掉一卷胶卷。

长话短说,你正在编写一个不可用的程序。你的用户会看着这些闪烁的数字,很快失去兴趣。将大量的数据转化为有用的信息是你必须考虑的事情,这里没有什么很明显的事情会跳到你的脑海里。

这可以通过使用后台工作人员来处理数据和主要只是为了做数据网格[GUI]更新来解决?这可能只是我的问题,但这些天我的大部分数据处理都是在bw-ers中进行的。

编辑:另一个想法,取决于你期望的数据有多少"行",一个想法可能是将信息存储在哈希表(非常快的搜索)或数据表中?当添加更多元素时,"延迟"是否会变得更糟?

编辑2:一个关于如何正确使用后台工作器的好教程[如果你决定使用它们!)