.net C#串行端口设置
使用.net C#串行端口设置,.net,c#-4.0,serial-port,.net,C# 4.0,Serial Port,使用SerialPort类设置COM端口时遇到问题。有许多设置的设置与调用SerialPort构造函数时所需的设置不同。使用端口监视器应用程序时,我注意到以下几点: ReadIntervalTimeout=-1(应为 0) ReadTotalTimeOut乘数=-1 (应为0) ReadTotalTimeoutConstant=1000 (应为0) WriteTotalTimeOut乘数=0(正常) WriteTotalTimeoutConstant=0(正常) EoFChar=26(应为0)
SerialPort
类设置COM端口时遇到问题。有许多设置的设置与调用SerialPort
构造函数时所需的设置不同。使用端口监视器应用程序时,我注意到以下几点:
port.ReadTimeout = 0;
也就是说,不是所有您提到的特性都可以通过.NET进行配置,而不需要使用Win32 API()而不是通过与端口进行一点(好的,很多)交互。但是,如果您需要更改不被“代码> SerialPosie Cype。> P >的那些特性,那么您可能需要考虑.NET是否是合适的平台。这些值不能用SerialPror包装器类来设置。这是一个不完整的包装。您可以查找更改XON和XOFF字符的示例。至于其余的,你将不得不参考 已更新 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提供):
内部无效设置dcbFlag(int whichFlag,int设置)
{
核弹头面罩;
如果((whichFlag==4)| |(whichFlag==12))
面罩=3;
else if(whichFlag==15)
掩码=0x1fff;
其他的
掩码=1;
这个.dcb.Flags&=~(mask非常感谢你的回答,他们肯定让我走上了正确的道路。不幸的是,使用C#或其他语言不是我的决定,所以我不得不用C#来做
使用Tergiver提供的反射hack,我已经能够设置DCB结构中的大多数属性。我发现通过将所需的值分配给SerialPort.ParityReplace,可以轻松设置ErrorChar和BreakChar,尽管在我看来这一点并不明显
通过使用相同的hack、COMMTIMEOUTS结构和p/调用SetCommTimeouts,设置超时是一项简单的工作
对于流控制,这有点棘手,因为这是由SetCommState通过调用DeviceIoControl在内部完成的。我的问题是,我无法在DCB标志、ControlHandShake和FlowReplace之间建立连接。我找不到关于32位DCB结构中标志顺序的文档,所以我设置了整个标志s属性设置为0。这将导致ControlHandShake和FlowReplace最终为0
数据发送/接收似乎工作正常,我希望这里没有遗漏任何内容。标记记录在我提供给您的DCB链接中。DCB结构使用C/C++位字段。但是,我还有一个反射hack,显示了如何在此处更改标记:我更新了上面的注释以显示值(位#)要传递到我上面给出的链接中的SetDcbFlag
。
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);
}