簡體   English   中英

讀取CAN輸入時更新GUI元素的效率/速度

[英]Efficiency/Speed of updating GUI Elements while Reading CAN input

在進行此項目之前,我沒有使用控制器局域網(CAN)或ValueCAN3的經驗,並且使用了Intrepid的示例來閱讀消息。 但是,我的GUI顯示我正在讀取的模擬和數字信號的更新效率和頻率出現問題。

我的GUI包含用於模擬通道的16個數字上/下框和36個按鈕,根據數字信號是打開(1)還是關閉(0)變為綠色。 在讀取我的CAN消息時,我隨后更新了GUI控件以顯示適當的反饋。 但是,當我按下插入的CAN操縱桿上的按鈕時,數字通道幾乎會立即做出響應,而模擬信號不會隨着我用來改變信號的弦電位計的更新速度如此之快。 有時,模擬信號需要1-2秒才能響應。

當前,我設置了GUI控件,然后從GUI控件中讀取值,並將這些值通過套接字連接通過UDP發送到另一個應用程序。 我應該將其更改為從直接接收的信號發送數據,而不是從正在設置的GUI控件中讀取數據,但是我認為這不是問題。

我正在使用System :: Timers :: Timer對象來更新,讀取消息和發送數據包。 我需要50hz-100hz的速率,最好接近100hz。 使用另一端的套接字,我可以看到我的數據包發送的頻率足夠高,但是模擬通道的數據卻不會平滑或頻繁地更改。 如果有人對我可能做錯了什么或如何以更有效的方式處理數據有任何想法,請說明。

這是Intrepid讀取CAN消息的代碼段:

// Read the messages every timer event (1000 ms)
        if (m_bPortOpen) // only if the port is open
        {
            // call icsneoGetMessages to read out the messages
            lResult = icsneoGetMessages(hObject,stMessages,&lNumberOfMessages,&lNumberOfErrors);
            if (lResult != 0)
            {
                // a successful read
                mNumberOfErrorsRead = lNumberOfErrors;
                mNumberOfMessagesRead = lNumberOfMessages;  // store the number of messages in the current buffer
            }
        }

我的表單使用以下命令從CanReader對象請求一個味精:

msg = can->GetLatestMsg();

然后該方法獲取最后收到的消息。

public: icsSpyMessage* GetLatestMsg()
{
return &stMessages[mNumberOfMessagesRead - 1];
};

我認為GetLatestMsg()似乎是實現獲取最新消息的一種不好的方法,但是我不完全確定這會在多大程度上影響我的程序,或者我將如何做到這一點,因為CanReader與Form是分開的,所以我必須傳遞一系列我認為不是的消息。 我確實懷疑這可能會跳過消息,因為它僅讀取最后一個抓取的消息,而不讀取導致該消息的消息,如果讀取了這些消息,則應該使GUI輸出在過渡時顯得更平滑。

要注意的另一件事是,我正在讀取6個不同的PGN,模擬信號對應於4個PGN,而2個對應於數字信號。

更新

在玩完我的應用程序並在不同的模擬通道上使用字符串電位器后,我注意到有些通道的更新要多於其他通道。 通過檢查正在訪問的PGN,我發現我比其他人訪問頻率更高。

對於不同的PGN,CAN設備不是以相對相同的速率廣播數據嗎? 如果是,則我的GetLatestMsg()方法一定不能有效地讀取其他PGN。 它每5毫秒讀取一次新的味精。

另外,有人知道我是否應該設置單獨的讀取計時器來分別檢測不同的PGN嗎?

如果有其他代碼可以澄清,請告訴我。

經過大量的測試和調試,我找到了一個穩定的解決方案。 我發布此答案,希望其他人可以從此解釋中受益。

在CANbus上讀取消息時,消息將在總線上廣播,您必須根據參數組名稱(PGN)挑選所需的消息。 應該為不同的數據段定義每個PGN。

例如,引擎轉速將對應於特定的PGN,並且當您檢查緩沖區中的消息時,您將查找具有與引擎轉速相對應的PGN的消息。

就我而言,我正在從所使用的valueCAN3設備讀取/訪問6個不同的PGN。 這些消息中的每一個都包含與模擬和數字信號相對應的不同數據。 效率方面的錯誤與我如何從緩沖區檢索最新消息有關。

當您僅在每個數據包中流式傳輸所有相同的數據時,僅從緩沖區中獲取最新消息或最新消息是有意義的。 但是,就我而言,由於我需要6個不同的PGN,這意味着當我從緩沖區中提取最后一條消息時,它僅對應於6個PGN中的1個,並且由於CANbus上的消息以恆定的速率發送出去,並且以相同的順序,我一直在讀取大約一半的數據包,而錯過了另一半。 通過抓取2個最新數據包,我發現所有通道現在都以應用程序所需的速度進行更新。 我所有的信號變化都沒有明顯的滯后,並且很容易達到我所要求的50hz-100hz范圍。

但是,我認為最佳的解決方案是從緩沖區中讀取每個PGN的最新消息,而不是僅讀取最新的兩個消息,這可能對應於我的6個PGN中的任何一個,因為我讀得更多,然后收到包。

暫無
暫無

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

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