簡體   English   中英

為什么我在 c# 中收到 COM 端口訪問被拒絕

[英]Why I am getting COM port access denied in c#

我正在使用Task實現serial communication 下面是我的代碼

public async Task YtlbusMethod(List<Iterations> ytlbus)
    {                   
        while(true)
        {
            try
            {
                foreach (var item in ytlbus)
                {
                    MySqlConnection cn = null;

                    using (cn = new MySqlConnection(conn.ConnectionString))
                    {
                        string query = "SELECT m.`time` FROM `mdc_meter_config` m WHERE m.`row_id` = @row_id";
                        cn.Open();
                        MySqlCommand cmd = new MySqlCommand(query, cn);
                        cmd.CommandText = query;
                        cmd.Parameters.AddWithValue("@row_id", item.row_id);

                        reader = cmd.ExecuteReader();
                        while (reader.Read())
                        {
                            string time = (string)reader["time"];
                            if (item.time == time)
                            {
                                int sleeptime = Convert.ToInt32(item.time);
                                sleeptime = sleeptime * 1000;

                                Thread.Sleep(sleeptime);
                                Task.Factory.StartNew(() => PortHitmethod(item));
                            }
                        }

                    }
                    cn.Close();
                }
            }
            catch(Exception ex)
            {
                Console.WriteLine("Error at Line " + LineNumber(), ex.Message.ToString());

            }

        }



    }

端口命中方法

public async Task  PortHitmethod(Iterations iterations)
    {
        SerialPort port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);         

        byte[] buffer = new byte[4096];
        MySqlConnection cn = null;
        List<string> data = new List<string>();

        try
        {

            using (cn = new MySqlConnection(conn.ConnectionString))
            {
                string query = "SELECT m.`read_param` FROM mdc_request m WHERE m.`row_id` = @row_id";
                cn.Open();
                Console.WriteLine(LineNumber() + "is ok");
                MySqlCommand cmd = new MySqlCommand(query, cn);
                cmd.CommandText = query;
                cmd.Parameters.AddWithValue("@row_id", iterations.row_id);

                reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    data.Add(reader["read_param"].ToString());
                }


            }
            cn.Close();

            var single = string.Join("", data);


            var all = header + functionCode + length + iterations.hex + eTag + single + CRC + footer;

           var full = all.Select((x, i) => (Index: i, Value: x)).GroupBy(tuple => tuple.Index / 2, tuple => tuple.Value, (_, values) => "0x" + string.Join("", values))
 .Select(x => Convert.ToByte(x, 16))
 .ToArray();

            port.Open();             

            port.BaseStream.Write(full, 0, full.Length);
            Thread.Sleep(100);


            int receivedBytes = port.BaseStream.Read(buffer, 0, (int)buffer.Length);

            var receiveData = BitConverter.ToString(buffer, 0, receivedBytes);


            .
            .
            .
            .
            .
            . 
            // saving data in DB



            // closing port
            port.Close();


        }
        catch (Exception ex)
        {
            port.Close();
            Console.WriteLine("Error at Line " + LineNumber(), ex.Message.ToString());

        }

    }

在執行代碼時,我access to COM1 is denied

您異步調用PortHitmethod ,這意味着多個正在運行的任務可以嘗試訪問該端口。 您需要鎖定使用端口的代碼:

object lockObj = new object(); //Put this in your class

然后在PortHitmethod中做

... 使用 (lockObj) { port.Open(); ... 端口。關閉(); }

此外,請確保您已try / finally使用端口的代碼,以便在發生錯誤時始終關閉端口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM