2015-09-08 17 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',它工作。 :)) –