首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将波特率从9600设置为115200时的InvalidOperationException

将波特率从9600设置为115200时的InvalidOperationException
EN

Stack Overflow用户
提问于 2016-05-19 04:28:00
回答 1查看 325关注 0票数 0
代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;



namespace SerialPort
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            cmdClose.Enabled = false;
            foreach (String s in System.IO.Ports.SerialPort.GetPortNames()) 
            {
                txtPort.Items.Add(s);
            }
        }

    public System.IO.Ports.SerialPort sport;

    public void serialport_connect(String port, int baudrate , Parity parity, int databits, StopBits stopbits) 
    {
        DateTime dt = DateTime.Now;
        String dtn = dt.ToShortTimeString();

        sport = new System.IO.Ports.SerialPort(
        port, baudrate, parity, databits, stopbits);
        try
        {
            sport.Open();
            cmdClose.Enabled = true;
            cmdConnect.Enabled = false;
            txtReceive.AppendText("[" + dtn + "] " + "Connected\n");
            sport.DataReceived += new SerialDataReceivedEventHandler(sport_DataReceived);
        }
        catch (Exception ex) { MessageBox.Show(ex.ToString(), "Error"); }
    }

    private void sport_DataReceived(object sender, SerialDataReceivedEventArgs e) 
    {
        DateTime dt = DateTime.Now;
        String dtn = dt.ToShortTimeString();
        txtReceive.AppendText("["+dtn+"] "+"Received: "+sport.ReadExisting()+"\n");
    }

    private void cmdConnect_Click(object sender, EventArgs e)
    {
        String port = txtPort.Text;
        int baudrate = Convert.ToInt32(cmbbaudrate.Text);
        Parity parity = (Parity)Enum.Parse(typeof(Parity), cmbparity.Text);
        int databits = Convert.ToInt32(cmbdatabits.Text);
        StopBits stopbits = (StopBits)Enum.Parse(typeof(StopBits), cmbstopbits.Text);

        serialport_connect(port, baudrate, parity, databits, stopbits);

    }

    private void button1_Click(object sender, EventArgs e)
    {
        DateTime dt = DateTime.Now;
        String dtn = dt.ToShortTimeString();
        String data = txtDatatoSend.Text;
        sport.Write(data);
        txtReceive.AppendText("[" + dtn + "] " + "Sent: " + data + "\n");
    }

    private void cmdClose_Click_1(object sender, EventArgs e)
    {
        DateTime dt = DateTime.Now;
        String dtn = dt.ToShortTimeString();

        if (sport.IsOpen) 
        {
            sport.Close();
            cmdClose.Enabled = false;
            cmdConnect.Enabled = true;
            txtReceive.AppendText("[" + dtn + "] " + "Disconnected\n");
        }
    }
}

}

大家好,当我试图将我的波特率从9600设置到115200时,我遇到了抛出InvalidOperationException的麻烦。

你知道这是为什么吗?提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2016-05-19 04:46:00

您不允许这样做,您将得到您所看到的异常。

最好的解决方案取决于您使用的.Net版本,但无论您使用的是什么版本,都可以使用Control.BeginInvoke()来解决它。

在我提供的链接上有一些示例代码。

请注意,导致问题的不是设置波特率。这是sport_DataReceived()中的代码,它试图更新UI组件(您可以从您发布的第二张图片中看到)。

您可以按如下方式更改该函数:

代码语言:javascript
复制
private void sport_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    this.BeginInvoke(new Action(() =>
    {
        DateTime dt = DateTime.Now;
        String dtn = dt.ToShortTimeString();
        txtReceive.AppendText("[" + dtn + "] " + "Received: " + sport.ReadExisting() + "\n");
    }));
}

这样做会导致上面的Action代码在UI线程上被调用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37309509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档