簡體   English   中英

.NET 3.5 SP1 SerialPort類是否在傳輸時附加額外的0?

[英]Does .NET 3.5 SP1 SerialPort class append extra 0's on transmission?

更新

原來錯誤是在加密處理器代碼中解決的。 但是現在遇到看起來可能是握手問題。

在第一次傳輸時,我們從設備返回的單個字節的值為0xFF(不知道為什么,與我合作的工程師對RS-232也不太熟悉)。 然后,一切運行正常(只需一次向設備發送一個字節,然后等待匹配的回顯)。 但是,在設備或.NET應用程序鎖定或拒絕發送或接收之前,設備和.NET應用程序一次都不能發送多個字節。


在工作中,我正在編寫一個應用程序,該應用程序通過RS232與設備內部的加密處理器接口,以對設備內部的閃存模塊進行重新編程。

為了讓事情變慢並確保所有標題正確,我們使用SerialPort.Write()一次寫入一個字節。 但是,當我們在加密處理器上運行代碼時,它將在每個字節之間讀取一個額外的NULL。 當我在具有兩個串行端口和交叉電纜的本地計算機上測試.NET代碼時,我捕獲了HyperTerminal或Putty中的輸出,並且在Notepad ++中查看日志時沒有多余的NULL。

但是,進一步使事情復雜化的是,當我們通過超級終端手動向加密處理器逐字節鍵入消息時,它僅將輸入讀取為單個字節,而沒有額外的NULL(與.NET應用相比)。 在將.NET寫入SerialPort時,有人對.NET有什么神秘的經驗嗎?

我們正在初始化一個測試塊:

byte[] testBytes = new byte[] { (byte)'A', (byte)'B', (byte)'C', (byte)'D', (byte)'E', (byte)'F', (byte)'G', (byte)'H' };
byte[] byteArray = new byte[256];
for (int i = 0; i < 32; i++)
{
    testBytes.CopyTo(byteArray, i * 8);
}

並發送與此:

public void StutterSend(byte[] data, long delayMs)
{
    bool interactive = false;
    if (delayMs < 0)
        interactive = true;

    for (int i = 0; i < data.Length; i++)
    {
        serialPort.Write(data, i, 1);
        if (interactive)
        {
            WriteLine("Sent byte " + (i + 1) + " of " + data.Length + ". Press any key to send moar.");
            Console.ReadKey();
        }
        else
        {
            double timer = DateTime.Now.TimeOfDay.TotalMilliseconds;
            do { } while ((DateTime.Now.TimeOfDay.TotalMilliseconds - timer) < delayMs);
        }
    }
    WriteLine("Done sending bytes.");
}

我們的SerialPort配置了所有匹配的參數(停止位,數據位,奇偶校驗,波特率,端口名稱),並且握手設置為None(這就是uart驅動程序的工作方式)。

設置為serialPortEncoding屬性是什么? SerialPort.Write( byte[], int, int)的文檔說,它通過Encoder對象運行其數據(對我來說, byte[]確實沒有意義)。 它應該默認為ASCIIEncoding ,但似乎可能設置為其他內容。 嘗試將其顯式設置為ASCIIEncoding ,看看是否有幫助。 當我在.NET中做一些串行端口與嵌入式板進行通信時,我不記得這是否對我來說是個問題。

請注意,即使使用ASCIIEncoding ,您也會獲得一些(可能是不需要的)數據轉換-如果嘗試發送大於127的值,編碼器會將其轉換為“?” 因為它不是有效的ASCII字符。 我想不起來我是如何獲得串行端口以簡單地保留數據的-我將不得不深入研究一些源代碼...

關於您的更新,聽起來您的加密處理器還有更多問題。 返回0xff的原因可能是RS232端口的Tx線路上的意外故障<= 1位時間。 PC將其解釋為起始位。 故障后,Tx線返回到標記狀態,並且由於PC上的UART具有起始位,因此它將“數據”位解釋為全1(標記狀態的值)。 標記狀態也是停止位的正確值,因此您的PC UART已收到一個值為0xff的有效字節。 請注意,毛刺相對於RS232數據速率而言可能非常快,並且仍被視為起始位,因此,請您的工程師使用示波器以正常模式/單序列觸發器查看此行以確認這一點。

SerialPort將Parity屬性設置為Parity.None(如果未指定)。 這意味着,如果您的接收方希望獲得Partity位,則只要您不明確告訴SerialPort隨發送的數據一起發送奇偶校驗位,它就永遠不會得到Partity位。

而且它在超級終端上運行良好的事實可能是超級終端默認情況下使用奇偶校驗位(我不太了解超級終端)。

暫無
暫無

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

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