c# - 从 C++ 到 C# 重写串口通信

标签 c# c++ serial-port

我想知道我是否正确地将建立串行端口通信的 C++ 代码映射到 C#。

void some func(...)
{
 *hDev = CreateFile(PortNameUNC, GENERIC_READ|GENERIC_WRITE, 0, NULL, 
      OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

    if(*hDev == INVALID_HANDLE_VALUE) return false ;

    DCB *dcb = new DCB ;
    memset(dcb, 0x00, sizeof(DCB)) ;
    dcb->DCBlength       = sizeof(DCB);
    dcb->BaudRate        = BaudRate;
    dcb->Parity          = Parity;
    dcb->StopBits        = StopBits;
    dcb->ByteSize        = ByteSize;
    dcb->fBinary         = TRUE;
    dcb->fDsrSensitivity = 0;
    dcb->fDtrControl     = (DTR ? DTR_CONTROL_ENABLE : DTR_CONTROL_DISABLE) ;
    dcb->fRtsControl     = (RTS ? RTS_CONTROL_ENABLE : RTS_CONTROL_DISABLE) ;
    dcb->fOutxCtsFlow    = (CTS ? 1 : 0) ;
    dcb->fOutxDsrFlow    = (DSR ? 1 : 0) ;
    dcb->fOutX           = (XonnXoff ? 1 : 0) ;
    dcb->fInX            = 0 ;      

    if(!SetCommState(*hDev, dcb)) 
    {
      delete dcb ;
      CloseHandle(*hDev) ;
      *hDev = INVALID_HANDLE_VALUE ;
      return false;
    }


    if(!SetTimeOut(readTimeOut, ReadIntervalTimeout) || !Reset())   
    {   
      CloseHandle(*hDev) ;
      *hDev = INVALID_HANDLE_VALUE ;
      return false;
    }
}

bool serial::SetTimeOut(DWORD readTimeOut, DWORD ReadIntervalTimeout)
{
  COMMTIMEOUTS *timeouts = new COMMTIMEOUTS ;
  memset(timeouts, 0, sizeof(COMMTIMEOUTS)) ;
  timeouts->ReadIntervalTimeout          = ReadIntervalTimeout ;
  timeouts->ReadTotalTimeoutMultiplier   = 5 ;
  timeouts->ReadTotalTimeoutConstant     = readTimeOut ; //...
  timeouts->WriteTotalTimeoutConstant    = 0 ; //
  timeouts->WriteTotalTimeoutMultiplier  = 2*BaudRate/8 ;
  const bool ret = SetCommTimeouts(*hDev, timeouts) != FALSE ;
  delete timeouts ;
  m_currentTimeOut = readTimeOut ;
  return ret ;
}

这是我的 C# 映射:

 public SerialPortHASP(string portName, int baudRate, Parity parity, int dataBits, StopBits stopBits, bool dtr, bool rts, bool xonxoff)
        {

            m_port = new SerialPort(portName, baudRate, parity, dataBits, stopBits);

            // Just store parameters user entered
            m_portName = portName;
            m_baudRate = baudRate;
            m_parity = parity;
            m_dataBits = dataBits;
            m_stopBits = stopBits;
            m_xonxoff = xonxoff;
            m_dtr = dtr;
            m_rts = rts;

            // Set XonXoff if set
            if (xonxoff)
                m_port.Handshake = Handshake.XOnXOff;

            // Set DTR/RTS
            m_port.DtrEnable = dtr;
            m_port.RtsEnable = rts;

            m_port.ReadTimeout = 500; // or some other values
            m_port.WriteTimeout = 500;

            // Open the port for communications
            m_port.Open();
        }

我需要执行一些其他的读写操作(根据协议(protocol)),直到我可以测试我的映射是否正确,所以这就是为什么我想仔细检查我是否采用了正确的方法将上述代码映射到 C#?或者我应该服用 this使用 PInvoke 调用路由?或者仍然尝试我目前的方法?谢谢

附言。事情是你可以通过这种方式看到我无法复制 C++ 调用允许制作的所有参数

最佳答案

我会添加到初始化:

m_port.DataReceived += _serial_DataReceived;

从端口获取数据的事件。需要异步工作。

void _serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
 {
   int _len = _serial.BytesToRead;
   byte[] _out = new byte[_len];
   _serial.Read(_out, 0, _len);
 }

关于c# - 从 C++ 到 C# 重写串口通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32859276/

相关文章:

c# - protobuf-net - 为什么反序列化对象后引用同一对象不相等

c# - 如何阻止我的控件为我的数据列表生成资源文件?

c++ - 引用抽象类类型的结构

c++ - QT 应用程序卡住

c# - 为什么使用 SerialPort.CatchReceivedEvents() 线程数不断增加

C#.NET : Read CSV using % converter

c# - 报告中的自定义 C# 代码

c++ - Linux C++ 中的 Opencv 链接器

c++ - 在 Qt 中从对象的析构函数发出信号可以吗?

linux - Device::SerialPort 不会发送我的数据,除非我捕获串行端口