如何同时写入和读取serialPort?

时间:2016-10-18 00:46:08

标签: c# .net serial-port serial-communication

我有一些设备需要使用SerialPort建立连接。 该设备从我这边接收命令并向我发送数据。 我在同一个班级做所有的发送/接收=>相同的线程。

我已连接到此设备,并且我成功从/向此设备发送/接收命令和数据。

我需要每25毫秒发送一个命令是“给我你的状态” - 这意味着我要求设备发回一些带有数据的结构。

如果我错过了一些接收数据...当我做'serialPortStream.BytesToRead'(测试是否有一些数据要获得)时,我会在我的ByteReading上找到我还没有放弃的旧缓冲区吗? 如果我错过了我需要阅读的最后一个包裹,或者收到的新数据将删除以前收到的旧数据,我将拥有多少包裹?

1 个答案:

答案 0 :(得分:2)

使用OnRecieveData处理程序将数据保存到ConcurrentQueue或类似的东西。

namespace Test
{   class Program
    {
        const int bufSize = 2048;
        static void Main(string[] args)
        {

            Byte[] buf = new Byte[bufSize]; 
            SerialPort sp = new SerialPort("COM1", 115200);
            sp.DataReceived += port_OnReceiveData; // Add DataReceived Event Handler

            sp.Open();

            // Wait for data or user input to continue.
            Console.ReadLine();


            sp.Close();
        }

        private static void port_OnReceiveData(object sender,  SerialDataReceivedEventArgs e)
        {
            SerialPort port = (SerialPort) sender;
            switch(e.EventType)
            {
                case SerialData.Chars:
                {
                    Byte[] buf = new Byte[bufSize];
                    port.Read(buf, 0, bufSize)
                    Console.WriteLine("Recieved data! " + buf.ToString());
                    break;
                }
                case SerialData.Eof:
                {
                    // means receiving ended
                    break;
                }
            }
        }
    }
}