时间:2011-05-16 13:21:24

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

我在使用SerialPort类设置COM端口时遇到问题。当我调用SerialPort构造函数时,有许多设置的设置与我需要的设置不同。使用端口监视器应用程序我注意到以下内容:

  1. ReadIntervalTimeout = -1(应该是 0)
  2. ReadTotalTimeoutMultiplier = -1 (应为0)
  3. ReadTotalTimeoutConstant = 1000 (应为0)
  4. WriteTotalTimeoutMultiplier = 0(OK)
  5. WriteTotalTimeoutConstant = 0(OK)
  6. EoFChar = 26(应为0)
  7. ErrorChar = 63(应为0)
  8. Break char = 63(应为0)
  9. XOn Limit = 1024(应为2048)
  10. XOff Limit = 1024(应为512)
  11. FlowReplace = 0x87(应为0)
  12. 如何更改这些设置(我正在使用C#)?

3 个答案:

答案 0 :(得分:1)

MSDN documentation类的SerialPort提供了有关如何配置端口的详细信息。我建议你仔细阅读这些信息。

但是,为了让您入门,以下是更改读取超时的方法:

port.ReadTimeout = 0;

尽管如此,并不是所有你提到的特性都可以通过.NET进行配置,而不会对PInvoke造成一点点(好的,很多),并使用Win32 API与端口进行交互(Communications Functions而不是SerialPort。但是,如果需要更改未包含在SerialPort类中的特性,您可能需要考虑.NET是否是合适的平台。

答案 1 :(得分:1)

无法使用SerialPort包装类设置这些值。这是一个不完整的包装器。您可以查看here以获取更改XON和XOFF字符的示例。其余的你必须参考DCB documentation

<强>更新

DCB标志值是DCB结构中的位字段。

DWORD fBinary  :1;            // Bit 0
DWORD fParity  :1;            // Bit 1
DWORD fOutxCtsFlow  :1;       // Bit 2
DWORD fOutxDsrFlow  :1;       // Bit 3
DWORD fDtrControl  :2;        // Bit 4 - 5
DWORD fDsrSensitivity  :1;    // Bit 6
DWORD fTXContinueOnXoff  :1;  // Bit 7
DWORD fOutX  :1;              // Bit 8
DWORD fInX  :1;               // Bit 9
DWORD fErrorChar  :1;         // Bit 10
DWORD fNull  :1;              // Bit 11
DWORD fRtsControl  :2;        // Bit 12 - 13
DWORD fAbortOnError  :1;      // Bit 14
DWORD fDummy2  :17;           // Bit 15 - 31

如果你想知道SetDcbFlag是如何计算出你正在操纵哪些位的,那么它就是(由Reflector提供):

internal void SetDcbFlag(int whichFlag, int setting)
{
    uint mask;
    if ((whichFlag == 4) || (whichFlag == 12))
        mask = 3;
    else if (whichFlag == 15)
        mask = 0x1ffff;
    else
        mask = 1;
    this.dcb.Flags &= ~(mask << whichFlag);
    this.dcb.Flags |= ((uint)setting << whichFlag);
}

您可以看到,对于位#4或#12,它使用2位掩码,对于位#15,使用17位掩码,其余为1位掩码。

答案 2 :(得分:0)

非常感谢您的回答,他们肯定会让我走上正轨。不幸的是,使用C#或其他语言不是我的决定,所以我不得不以某种方式在C#中进行。

使用Tergiver提供的反射黑客here我已经能够设置DCB结构中的大多数属性。我发现可以通过为SerialPort.ParityReplace分配所需的值来轻松设置ErrorChar和BreakChar,尽管在我看来这似乎并不明显。

使用相同的hack,COMMTIMEOUTS结构和p /调用SetCommTimeouts来设置超时是一件容易的事。

对于流控制来说,它有点棘手,因为这是由SetCommState通过调用DeviceIoControl在内部完成的。我的问题是我无法真正建立DCB标志,ControlHandShake和FlowReplace之间的连接。我找不到有关32位DCB结构中标志顺序的文档,因此我将整个Flags属性设置为0.这导致ControlHandShake和FlowReplace最终为0。

数据发送/接收似乎工作正常,我希望我在这里没有省略。