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