【问题标题】:How to get the value and listen to the COM2 port using C#?如何使用 C# 获取值并监听 COM2 端口?
【发布时间】:2019-09-26 18:18:17
【问题描述】:

我正在使用连接在 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端口(我的达拉斯键)打开时的值并检测它何时关闭并采取具体行动。

【问题讨论】:

  • 尝试“以管理员身份”运行您的应用程序
  • 你不能多次打开端口,否则你会得到你提到的错误。您需要确保将其打开,对所有串行通信保持打开状态,并在完成后将其关闭。否则,我不明白你的问题,你能解释一下吗?代码的哪一部分不起作用?只要有 COM 流量,就会触发 Data Received 事件,所以这对我来说是正确的。

标签: c# winforms serial-port key pos


【解决方案1】:

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

SerialPort.Open Method

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

-或-

当前进程或系统上的另一个进程已经拥有 指定的 COM 端口由 SerialPort 实例或在 非托管代码。

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

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

【讨论】:

    【解决方案2】:

    当我在控制台(项目是控制台应用程序)中编写时,以下代码有效,但是当我改回 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();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-28
      • 2012-05-17
      • 1970-01-01
      • 2013-07-06
      • 2019-01-14
      • 2016-01-07
      • 1970-01-01
      • 2021-12-16
      相关资源
      最近更新 更多