【问题标题】:how to write and read to serialPort in same time?如何同时写入和读取serialPort?
【发布时间】:2016-10-18 11:31:56
【问题描述】:

我有一些设备需要使用 SerialPort 进行连接。 这个设备从我这边接收命令,也向我发送数据。 我在同一个 class=> 同一个线程中进行所有发送/接收。

我已经连接到这个设备并且我成功地从这个设备发送/接收命令和数据。

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

如果我丢失了一些接收数据...当我执行“serialPortStream.BytesToRead”(测试是否有一些数据要获取)时,我会在我的 ByteReading 上找到我还没有 rad 的旧缓冲区吗? 如果我错过了我需要阅读的最后一个包裹,或者收到的新数据会删除之前已经收到的旧数据,我会有多少包裹?

【问题讨论】:

  • 你需要两个线程。我会创建一个带有事件处理程序的类,例如 SerialPort.DataRecieved += ____ ,它会在收到新字节时填充 ConcurrentQueue。然后,您可以在主线程中从该队列中读取并从那里进行写入。请注意,您的数据包可能有问题,但您绝对不会错过任何一个。

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


【解决方案1】:

使用 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;
                }
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2013-12-17
    • 1970-01-01
    相关资源
    最近更新 更多