为什么我要在c#中拒绝COM端口访问

问题描述 投票:0回答:1

我正在使用serial communication实现Task。下面是我的代码

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

c# serial-port task console-application task-parallel-library
1个回答
0
投票

您异步调用PortHitmethod,这意味着多个正在运行的任务可以尝试访问该端口。您需要对使用该端口的代码进行锁定:

© www.soinside.com 2019 - 2024. All rights reserved.