【问题标题】:How to get data from serial port?如何从串口获取数据?
【发布时间】:2014-09-03 07:38:51
【问题描述】:

我有这段代码,但我不知道如何获取数据并将其放入一个变量中:

 protected override void OnStart(string[] args)
        {
            /* This WaitHandle will allow us to shutdown the thread when
               the OnStop method is called. */
            _shutdownEvent = new ManualResetEvent(false);

            /* Create the thread.  Note that it will do its work in the
               appropriately named DoWork method below. */
            _thread = new Thread(DoWork);

            /* Start the thread. */
            _thread.Start();
        }

然后在 DoWork 我有以下内容:

private void DoWork()
        {

//opening serial port 
            SerialPort objSerialPort;
            objSerialPort = new SerialPort();

            objSerialPort.PortName = "COM2";
            objSerialPort.BaudRate = 11500;
            objSerialPort.Parity = Parity.None;
            objSerialPort.DataBits = 16;
            objSerialPort.StopBits = StopBits.One;
            objSerialPort.Open();

所以,我打开了端口,但是从哪里开始获取数据???如何初始化变量?接收到的消息格式为 52 45 41 44 45 52 30 31,其中 41 44 45 53 30 是十六进制消息,而 52 45 是标头,31 CRC。

请告诉我怎么做。

谢谢……

【问题讨论】:

  • 你读过MSDN上的文档了吗?
  • 是的,但我需要在 doWork 中操作数据我不想调用另一个函数
  • 根据我的回答中的评论,我想问一下您是否了解线程?如果你不这样做,我建议你这样做,就好像这是在单个线程上运行一样,你将拥有一个非常慢的应用程序! :D

标签: c# windows-services serial-port listener


【解决方案1】:

使用串口就像使用文件或套接字:

while ((bytesRead = objSerialPort.Read(buffer, 0, buffer.Length)) > 0)
{
    var checksum = buffer[bytesRead - 1];

    if (VerifyChecksum(checksum, buffer, bytesRead))  // Check the checksum
    {
        DoSomethinWithData(buffer, bytesRead);  // Do something with this bytes
    }
}

【讨论】:

  • 所以我会在 DoWork 中添加这个??
  • 在哪里以及如何定义 var bytestoRead、buffer、checksum ???对不起,我是初学者.....
  • buffer可以定义在doWork方法中,checksum,在这个例子中,可以定义在while 循环和 bytesRead 可以(也)在 while 循环之前定义。至于怎么做,文档应该会告诉你怎么做! ;)
【解决方案2】:
byte[] buffer = new byte[1];
String message = "";

While (true)
{
  if(objSerialPort.Read(buffer,0,1)>0)
  {
  message+= System.Text.Encoding.UTF8.GetChars(buffer).ToString();
  //Or you could call another function here that will DoSomething with each byte coming in!
  }

}

应该做的伎俩!

【讨论】:

  • "System.Text.Encoding.UTF8.GetChars(buffer).ToString();"可以安全地替换为“objSerialPort.ReadExisting()”
  • 我习惯使用netMF,对不起! (所以只能保证前者)。但如果 ReadExisting 有效,那么它也是一个有效的改动!
  • 我也建议包括创建一个新线程!
  • 让我看看这个。不过谢谢
  • @BesaNeziri 你过得怎么样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
  • 2017-09-06
  • 1970-01-01
  • 2022-01-14
  • 2015-12-31
相关资源
最近更新 更多