2015-09-08 16 views
2

我正在做一個10位ID輸入的鍵盤項目。對於每個按鍵,它將發送'1'或'2'或'3'等到串口。但是,在嘗試以Console.WriteLine(id[i])顯示我的ID緩衝區的內容後,它只顯示串口的第一個鍵盤值。我需要顯示緩衝區中的所有10位數字輸入。我找不到代碼中的錯誤。我使用System.IO.Ports無法從串口獲取所有字符

static void Main(string[] args) 
{ 
    char[] id = new char[10] ; 

    SerialPort port = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One); 

    port.Open(); 

    if (port.IsOpen) 
    { 
     Console.WriteLine("port is now open");  
    } 
    else 
    { 
     Console.WriteLine("port not opened correctly"); 
    } 

    port.Read(id, 0, 10); 

    for (int i = 0; i < 10; i++) 
    { 
     Console.WriteLine(id[i]); 
    } 
    Console.ReadLine(); 
} 
+1

目前看起來不錯。你確定實際上有數據要讀嗎?我通常將讀取過程綁定到'SerialPort'的'DataReceived'事件。另外,你說你相信,但你真的調試過嗎? – nozzleman

+0

你也應該添加你的發送代碼。也許問題在發送方?您還應該將讀取操作的超時設置爲如下所示:https://msdn.microsoft.com/zh-cn/library/system.timeoutexception(v = vs.110).aspx爲了等待較大的值數據到達。 –

+0

標準錯誤,你不能忽略Read()的返回值。只有當你有一臺非常慢的機器時,它纔會是10。你必須保持調用Read(),直到你擁有全部。 –

回答

1

首先檢查你的設備是否正在發送任何數據。 您可以使用RS232端子。

Termite是一款免費的終端軟件。

如果你的硬件被正確地發送數據,

添加DataReceive事件,

port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); 

捕獲接收到的數據,然後使用ReadExisting()方法。

private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) 
{ 
    Console.WriteLine(port.ReadExisting()); 
} 
+0

我其實不太熟悉ReadExisting()方法。它是否存儲數組中收到的所有字符? –

+0

不,它返回一個字符串。你可以找到更多關於它[這裏](https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.readexisting%28v=vs.110%29.aspx) – Sherantha

+0

好的謝謝!我使用'DataReceivedHandler',它工作。 :)) –