gpt4 book ai didi

c# - C# 中的多个串行端口/使用列表 <> 时出现问题

转载 作者:行者123 更新时间:2023-11-30 20:56:27 25 4
gpt4 key购买 nike

我有一个系统,它向串行端口发送“at”命令并在 MessageBox 上显示返回。但我需要在所有可用的串行端口中执行此操作。所以我创建了一个列表,并在其中添加了所有端口。我设法发送了命令,但无法继续执行其余代码以捕获返回,因为我在处理列表时遇到问题。我是C#的初学者。以下是我当前的代码。被注释掉的部分是我正在努力继续的部分。这部分属于旧代码(当时只有一个串口)。

public partial class Form1 : Form
{
List<SerialPort> serialPort = new List<SerialPort>();

// delegate is used to write to a UI control from a non-UI thread
private delegate void SetTextDeleg(string text);

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
var portNames = SerialPort.GetPortNames();
foreach (var port in portNames) {
SerialPort sp;
sp = new SerialPort(port, 19200, Parity.None, 8, StopBits.One);
sp.Handshake = Handshake.None;
//sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
sp.ReadTimeout = 500;
sp.WriteTimeout = 500;

serialPort.Add(sp);
listPorts.Items.Add(port);
}
}

private void listPorts_SelectedIndexChanged(object sender, EventArgs e)
{

}

private void button1_Click(object sender, EventArgs e)
{
foreach (var sp in serialPort) {
// Open port
try
{
if (!sp.IsOpen)
sp.Open();

MessageBox.Show(sp.PortName + " aberto!");
sp.Write("at\r\n");
}
catch (Exception ex)
{
MessageBox.Show("Error opening/writing to serial port :: " + ex.Message, "Error!");
}
}
}

/* HELP START

void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep(500);
string data = sp.ReadLine();
this.BeginInvoke(new SetTextDeleg(si_DataReceived), new object[] { data });
}

private void si_DataReceived(string data)
{
String retorno = data.Trim();
MessageBox.Show(retorno);
// Fecha a porta após pegar o retorno
sp.Close();
}

HELP END */

}

什么地方放'sp.ReadLine();'和'sp.Close ();'?我不知道这样做是因为列表 <>

最佳答案

最简单的方法是使用 lambda 表达式 来捕获您正在使用的端口。 lambda 表达式是一种构建“内联”委托(delegate)的方式 - 并且能够使用您在其中声明它的方法中的局部变量。

例如:

foreach (var port in portNames)
{
// Object initializer to simplify setting properties
SerialPort sp = new SerialPort(port, 19200, Parity.None, 8, StopBits.One)
{
Handshake = Hanshake.None,
ReadTimeout = 500,
WriteTimeout = 500
};
sp.DataReceived += (sender, args) =>
{
Thread.Sleep(500); // Not sure you need this...
string data = sp.ReadLine();
Action action = () => {
MessageBox.Show(data.Trim());
sp.Close();
};
BeginInvoke(action);
};
serialPort.Add(sp);
listPorts.Items.Add(port);
}

一些注意事项:

  • 仅仅因为接收到一些数据并不意味着接收到整行数据,所以ReadLine可能仍会阻塞
  • 如果您需要显示消息框,则可能不需要Control.BeginInvoke。 (如果您需要在这里做更多的事情,您可能希望将大部分代码提取到一个单独的方法中,该方法只接受一个字符串,然后创建一个将调用该方法的操作。)
  • 您确定要在收到第一行后立即关闭串口吗?

关于c# - C# 中的多个串行端口/使用列表 <> 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17519760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com