簡體   English   中英

如何從串行端口讀取設備數據

[英]How to Read Device Data From serial port

我有一台設備通過COM13上的COM端口發送數據。 現在,我想讀取該數據並將其顯示在RichTextBox或任何文本控件中。

我已經在IO和IO.Ports的幫助下編寫了應用程序,但是即使設備正在該端口上發送數據,comport.DataRecived事件也不會觸發。

我有一些軟件可以定義端口號,並且可以成功顯示數據,這可以確保我在端口上接收到數據,但是無法接收。

有什么辦法可以讀取數據?

comm.Parity = cboParity.Text;//None
comm.StopBits = cboStop.Text;//One
comm.DataBits = cboData.Text;//8
comm.BaudRate = cboBaud.Text;//9600
comm.DisplayWindow = rtbDisplay;//Null
comm.PortName = "COM13";
comm.OpenPort();

cmdOpen.Enabled = false;
cmdClose.Enabled = true;
cmdSend.Enabled = true;

public bool OpenPort()
{
    if (comPort.IsOpen)
    {
        comPort.Close();
    }

    comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);
    comPort.PortName = _portName;
    comPort.Open();return true;
}

這通常是由於串口配置錯誤所致。 僅打開一個串行端口並等待一些數據輸入是不夠的。您還必須將所有 SerialPort.Properties設置為所需連接的正確值。

一些常見的是BaudRateDataBitsParity ,但是要確保您必須全部設置它們。 甚至諸如RtsEnableReadTimeout類的東西。

您必須設置所有,因為配置狀態將從端口本身保存。 因此,如果一個應用程序打開了這樣的端口,對配置進行了一些更改並將其關閉,則下一個打開端口的應用程序將從此配置開始,直到更改為止。

更新

似乎是一個問題,我從這里看不到。 ;-))

我能給您的唯一建議是使用Monitor工具 ,以更好地了解您的其他應用程序的實際功能以及網絡上的功能。 此外,您可以設置兩個虛擬com端口以測試在一台計算機上(即使在同一應用程序中)的讀寫,從而更好地控制何時發送哪些數據。

您是否已閱讀DataReceived事件的文檔?

MSDN

不保證每個接收到的字節都會引發DataReceived事件 使用BytesToRead屬性確定緩沖區中還有多少數據要讀取。

從SerialPort對象接收數據時,在輔助線程上引發DataReceived事件。 由於此事件是在輔助線程而非主線程上引發的,因此嘗試修改主線程中的某些元素(例如UI元素)可能會引發線程異常。 如果需要修改主窗體或控件中的元素,請使用Invoke將更改請求回發,這將在適當的線程上完成工作。

您發布的代碼段相當粗糙,但是我將ReceivedBytesThreshold屬性設置為1。 這樣可以確保在傳入緩沖區中至少存在一個字節時觸發事件。 干杯

使用PortMon捕獲工作軟件,然后捕獲軟件; 然后比較痕跡。 特別注意所有配置參數,確保它們相同(如Oliver所述)。

暫無
暫無

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

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