繁体   English   中英

如何获取值并使用C#侦听COM2端口?

[英]How to get the value and listen to the COM2 port using C#?

我正在使用连接在COM2端口上的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端口的值(我的达拉斯密钥),并检测它何时关闭并采取特定措施。

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

SerialPort.Open方法

异常 UnauthorizedAccessException拒绝对端口的访问。

-要么-

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

您或者没有打开端口的权限,或者您已经打开了端口,您需要确定端口是哪一个并进行适当处理

注意 :如果您使用USB来进行com通讯,端口可能会有些变

下面的代码在我用控制台(项目是控制台应用程序)编写时起作用,但是当我改回到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();
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM