gpt4 book ai didi

c# - 将正确的 Gcode 字符串发送到串行端口?

转载 作者:行者123 更新时间:2023-11-30 12:12:48 24 4
gpt4 key购买 nike

我正在尝试通过 port.Write("g28"); 行将 gcode g28 发送到我的 RepRap 3D 打印机。

我的程序连接到正确的串行端口,但是当我尝试将信息作为字符串发送时,对 com 端口的访问被拒绝。 这很奇怪,因为串行端口在发送 Gcode 之前是打开的。它甚至发回了一些数据。那里有什么问题,我该如何解决?

下面是我正在使用的代码行。 gcode 命令列表可在此 page 上找到.

我试过在字符串末尾添加一个 "\n" 但它不起作用。

    //Fields
List<string> myReceivedLines = new List<string>();


//subscriber method for the port.DataReceived Event
private void DataReceivedHandler(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
while (sp.BytesToRead > 0)
{
try
{
myReceivedLines.Add(sp.ReadLine());
}
catch (TimeoutException)
{
break;
}
}
}


protected override void SolveInstance(IGH_DataAccess DA)
{

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);
bool homeall = default(bool);
DA.GetData(5, ref homeall);

SerialPort port = new SerialPort(selectedportname, selectedbaudrate, Parity.None, 8, StopBits.One);

port.DtrEnable = true;
port.Open();

if (connecttodevice == true)
{
port.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
DA.SetDataList(0, myReceivedLines);
}

if (homeall == true)
{
port.Write("g28");
}

}

最佳答案

通常当我创建一个 Com 端口时,它是一个类级别的对象,我在启动期间初始化一次。我会将您的初始化代码从您的方法中移出,并移至您可以在启动期间调用一次的构造函数或方法中。这应该可以防止您多次尝试打开它并仍然可以使用它来响应接收到的数据。


我不确定你的架构看起来你可能计划有多个端口但是在评论中回答您的问题,您为创建 SerialPort 所做的一切。 SerialPort 的声明至少应该是一个类级别变量。然后您可以检查它是否为空并在第一次创建它。

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

}

关于c# - 将正确的 Gcode 字符串发送到串行端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12886850/

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