SerialPort类和DataReceived事件……获取字节。 使用ReadLine还是ReadExisting? 任何例子?

我想通过串口发送和接收字节。 我的接收器应该异步获取字节。 我写了下面似乎有效的小例子,但它给我留下了不安的感觉。

  1. 我真的应该使用WriteLine,ReadLine吗? 正如现在所写的那样,是否有可能为每个字节调用事件处理程序m_port_DataReceived中的代码? 这是我对“DataReceived”事件的理解; 也许我错了。 ReadLine会阻塞,直到它看到行尾字符?

  2. 我应该以某种方式在事件处理程序中使用“if(e.EventType == SerialData.Eof)”构造吗? 你可以看到我已将它注释掉了。 我试过了,无法让它发挥作用。 什么时候会期待SerialData.Eof? 我的想法是,在调用“ReadExisting”之前,我可以在所有字节出现之前等待。 但是,“if”语句从未评估为true。 强制代码转到ReadExisting但是正确读取了所有字节。

  3. 一般来说,设置我的代码以接收来自串口的字节的最佳方法是什么? 发送方将每125毫秒发送一小块字节,但不会发送特殊字符。 字节数据包在时间上是间隔开的,所以我认为没有将数据包混合在一起的问题。 更问题的是,“一旦你看到一个字节,就去读一切,只要你等待很短的时间,你就会得到一切”。 鉴于这种情况,有一种首选方式吗?

提前谢谢,戴夫

public class SerialPortController { SerialPort m_port; public SerialPortController(bool server) { if (server) { m_port = new SerialPort("COM4"); m_port.BaudRate = 115200; m_port.Open(); byte[] sillyBytes = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7 }; ASCIIEncoding encoding = new ASCIIEncoding(); string output_string = encoding.GetString(sillyBytes); m_port.WriteLine(output_string); //m_port.Write(sillyBytes, 0, 8); } else { m_port = new SerialPort("COM5"); m_port.DataReceived += new SerialDataReceivedEventHandler(m_port_DataReceived); m_port.BaudRate = 115200; m_port.Open(); } int character = Console.Read(); } void m_port_DataReceived(object sender, SerialDataReceivedEventArgs e) { //if (e.EventType == SerialData.Eof) { // string answer = m_port.ReadExisting(); string answer = m_port.ReadLine(); ASCIIEncoding encoding = new ASCIIEncoding(); byte[] byte_answer = encoding.GetBytes(answer); } } } 

在MSDN上有一个例子,它显示了这个的简单用法。

它使用ReadExisting而不是ReadLine。

同样来自文档:

不保证每收到一个字节都会引发DataReceived事件。 使用BytesToRead属性确定要在缓冲区中读取的数据量。

 private static void DataReceviedHandler( object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; string indata = sp.ReadExisting(); Console.WriteLine("Data Received:"); Console.Write(indata); }