我在使用SerialPort
类设置COM端口时遇到问题。当我调用SerialPort
构造函数时,有许多设置的设置与我需要的设置不同。使用端口监视器应用程序我注意到以下内容:
如何更改这些设置(我正在使用C#)?
答案 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。
数据发送/接收似乎工作正常,我希望我在这里没有省略。