通常,当我创建 Com 端口时,它是一个类级别对象,我在启动期间初始化一次。我会将您的初始化代码从您的方法中移出,并移至您可以在启动期间调用一次的构造函数或方法中。这应该可以防止您尝试多次打开它,并且仍然可以使其响应接收到的数据。
我不确定你的架构,看起来你可能计划有多个端口,但是
回答您在评论中的问题,您为创建串行端口所做的一切。串行端口的声明至少应该是类级别变量。然后您可以检查它是否什么都没有并第一次创建它。
string selectedportname = default(string);
DA.GetData(1, ref selectedportname);
int selectedbaudrate = default(int);
DA.GetData(2, ref selectedbaudrate);
bool connecttodevice = default(bool);
DA.GetData(3, ref connecttodevice);
SerialPort port = new SerialPort(selectedportname, selectedbaudrate, Parity.None, 8, StopBits.One);
port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
DA.SetDataList(0, myReceivedLines);
port.Open(); // optional I usually open it at the time that I initialize it. you can check `port.IsOpen()`
// and Open it if it is false.
使用类级串行端口的第二个选项尝试如下操作:
protected override void SolveInstance(IGH_DataAccess DA)
{
if(port == null)
{
string selectedportname = default(string);
DA.GetData(1, ref selectedportname);
int selectedbaudrate = default(int);
DA.GetData(2, ref selectedbaudrate);
bool connecttodevice = default(bool);
DA.GetData(3, ref connecttodevice);
port = new SerialPort(selectedportname, selectedbaudrate, Parity.None, 8, StopBits.One);
if (connecttodevice == true)
{
port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
DA.SetDataList(0, myReceivedLines);
}
port.DtrEnable = true;
port.Open();
}
bool homeall = default(bool);
DA.GetData(5, ref homeall);
if (homeall == true)
{
port.Write("g28");
}
}