【问题标题】:Are uninitialised serial port attributes given default values as they are when using the default constructor?使用默认构造函数时,未初始化的串行端口属性是否被赋予了默认值?
【发布时间】:2017-01-10 21:23:07
【问题描述】:

如果使用默认构造函数或无参数构造函数创建串行端口,则端口将被赋予默认值。 From the documentation:

// Create a new SerialPort object with default settings.
_serialPort = new SerialPort();

当未指定任何属性值时,此构造函数使用默认属性值。例如,DataBits 属性默认为 8,Parity 属性默认为 None 枚举值,StopBits 属性默认为 1,默认端口名称为 COM1。

several constructors

使用带参数的构造函数时:
在使用带参数的构造函数和使用默认构造函数时,不在串口的构造函数参数内的属性是否被赋予相同的默认值?

this question中的问题,有趣的答案,cmets和随后的聊天讨论让我问这个。

【问题讨论】:

  • 看看它的source code
  • 所有重要的属性,包括BaudRateDataBitsParityStopBits都有默认值,如果它们不在构造函数参数中,则使用默认值。跨度>
  • Reza 提供了相关代码,说明超级骗子重要的 HandShake 属性没有有默认值。这是一个很大的错误,让很多程序员陷入困境,因为很少有人了解它的作用,而且它总是很重要。如果您不设置它,那么它会保持与之前使用的任何程序使用的相同值,导致普遍观察到,当您首先使用终端仿真器时它“突然起作用”。当您使用 Winforms 设计器将组件拖放到表单上时尤其具有破坏性,现在它是开发机器上的当前设置。
  • 但更重要的是,现有的默认设置并不意味着什么。您必须匹配设备设置,制造商几乎没有理由关注 .NET 默认设置。相反,他们认为供应商绑定是一项功能,而不是错误。最臭名昭著的例子是 MIDI(不可能的波特率)和硬币自动售货机(9 位字节),它们也想卖给你硬件。
  • @HansPassant 你会考虑写一个答案吗?

标签: c# .net constructor serial-port default-constructor


【解决方案1】:

您可以查看它的source code 并查看构造函数和归档定义。

您将看到所有重要的属性,包括 PortNameBaudRateDataBitsParityStopBits,都有一个默认值,如果它们不存在于构造函数参数中,则默认值将用于他们。

还有一些其他重要的属性,它们也有默认值,虽然它们不存在于构造函数中,但是在某些情况下,它们的默认值可能不是很好。

例如对于HandShake,默认值为Handshake.None;,而您可能希望将其设置为Handshake.XOnXOffHandshake.RequestToSendHandshake.RequestToSendXOnXOff。对于这个特定的属性,您可能需要参考 Hans 的comments

看看构造函数:

public SerialPort(System.ComponentModel.IContainer container)
{
    container.Add(this);
}
public SerialPort()
{
}
// Non-design SerialPort constructors here chain, 
//using default values for members left unspecified by parameters
public SerialPort(string portName) 
    : this (portName, defaultBaudRate, defaultParity, defaultDataBits, defaultStopBits)
{
}
public SerialPort(string portName, int baudRate) 
    : this (portName, baudRate, defaultParity, defaultDataBits, defaultStopBits)
{
}
public SerialPort(string portName, int baudRate, Parity parity)
    : this (portName, baudRate, parity, defaultDataBits, defaultStopBits)
{
}
public SerialPort(string portName, int baudRate, Parity parity, int dataBits)
    : this (portName, baudRate, parity, dataBits, defaultStopBits)
{
}
public SerialPort(string portName, int baudRate, Parity parity, 
     int dataBits, StopBits stopBits)
{
    this.PortName = portName;
    this.BaudRate = baudRate;
    this.Parity = parity;
    this.DataBits = dataBits;
    this.StopBits = stopBits;
}

以下是这些字段和默认值定义:

// ---------- default values -------------*

private const int defaultDataBits = 8;
private const Parity defaultParity = Parity.None;
private const StopBits defaultStopBits = StopBits.One;
private const Handshake defaultHandshake = Handshake.None;
private const int defaultBufferSize = 1024;
private const string defaultPortName = "COM1";
private const int defaultBaudRate = 9600;
private const bool defaultDtrEnable = false;
private const bool defaultRtsEnable = false;
private const bool defaultDiscardNull = false;
private const byte defaultParityReplace = (byte) '?';
private const int defaultReceivedBytesThreshold = 1;
private const int defaultReadTimeout = SerialPort.InfiniteTimeout;
private const int defaultWriteTimeout = SerialPort.InfiniteTimeout;
private const int defaultReadBufferSize = 4096;
private const int defaultWriteBufferSize = 2048;
private const int maxDataBits = 8;
private const int minDataBits = 5;
private const string defaultNewLine = "\n";

private const string SERIAL_NAME = @"\Device\Serial";
// --------- members supporting exposed properties ------------*
private int baudRate = defaultBaudRate;
private int dataBits = defaultDataBits;
private Parity parity = defaultParity;
private StopBits stopBits = defaultStopBits;
private string portName = defaultPortName;
// ASCII is default encoding for modem communication, etc.
private Encoding encoding = System.Text.Encoding.ASCII; 
private Decoder decoder = System.Text.Encoding.ASCII.GetDecoder();
private int maxByteCountForSingleChar = System.Text.Encoding.ASCII.GetMaxByteCount(1);
private Handshake handshake = defaultHandshake;
private int readTimeout = defaultReadTimeout;
private int writeTimeout = defaultWriteTimeout;
private int receivedBytesThreshold = defaultReceivedBytesThreshold;
private bool discardNull = defaultDiscardNull;
private bool dtrEnable = defaultDtrEnable;
private bool rtsEnable = defaultRtsEnable;
private byte parityReplace = defaultParityReplace;
private string newLine = defaultNewLine;
private int readBufferSize = defaultReadBufferSize;
private int writeBufferSize = defaultWriteBufferSize;

【讨论】:

  • HandShake 不存在于任何构造函数中,但它也有默认值。
  • 握手没有默认值。看看 Hans cmets。
  • @YvetteColomb 说它有默认值,我的意思是它的默认值是Handshake.None;。您可能希望将其设置为 Handshake.XOnXOffHandshake.RequestToSendHandshake.RequestToSendXOnXOff
  • 你能把这个添加到答案中吗?
  • 似乎默认值对不同的人意味着不同。是的,我已经添加了以防止误导未来的读者。
猜你喜欢
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 2021-12-16
  • 2014-07-25
  • 2011-06-17
  • 2011-04-17
相关资源
最近更新 更多