Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net C#串行端口设置_.net_C# 4.0_Serial Port - Fatal编程技术网

.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
构造函数时所需的设置不同。使用端口监视器应用程序时,我注意到以下几点:

  • ReadIntervalTimeout=-1(应为 0)
  • ReadTotalTimeOut乘数=-1 (应为0)
  • ReadTotalTimeoutConstant=1000 (应为0)
  • WriteTotalTimeOut乘数=0(正常)
  • WriteTotalTimeoutConstant=0(正常)
  • EoFChar=26(应为0)
  • ErrorChar=63(应为0)
  • Break char=63(应为0)
  • XOn限制=1024(应为2048)
  • XOff Limit=1024(应为512)
  • FlowReplace=0x87(应为0)
  • 如何更改这些设置(我正在使用C#)?

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

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

    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);
    }