[英]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.