我有一段这样的代码:
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获得的应用程序中测试了扫描程序,每次都可以正常工作。
我的问题是,为什么每次都不像示例应用程序那样有效,为了使其有效,可以采用不同的方式。
答案 0 :(得分:1)
使用COM端口时,务必在使用后关闭它们。 否则,在关闭之前,它们将无法再次打开。
因此,在调试时,重要的是不要简单地点击“停止调试”,而是在所有可以正常关闭端口的情况下运行一些清理代码。
我还建议在应用程序中添加一个未处理的异常处理程序,以确保在出现意外错误的情况下退出应用程序之前将关闭该端口。
此外,“Open”方法的文档在“备注”下说明:
任何应用程序的最佳做法是在尝试调用Open方法之前等待一段时间后再调用Close方法,因为端口可能不会立即关闭。