C#COM端口接收信息

时间:2018-01-08 15:25:17

标签: c# .net ports

我有一段这样的代码:

public class SerialPortListener
{

    #region Properties

    public SerialPort _Port { get; set; }
    public event EventHandler<SerialDataEventArgs> DataReceived;

    #endregion


    public void Start()
    {
        Close();

        //todo: get attached COM names...
        List<string> names = SerialPort.GetPortNames().ToList();

        // todo: for testing, let's pick first...
        string name = names.FirstOrDefault();

        if (string.IsNullOrEmpty(name))
            return; // todo: throw error that no devices are attached...

        _Port = new SerialPort(name);
        _Port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
        _Port.Open();
    }

    private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort port = (SerialPort)sender;
        string data = port.ReadExisting();
        if (DataReceived != null)
            DataReceived(this, new SerialDataEventArgs(data));
    }

    public void Close()
    {
        if (_Port != null && _Port.IsOpen)
            _Port.Close();
    }

}

public class SerialDataEventArgs : EventArgs
{
    public SerialDataEventArgs(string data)
    {
        Data = data;
    }

    /// <summary>
    /// Byte array containing data from serial port
    /// </summary>
    public string Data;
}

其中com端口名称为&#34; COM1&#34;,我已连接手持式条形码扫描仪。 我注意到只有当我在_Port.Open()上放置一个断点然后跳过它然后在调试器中按下continue时它才有效。然后扫描工作并调用DataReceivedHandler。

否则它无法正常工作,扫描仪也无法获得良好的哔哔声。 我在here获得的应用程序中测试了扫描程序,每次都可以正常工作。

我的问题是,为什么每次都不像示例应用程序那样有效,为了使其有效,可以采用不同的方式。

1 个答案:

答案 0 :(得分:1)

使用COM端口时,务必在使用后关闭它们。 否则,在关闭之前,它们将无法再次打开。

因此,在调试时,重要的是不要简单地点击“停止调试”,而是在所有可以正常关闭端口的情况下运行一些清理代码。

我还建议在应用程序中添加一个未处理的异常处理程序,以确保在出现意外错误的情况下退出应用程序之前将关闭该端口。

此外,“Open”方法的文档在“备注”下说明:

  

任何应用程序的最佳做法是在尝试调用Open方法之前等待一段时间后再调用Close方法,因为端口可能不会立即关闭。