簡體   English   中英

VisualStudio Visual C#數據不正常觸發(從Arduino接收數據)

[英]VisualStudio Visual C# DataReceived Firing Erratically (Receiving Data From Arduino)

我正在Visual Studio中用C#編寫程序。 它的基本工作方式是讓我的設備以每秒250個樣本(21個字節的數據包)的速度進行采樣,將數據中繼到Teensy 3.2,然后再通過USB將其中繼到計算機進行處理。

我正在使用serialPort_DataReceived來確定何時接收數據,並將ReceivedBytesThreshold設置為8。如果我正確理解了這一點,則只要接收到至少8個字節,它就會觸發serialPort.DataReceived事件並從那里開始。 但是,我的程序發生的情況是它在收到4095字節后觸發,然后在1字節后觸發,然后在4095之后觸發,依此類推。

另外,我將Teensy換成Arduino Due。 在這種情況下,它更加穩定,可以按預期在每個數據包之后觸發,但發送4095字節后會觸發奇怪的1字節數據包。 如果我將設備的速度提高到每秒8000個樣本(目標速率),則每隔3個數據包左右就會開始觸發serialPort.DataReceived觸發。 我認為這是Arduino降低速度的速度,這就是為什么我切換到Teensy的原因,因為它運行速度快得多。

我知道采樣設備運行良好,因為我有三個采樣器,將它們交換出去可以提供相同的結果,並且它們被設計為每秒處理多達16000個采樣。 同樣,我使用Realterm查看傳入的數據流,它看起來是恆定的,而不是塊,因此我在代碼中找到了它。 相關位如下。

public Form1()
    {
        InitializeComponent();
        serialPort1.PortName = "COM13";
        serialPort1.BaudRate = 115200;
        serialPort1.DataBits = 8;
        serialPort1.ReceivedBytesThreshold = 21;
        serialPort1.RtsEnable = true;
        serialPort1.DtrEnable = true;
        serialPort1.Handshake = System.IO.Ports.Handshake.XOnXOff;
    }
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        byte[] buffer = new byte[serialPort1.ReadBufferSize];
        int bytesRead = serialPort1.Read(buffer, 0, buffer.Length);
        RxString = BitConverter.ToString(buffer, 0, bytesRead);
        fixedString = RxString.Replace("-", "");
        file.WriteLine(fixedString);
        file.WriteLine("THIS IS A TEST");
        this.BeginInvoke(new EventHandler(graph)); 
        this.BeginInvoke(new EventHandler(DisplayText));
    }

這是輸出的一些圖像。 Teensy: http://i.imgur.com/0qzIpaT.png由於: http://i.imgur.com/5O3fpPo.png

請注意,標頭為B6B0C0

與計算機中的大多數其他硬件相比,串行端口的運行速度非常慢。 您不能依靠一次性接收所有發送的數據。 串行實際上沒有“數據包”的概念,也沒有任何大於一個字節的不可分割的單元。

接收部分消息並不罕見。 如您所見,數據的分解方式可能會有所不同。 您可以在一側發送1000字節,而在另一側發送500和500。 那很正常。 如果看一下串行協議,許多實現分隔符(通常為0字節),而字節長度是內容的一部分。 這可以幫助用戶確定什么構成整個消息。

因此,將其概括起來:您需要知道一條消息何時開始以及將持續多長時間。 如果沒有完整的消息,則需要保存數據並等待更多,然后重復進行直到出現完整的消息為止。 您不能期望僅僅將字符串轉換為字節的結果,而期望它完整地出現並且可以很容易地轉換為另一端的字符串。

暫無
暫無

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

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