【发布时间】:2019-07-22 07:38:13
【问题描述】:
我正在尝试通过自动创建一个串行端口对象并为其分配一个事件来侦听多个串行端口。映射函数用TestMachine检查接收到的数据是否正确并返回true/false。但是,当我尝试将代码放入 for 或 if 循环时出现问题,第一个串行端口接收到正确的数据(映射函数返回 true),然后第二个端口未接收到数据,这仅在收到 2 个端口中的一个时发生正确的结果(映射函数返回true)。
下面的代码没有 If(true)。
SerialPort _serialPortA = new SerialPort(portA.ToString());
_serialPortA.BaudRate = machineA.BaudRate;
_serialPortA.Parity = machineA.Parity;
_serialPortA.StopBits = machineA.StopBits;
_serialPortA.DataBits = machineA.DataBits;
_serialPortA.Handshake = machineA.Handshake;
_serialPortA.DataReceived += new SerialDataReceivedEventHandler((sender2, e2) => DataReceivedHandler(sender2, e2, machineA));
try
{
if (!_serialPortA.IsOpen)
{
_serialPortA.Open();
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
SerialPort _serialPortB = new SerialPort(portB.ToString());
_serialPortB.BaudRate = machineB.BaudRate;
_serialPortB.Parity = machineB.Parity;
_serialPortB.StopBits = machineB.StopBits;
_serialPortB.DataBits = machineB.DataBits;
_serialPortB.Handshake = machineB.Handshake;
_serialPortB.DataReceived += new SerialDataReceivedEventHandler((sender3, e3) => DataReceivedHandler(sender3, e3, machineB));
try
{
if (!_serialPortB.IsOpen)
{
_serialPortB.Open();
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
下面的代码不起作用。不同之处只是将代码放入 if(true){...} 块中。
if (true) {
SerialPort _serialPortA = new SerialPort(portA.ToString());
_serialPortA.BaudRate = machineA.BaudRate;
_serialPortA.Parity = machineA.Parity;
_serialPortA.StopBits = machineA.StopBits;
_serialPortA.DataBits = machineA.DataBits;
_serialPortA.Handshake = machineA.Handshake;
_serialPortA.DataReceived += new SerialDataReceivedEventHandler((sender2, e2) => DataReceivedHandler(sender2, e2, machineA));
try
{
if (!_serialPortA.IsOpen)
{
_serialPortA.Open();
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
if (true) {
SerialPort _serialPortB = new SerialPort(portB.ToString());
_serialPortB.BaudRate = machineB.BaudRate;
_serialPortB.Parity = machineB.Parity;
_serialPortB.StopBits = machineB.StopBits;
_serialPortB.DataBits = machineB.DataBits;
_serialPortB.Handshake = machineB.Handshake;
_serialPort10.DataReceived += new SerialDataReceivedEventHandler((sender3, e3) => DataReceivedHandler(sender3, e3, machineB));
try
{
if (!_serialPortB.IsOpen)
{
_serialPortB.Open();
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
这是 DataReceivedHandler 函数
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e, AnalysisMachine m)
{
//Thread.Sleep(100);
string res = ((SerialPort)sender).ReadExisting();
res = res.Replace("\r", "");
try
{
if (m.Mapping(res, m.Name))
{
m.PostData();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
【问题讨论】:
标签: c# multithreading serial-port