簡體   English   中英

使用C#的串行端口通信延遲

[英]Serial Port Communication Delay using C#

我正在嘗試編寫一個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和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,ID每10、20、50、100、110毫秒重復一次)當我在C#應用程序中查看數據時,每秒可能看到50個ID。 這導致將數據發送到C#應用程序的時間與在C#應用程序中更新數據的時間之間的巨大延遲。

有什么方法可以設置我正在使用的COM端口的優先級? 還是這里有更深層次的問題? 我嘗試降低串行緩沖區,更改超時和觸發數據接收事件所需的字節數,但沒有任何影響。

我已經在Python中啟動了一種新方法,因為我能夠近乎實時地顯示數據,但是,我想了解C#應用程序中正在發生的妨礙我所需性能的事情。

謝謝!

我看到每秒可能有50個ID。

這在身體上是不可能的,您的眼睛還不夠好,無法以這種速度看到變化。 您以控制台模式程序自欺欺人,從每秒在控制台窗口中滾動的速度推斷出每秒數百次更改。 當然,從不真正閱讀其中任何一個。

當您更新網格中的行時,這種生理效果將停止工作。 現在,您正在做與電影院中的電影放映機相同的操作。 它以每秒24個的速度更新幀。 或您觀看過電視節目的電視,它以每秒25或30的速度更新幀。 您看不到各個幀,它們變化太快,以至於您的眼睛無法觀察到。 盡管24 fps是低端,但在數字投影變得普遍之前的原始速率下,閃爍趨於明顯。

人眼每秒大約可聽到20次更新,然后以更快的速度運轉,它變得模糊起來。 否則,這是一件好事,它可以幫助廣播公司和劇院開發者在昂貴的設備上花費大量金錢,而這種設備將在幾分鍾內吃完一卷膠卷。

長話短說,您正在編寫一個無法使用的程序。 您的用戶將看到閃爍的數字,並很快失去興趣。 將數據轉換為有用的信息是您必須要考慮的事情,這里沒有什么顯而易見的想法。

這可以通過使用后台工作人員處理數據來解決,而主要是為了進行數據網格[GUI]更新? 可能只有我一個人,但是這些天我的大部分數據處理都生活在倉庫中。

編輯:另一種想法,取決於您期望的數據“行”數,一個想法可能是將信息存儲在哈希表(搜索速度非常快)或數據表中? 當添加更多元素時,“延遲”會變差嗎,它是累積的嗎?

Edit2: 關於如何正確使用后台工作程序的很好的教程 [您應該決定使用它們!]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM