我正在使用这段代码查找串口并在组合框中显示它们的名称。
string[] ports = SerialPort.GetPortNames();
foreach (string p in ports)
{
comboBox1.Items.Add(p);
}
comboBox1.SelectedIndex = 0;
因此,当我启动程序时,默认端口应该是ports
我正在使用此功能初始化串口
private void portInit()
{
port.PortName = comboBox1.Text;
port.BaudRate = 57600;
port.Parity = Parity.None;
port.ReceivedBytesThreshold = 8;
port.DataBits = 8;
port.Handshake = Handshake.None;
port.StopBits = StopBits.One;
port.DataReceived += new SerialDataReceivedEventHandler(datarecievedhandler);
port.Open();
}
如果用户决定更改串口
,我有这个事件处理程序 private void comboBox1_SelectionChangeCommitted(object sender, EventArgs e)
{
port.Close();
port.PortName = comboBox1.Text;
port.Open();
}
我在这部分代码中初始化我的串口
public Form1()
{
InitializeComponent();
InitializeGraphs();
portInit();
if (port.IsOpen)
textBox1.Text += "-Port " + port.PortName + " is opened\r\n";
}
设备连接到第一个(默认)串行端口。当我运行我的程序时,第一个端口打开(我知道它因文本框而打开),但是数据识别的事件处理程序不起作用。当我在组合框中更改串口时,没有任何反应(预期的行为),当我将我的串口改回第一个时,它会打开,并且基于数据的事件处理程序正常工作。当然,我希望第一个串口能够立即工作,而无需更改串口。我知道这个问题很长,但也许有人有类似的问题。
答案 0 :(得分:1)
简化问题 - 首先运行基础知识然后添加额外功能。
删除重新打开端口的事件处理程序,并禁用不必要的设置,如ReceivedBytesThreshold,因为这些可能会产生混淆水域的副作用。
然后您可以检查您是否有工作端口 - 如果您的波特率错误,您可能永远不会收到任何数据。在继续之前确保基本工作正常。
一旦你有一个工作的硬编码串口,然后逐个添加这些功能,这样你就可以看到哪一个打破了它。
此外,如果重新打开相同的端口对象失败,您可以尝试处理您的端口并创建一个新端口。