在NModBus调用之后,.NET C#从串口读取

时间:2016-05-25 15:26:47

标签: c# serial-port modbus

我发出NModBus呼叫(将寄存器设置为1)到传感器,然后通过串口触发从传感器传输二进制数据。

只要我只通过NModBus读/写寄存器,一切正常,但是当我想读取这个返回的字节流时,它就不起作用了。

我尝试过几种不同的方法:

  • 使用相同的SerialPort
  • 使用两个不同的SerialPort对象(当然在相同的端口上),以防有尾随缓冲区
  • 同步阅读"在NModBus电话之后立即
  • 使用SerialPortDataReceived阅读
  • 此处和那里添加超时(包括在开始传输前在传感器上添加等待时间)

根据方法,我可能会读取4(4)个字节,但我认为它们是写入寄存器调用的ModBus答案。无法检索流的其余部分(几百个字节)。并且,如果你想知道,我通过一个单独的工具验证确实传输了这样的流。 :-P

我已经通过串口在其他程序中交换信息而没有特别的问题所以我想知道我是否使用NModBus 然后标准串口操作端口正在引起关注?

代码 - 应该是非常基本的 - 看起来像:

    using (SerialPort serialForModBus = new SerialPort(Port))
    {
       // Basic serial port settings
       Open(serialForModBus);
       // Create ModBus RTU master
       IModbusSerialMaster master = CreateMaster(serialForModBus);
       // Write register to trigger reading...
       master.WriteMultipleRegisters(SLAVE_ID, SensorModBusRegisters.COMMAND_SEND_LOGS, new ushort[] { (ushort)1 });
    }

    // Now read...
    using (SerialPort serialToReadLogs = new SerialPort(Port))
    {
       Open(serialToReadLogs);
       serialToReadLogs.ReadTimeout = 10000;
       // Externalize reading to separate class (that will also do the parsing..)
       SensorLogSerialReader logReader = new SensorLogSerialReader();
       serialToReadLogs.DataReceived += logReader.SerialPortDataReceived;
    }

// In SensorLogSerialReader 
public void SerialPortDataReceived(object senderSerialPort, SerialDataReceivedEventArgs e)
    {
       SerialPort sender = (SerialPort)senderSerialPort;

       List<byte> bytes = new List<byte>();
       try
       {
          bool moreToRead = (sender.BytesToRead != 0);
          int cur;
          while (moreToRead)
          {
             cur = sender.ReadByte();
             bytes.Add((byte)cur);
             moreToRead = (sender.BytesToRead != 0);
          }

                    Done = true;
       }
       catch (...)
    }

有什么想法吗?我错过了什么&#34;明显&#34;?

谢谢!

注意:我看到post可能相似但仍未得到答案

0 个答案:

没有答案