【问题标题】:Serial port (datarecieved) doesnt work串行端口(接收到的数据)不起作用
【发布时间】:2011-12-29 09:37:54
【问题描述】:

我正在使用这段代码来查找串行端口并在组合框中显示它们的名称。

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";
}

设备连接到第一个(默认)串行端口。当我运行我的程序时,第一个端口打开(我知道它是因为文本框而打开的),但是 datarecieved 事件处理程序不起作用。当我在组合框中更改串口时,没有任何反应(预期行为),当我将串口更改回第一个时,它打开,并且 datarecieved 事件处理程序工作正常。当然,我希望第一个串口可以立即工作,而不需要更改串口。我知道这个问题是一个很长的问题,但也许有人遇到过类似的问题。

【问题讨论】:

  • 当您将 Handshake 设置为 None 时,由您决定是否打开握手信号。将 RtsEnable 和 DtrEnable 设置为 true。

标签: c# winforms serial-port


【解决方案1】:

简化问题 - 首先让基础工作正常,然后添加额外的功能。

删除重新打开端口的事件处理程序,并禁用不必要的设置,如 ReceivedBytesThreshold,因为这些可能会产生混淆水域的副作用。

然后您可以检查您是否有一个工作端口 - 如果您的波特率错误,您可能永远不会收到任何数据。在继续之前,请确保基础工作正常。

一旦你有一个工作的硬编码串行端口,然后将这些功能一一添加回来,这样你就可以看到哪个破坏了它。

此外,如果重新打开同一个端口对象失败,您可以尝试处置您的端口并创建一个新端口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多