Как получить значение и прослушать порт COM2 с помощью C #? - PullRequest
0 голосов
/ 09 мая 2019

Я работаю с Dallas Key, который подключен к порту COM2. Ключ Далласа имеет значение, когда он включен (например, 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 (мой ключ Далласа), когда он включен, и определить, когда он выключен, и принять определенные действие.

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Даже если вы не описали, какую строку на самом деле выдает, прочитав документацию, я обнаружил этот нюгет

SerialPort. Открытый метод

Исключения UnauthorizedAccessException Доступ к порту запрещен.

-или-

Текущий процесс или другой процесс в системе уже имеет указанный COM-порт открыт либо экземпляром SerialPort, либо неуправляемый код.

У вас либо нет разрешения на открытие порта, либо он у вас уже открыт, вам нужно выяснить, какой это порт, и соответствующим образом разобраться с ним

Примечание : com-порты могут быть немного непостоянными, если вы используете usb для com

0 голосов
/ 11 мая 2019

Приведенный ниже код работает, когда я пишу в консоли (Project is Console Application), но когда я вернулся в приложение 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();
    }
...