2009-05-21 54 views
2

我很新,通過.net通過串行端口發送數據,我注意到實現TCP對應後我不會得到這很容易與串行!需要.NET串行端口幫助,主要是通過多個「數據包」接收數據

因此,爲了從頂部開始,我幾乎沒有與我的串行雙向通信的實現,我只是陷入幾件事情: -

  1. 我讀被拆分到多個消息或接收作爲通過COM端口的碎片化響應,我不知道我可能需要什麼設置,或者我應該如何編寫代碼來修復此問題。什麼會造成這種情況?我在一個斷點上SerialPort_DataReceived.

基本上數據檢查該消息應當被髮送爲:

01: LS|DA090521|TI111043|q 
02: PS|RN102|PTC|TA1040000|P#0|DA090521|TI111429|j 

但它是被分割(在每個隨機位置請求的讀)

01: LS|DA090521|TI111 
02: 043|q 
03: PS|RN102|PTC|TA1 
04: 0000|P#0|DA090521|TI111429|j 

- 問題1已經回答,謝謝Chris W.等人!我現在有了我期望從片段逐步構建的消息(尋找STX,{msg body},ETX),然後在消息完全構建時執行一個動作,並且使用線程安全隊列進行操作,非常高興。

。 2.我收到「|」符號通過我幾乎每個週期讀取,這是由於我設置了錯誤的命令,串行通信的神器,或設備發送給我的東西? (我不這麼認爲,因爲超級終端連接性顯示這個字符沒有被連續發送。)

。 3.你能否確認我正在用各自的方法正確讀寫數據。

謝謝你們看我的其他兩個問題。

相關代碼如下:

... 
    //       COM3, 9600,  None, 8,  One 
    SerialPort = new SerialPort(comPort, baudRate, parity, dataBits, stopBits); 
    if (SerialPort.IsOpen) SerialPort.Close(); 
    // SerialPort.RtsEnable = true; // Request-to-send 
    // SerialPort.DtrEnable = true; // Data-terminal-ready 
    SerialPort.ReadTimeout = 150; // tried this, but didn't help 
    SerialPort.WriteTimeout = 150; // tried this, but didn't help 
    SerialPort.Open(); 

    SerialPort.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataReceived); 
} 

void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    // Process received data 
    SerialPort sp = (SerialPort)sender; 
    byte[] buffer = new byte[sp.BytesToRead]; 
    int bytesRead = sp.Read(buffer, 0, buffer.Length); 

    // message has successfully been received 
    message = Encoding.ASCII.GetString(buffer, 0, bytesRead); 
} 

public bool SendMessage(string text) 
{ 
    // Only send message if a client is connected 
    if (SerialPort != null && SerialPort.IsOpen) 
    { 
     byte[] buffer = Encoding.ASCII.GetBytes(text); 
     SerialPort.Write(buffer, 0, buffer.Length); 
    } 
} 

回答

4

我讀正在跨越多個消息

這是正常的,預期的,必然的行爲分開。它也可能發生在TCP數據上。串行接口只是無盡的字節流。應用程序有責任將這些字節重新打包爲數據包。

如果數據包邊界的位置很重要,並且如果您無法確定數據包邊界應該從接收數據中看到的位置,那麼您可能需要重新考慮數據的格式,以便您可以可以告訴數據包邊界在哪裏。

我收到「|」通過我的閱讀幾乎每個週期的符號

該字符的十六進制值是什麼?查看是否將Handshake屬性設置爲XOnXOffRequestToSendXOnXOff可改善情況。

+0

感謝Chris的回覆,非常感謝。好吧,也許我試圖把它放在太多的盒子裏,如果你說的是我們幾乎需要做我們自己的'數據包管理',可惜(我沒有意識到)可能是序列背後的基礎運輸,那麼我可能需要詢問味精/味精字符的開始,將其包裝起來,清潔並沖洗並重復。 – GONeale 2009-05-21 05:40:29

+0

'|'等於124 btw。 – GONeale 2009-05-21 05:41:30

+0

我不知道,默認的XON/XOFF值是0x13和0x11: - http://en.wikipedia.org/wiki/XON – ChrisW 2009-05-21 05:45:51

3

在較低級別,串口可以決定何時觸發數據接收事件。它可能決定在「完整」數據包到達之前這樣做。但是,它看起來像在預期的數據集中有一個結束符。如果是這樣你可以做以下(請注意,我已經改變你的SerialPort分配以避免出現語法混亂:

 p = new SerialPort(PortName, BaudRate, Prty, DataBits, SBits); 
     p.NewLine = Terminator; 

其中終結者是包含您的終止符(一個或多個)的字符串然後你可以使用SerialPort.ReadLine()(和SerialPort.WriteLine()如果適用)。這可能至少有助於你的第一個問題。

3

我已經做了很多的Win32串口編程,但只是一點.NET,所以採取我的意見穀物鹽

我的閱讀正在拆分跨多個消息或接收ved作爲COM端口上的碎片響應,我不知道我可能需要什麼設置,或者我應該如何編寫代碼來修復此問題。

正如其他人所說,這是完全正常的。根據DCE側的設備類型,您可能必須自己重新打包。我不確定你喜歡什麼類型的設備,所以我不能說更多。

如果你想獲得更多的數據,你可以嘗試以下方法:

  • 使用同步I/O調整System.Int32 ReceivedBytesThreshold財產
  • 並指定字節固定數量的閱讀,而不是基於事件的接待

我收到「|」符號通過我幾乎每個週期讀取,是 這是由於我有一個命令我設置了 不知何故,一個神器串行 通信,或東西設備 發送給我? (我不這麼認爲 但是,作爲超級終端連接 揭示了這個人物不被 連續發送。)

如果您想了解到底是怎麼回事過線,檢查出PortMon from SysInternals,免費當您通過線路傳輸數據時,它將監聽您的com端口。這似乎是技術性的,但實際上你只需要看看IRP_MJ_WRITE和IRP_MJ_READ命令,並且在行中你將看到以字節爲單位的長度和通過線路發送的數據。有了這個,你應該能夠知道問題是.NET SerialPort對象還是設備實際發送「|」在線。

,你能否證實我在 相應的方法正確地閱讀和 寫入數據。

它看起來適合接收數據的基於事件的方法。