C# 用C语言实现串口通信延迟#

C# 用C语言实现串口通信延迟#,c#,serial-port,uart,C#,Serial Port,Uart,我正试图编写一个C#应用程序,以115200bps的速度读取UART数据。数据格式如下: 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和数据字段解析为变量,然后将数据插入dataGridView对象。

我正试图编写一个C#应用程序,以115200bps的速度读取UART数据。数据格式如下:

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和数据字段解析为变量,然后将数据插入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);
            }
        }
    } 
}
命名空间窗口窗体应用程序1
{
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
serialPort.PortName=“COM11”;
serialPort.BaudRate=115200;
serialPort.Open();
serialPort.discardorBuffer();
serialPort.DiscardInBuffer();
}
私有委托void SetTextDeleg(字符串文本);
private void serialPort_DataReceived(对象发送方,System.IO.Ports.SerialDataReceivedEventArgs e)
{
字符串CAN_tx=serialPort.ReadLine();
this.BeginInvoke(新的SetTextDeleg(processCAN),新对象[]{CAN_tx});
}
无效处理CAN(字符串CAN\U tx)
{
CANout_txtbox.Text=CAN_tx;
Match Match=Regex.Match(CAN_tx,@“^ID:\s([A-F0-9]+)\s+数据:\s([^\r]+)”,RegexOptions.IgnoreCase);
如果(!match.Success)返回;
字符串pid=match.Groups[1]。Value.Trim();
字符串数据=match.Groups[2]。Value.Trim();
字符串原始=pid+“”+数据;
字符串[]行=原始分割(“”);
int rowIndex=-1;
尝试
{
DataGridViewRow matchRow=dataTable.Rows
.Cast()
.Where(r=>r.Cells[“PID”].Value.ToString().Equals(match.Groups[1].Value))
.First();
rowIndex=matchRow.Index;
}
捕获{}
如果(行索引!=-1)
{
dataTable.Rows[rowIndex].SetValues(行);
}
其他的
{
dataTable.Rows.Add(行);
}
}
} 
}
程序运行正常,但串行通信性能似乎有问题。当我在控制台中查看数据流时,我可以看到每秒发送几百个ID。(ID每10、20、50、100、110毫秒重复一次,具体取决于ID)当我在C#应用程序中查看数据时,我每秒可能看到50个ID。这会导致数据发送到C#应用程序和数据在C#应用程序中更新之间的巨大延迟

有没有办法设置我正在使用的COM端口的优先级?还是有更深层次的问题?我尝试降低串行缓冲区、更改超时以及触发数据接收事件所需的字节数,但没有任何效果

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

谢谢

我每秒看到50个身份证

这在身体上是不可能的,你的眼睛不够好,看不到以这种速度变化。你用控制台模式程序愚弄了自己,你从行在控制台窗口上滚动的速度推断出每秒数百次的变化。当然,从来没有读过任何一本

当您更新网格中的行时,这种生理效应将停止工作。现在你做的事情和电影院里的电影放映机一样。它以每秒24帧的速度更新帧。或者你在电视上看一个节目,它会以每秒25或30帧的速度更新画面。你看不到单独的帧,它们变化太快,你的眼睛无法观察到。尽管24 fps处于低端,但在数字投影变得普遍之前的原始速率,闪烁往往很明显

人类的眼睛会以每秒20次的速度变暗,再快一点,它就会变得模糊。这在其他方面是一件好事,它帮助广播公司和剧院开拓者在昂贵的设备上花费大量资金,这种设备可以在几分钟内吃掉一卷电影

长话短说,您正在编写一个无法使用的程序。你的用户会看到那些疯狂闪烁的数字,很快就会失去兴趣。把大量的数据转化为有用的信息是你必须考虑的事情,这里没有什么非常明显的想法

我每秒看到50个身份证

这在身体上是不可能的,你的眼睛不够好,看不到以这种速度变化。你用控制台模式程序愚弄了自己,你从行在控制台窗口上滚动的速度推断出每秒数百次的变化。当然,从来没有读过任何一本

当您更新网格中的行时,这种生理效应将停止工作。现在你做的事情和电影院里的电影放映机一样。它以每秒24帧的速度更新帧。或者你在电视上看一个节目,它会以每秒25或30帧的速度更新画面。你看不到单独的帧,它们变化太快,你的眼睛无法观察到。尽管24 fps处于低端,但在数字投影变得普遍之前的原始速率,闪烁往往很明显

人类的眼睛会以每秒20次的速度变暗,再快一点,它就会变得模糊。这在其他方面是一件好事,它帮助广播公司和剧院开拓者在昂贵的设备上花费大量资金,这种设备可以在几分钟内吃掉一卷电影

长话短说,你是