c# - 访问串行端口时信号量超时?

标签 c# timeout serial-port semaphore

我在用 C# 打开串行端口时遇到了这个问题(这应该很简单;至少我是这么认为的)。

当我尝试打开串行端口时,出现以下异常:

The semaphore time-out period has expired.‎

这是执行此操作的方法。

public static void Open_TheActivePortWeWillUse(String Drone_StringNameFromUser)
{
    var TempSerialPort = new SerialPort (
        Drone_StringNameFromUser, 
        (int) SerialPortParameter.TheSerialPortSpeed);

    // Now we have a name that anybody can see and use
    OurSpecificPorts.TheActivePortWeAreUsing = TempSerialPort;      
    // We'll do 8-N-1 since almost the whole planet does that
    OurSpecificPorts.TheActivePortWeAreUsing.DataBits = 8;  
    // We'll do 8-N-1
    OurSpecificPorts.TheActivePortWeAreUsing.Parity = Parity.None;    
    // We'll do 8-N-1
    OurSpecificPorts.TheActivePortWeAreUsing.StopBits = StopBits.One;    

    OurSpecificPorts.TheActivePortWeAreUsing.DataReceived +=    
        OurBackGroundSerialPortReceiver;
    // We can now open our active port, which is what this line does
    OurSpecificPorts.TheActivePortWeAreUsing.Open();      
}

对我来说最奇怪的事情是我不一致地收到此错误。 有一半的时间可以正常工作,而另一半的时间则不能

有人发现我的代码有任何明显的错误吗?我错过了什么吗?

最佳答案

在方法内声明 SerialPort 对象将不允许在方法关闭后访问它。这是打开端口的方法:

  private void OpenSerialPort(String portName)
    {
        try
        {
            serialPort1.Close();
            serialPort1.PortName = portName;
            serialPort1.BaudRate = 115200;
            serialPort1.DataBits = 8;
            serialPort1.Handshake = Handshake.None;
            serialPort1.Parity = Parity.None;
            serialPort1.RtsEnable = false;
            serialPort1.StopBits = StopBits.One;

            serialPort1.Open();

        }
        catch (Exception ex)
        {
            MessageBox.Show("Could not open serial port " + portName, "Error");
        }
    }

SerialPort 对象在类中声明:

namespace Arcadia
{
    public partial class Form1 : Form
    {
        private SerialPort serialPort1;

并在构造函数中添加回调:

    public Form1()
    {
        InitializeComponent();

        serialPort1.DataReceived += new SerialDataReceivedEventHandler(this.SerialPortReadCallback);

发送数据以不同的方法处理:

    private void SerialPortWrite(String writeString)
    {
        if (serialPort1.IsOpen)
        {
            serialPort1.WriteLine(writeString);
        }
    }

这是接收到的数据回调:

    private void SerialPortReadCallback(object sender, SerialDataReceivedEventArgs args)
    {
        try
        {

            while (serialPort1.BytesToRead > 0)
            {
                // Do something with the data

            }
        }
        catch (Exception ex)
        {
        }
    }

关于c# - 访问串行端口时信号量超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13977175/

相关文章:

c# - Excel VSTO 异步按钮 - 用户交互的奇怪行为?

linux - 超时 linux 命令行为

c# - 使用 File.Copy 时如何实现超时?

java - 如何在 java/shell 中的 javax.comm.PortInUseException 后释放串口

c# - 如何在 C# 中一次将控制台输出到多个流?

c# - ASP.NET MVC - 模型的 WCF 类

java - RXTX 双向串口通信第一次运行后不发送数据

java - 使用处理存储从串行连接读取的 Arduino 数据

c# - ConcurrentQueue <T>或Queue <T>当一个线程仅入队而另一个线程仅出队

mySQL脚本超时