0

我正在使用连接在 COM2 端口上的 Dallas Key。dallas Key 在打开时有一个值(例如 00 AA BB),在它被移除时有一个值(例如 00 00 00)。我怎样才能不断地准备好 COM2 端口的值,以检测它的变化并根据它采取行动(winforms 应用程序)。

我试图通过端口名称获取值并读取它,但它说在某些情况下访问被拒绝。

private SerialPort port = new   SerialPort("COM2",9600, Parity.None, 8, StopBits.One); 

   static void Main(string[] args) 
    { 
      SerialPortProgram(); 
    } 

private static void SerialPortProgram() 
    { 
        port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); 
        port.Open(); 
        Console.ReadLine();
     } 

    private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    { 
       Console.WriteLine(port.ReadExisting()); 
    } 

我想一直监听 COM2 端口的值而不会对应用程序速度产生太大影响,在它打开时获取 COM2 端口(我的达拉斯键)的值,并检测它何时关闭并采取具体行动。

4

2 回答 2

1

即使您没有描述实际抛出的行,通过阅读文档我发现了这个 nuget

SerialPort.Open 方法

例外 UnauthorizedAccessException对端口的访问被拒绝。

-或者-

当前进程或系统上的另一个进程已经通过 SerialPort 实例或在非托管代码中打开了指定的 COM 端口。

你要么没有权限打开端口,要么已经打开了,你需要弄清楚它是哪一个并进行适当的处​​理

注意:如果您使用 USB 转 com,com 端口可能会有点变化无常

于 2019-05-09T01:06:47.410 回答
0

下面的代码在我在控制台中编写(项目是控制台应用程序)时有效,但是当我改回 Windows 应用程序并尝试写入标签或更改变量值时:这不起作用:

    public Form1()
    {
        InitializeComponent();
        SerialPortProgram();
    }

    private void SerialPortProgram()
    {
        SerialPort mySerialPort = new SerialPort("COM2");

        mySerialPort.BaudRate = 9600;
        mySerialPort.Parity = Parity.None;
        mySerialPort.StopBits = StopBits.One;
        mySerialPort.DataBits = 8;
        mySerialPort.Handshake = Handshake.None;

        mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
        mySerialPort.Open();
        mySerialPort.Close();
    }

    private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        string indata = sp.ReadExisting();
        switch (ASCIItoHex(indata))
        {
            case "00000113":
                LB_Display.Text = "User 1";
                break;
            case "0000017a":
                LB_Display.Text = "User 2";
                break;
            default:
                LB_Display.Text = "Disconnect";
                break;
        }
    }

    public static string ASCIItoHex(string Value)
    {
        StringBuilder sb = new StringBuilder();
        foreach (byte b in Value)
            sb.Append(string.Format("{0:x2}", b));
        return sb.ToString();
    }
于 2019-05-11T13:49:31.113 回答