尝试在C#中打开COM端口时出现UnauthorizedAccessException

时间:2014-10-21 12:43:50

标签: c# serial-port

我正在使用Arduino Board在串行COM端口上写入,并使用C#应用程序来读取它。但每当我尝试运行C#程序时,尝试打开串行端口时会发生异常(UnauthorizedAccessException)。如何正确打开串口?

我对C ++知之甚少。我的大部分知识来自他们与C ++的相似之处,以及大量的谷歌搜索教程。以下是我从其中一个教程中复制的代码之一:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        if(!serialPort1.IsOpen)
        {
            serialPort1.PortName = "COM3";

            serialPort1.Open();

            richTextBox1.Text = "opened";
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if(serialPort1.IsOpen)
        {
            string text = richTextBox1.Text;
            serialPort1.WriteLine(text);
        }
    }
}

1 个答案:

答案 0 :(得分:1)

发生的事情是您已在其他应用程序中打开COM3(请参阅MSDN)。当您单击button1时,程序可以看到COM端口已打开(在另一个应用程序中)并尝试写入,即使您的程序无法访问它。

首先,您需要创建一个串口实例(我怀疑您已经完成了,因为您会收到不同的错误)。我在创建Form1时创建我的实例:

    public Form1()
    {
        InitializeComponent();

        // Create an instance of a serial port
        serialPort1 = new SerialPort();
    }

在下面我将button2重命名为openPortButton:

    private void openPortButton_Click(object sender, EventArgs e)
    {

如果串口已经打开,你可以通过关闭串口使你的程序变得激进:

        // Check if the serial port is already open. If it is close it down first.
        if (serialPort1.IsOpen == true)
        {
            serialPort1.Close();
        } 

通过将串行端口包装在try-catch语句中,您还可以捕获任何异常:

        if(!serialPort1.IsOpen)
        {
            serialPort1.PortName = "COM3";

            try
            {
                serialPort1.Open();
            }
            catch
            {
                // Add exception handling here
            }
        }

然后测试串口是否实际打开:

        // Test connection
        if (serialPort1.IsOpen == true)
        {
            richTextBox1.Text = "opened";
            commsEstablished = true;
        }
        else
        {
            richTextBox1.Text = "not successful";
            commsEstablished = false;
        }
    }

commsEstablished是Form1中的私有bool。

现在按下发送按钮时测试commsEstablished变量:(我还将button1重命名为sendButton)

    private void sendButton_Click(object sender, EventArgs e)
    {
        if(commsEstablished && serialPort1.IsOpen)
        {
            string text = richTextBox1.Text;
            try
            {
                serialPort1.WriteLine(text);
            }
            catch
            {
                // Add exception handling here
            }
        }
    }