2010-09-25 62 views
3

我想从秤RS232接口读取数据。它通过串行端口发送一个连续的ASCII字符串流,我很难得到。我只想得到它发出的一行数据。我猜想我会使用Readline来获取数据,但是当我运行它时,它只会锁定PC。我认为它是试图获得所有的数据,并不会停止,直到数据停止?这里是我正在使用的代码:从串口读取线锁定

private void button1_Click(object sender, EventArgs e) 
    { 
     serialPort1.PortName = "COM4"; 
     serialPort1.BaudRate = 9600; 
     serialPort1.DataBits = 8; 
     serialPort1.Parity = Parity.None; 
     serialPort1.StopBits = StopBits.One; 

     //opening the serial port 
     serialPort1.Open(); 

     string str = serialPort1.ReadLine(); 

     MessageBox.Show(str); 

     serialPort1.Close(); 

    } 

你能帮我确定如何只获得一行输出数据并关闭连接吗?

+0

当你说“锁定电脑”,它真的锁定整个电脑,或只是你的程序? – 2010-09-25 18:14:36

+0

对不起,我的意思是它锁定了程序。 – muncherelli 2010-09-25 18:16:00

+0

@user:此线程看起来回答给我。你还需要什么? – 2010-09-30 17:32:04

回答

2

SerialPort.ReadLine被定义为阻止“直到第一次出现NewLine值”,其中NewLine默认为换行符。你在流中发送了一个换行符吗?请注意,换行字符(ASCII 0x0A)与您可能发送的回车符(ASCII 0x0D)不同。

如果需要,您可以重新定义NewLine,或者如果行结尾不正确,可以使用SerialPort.ReadTo来读取给定的字符串。您也可以设置read timeout

您可能更喜欢使用SerialPort.Read重载之一从端口读取给定数量的字节,而不是行。

如果这些都不适用,请确保您确实在发送数据(您认为自己的位置) - 调出超级终端/ TeraTerm /您最喜欢的串行终端,使用上面使用的相同串行端口设置进行配置,并确保你看到你期望看到的数据。

0

一个理想的解决方案是产生一个工作线程,从串口实际读取(因此,线程可以整天被阻塞而不会阻碍主应用程序线程)。一旦收到数据,它就可以广播一个事件,注意到已收到数据以及该数据是什么。该线程将通过事件与主应用程序线程进行通信。