Отправка правильной строки Gcode на последовательный порт?

Я пытаюсь отправить гкодg28 на мой принтер RepRap 3D через линиюport.Write("g28");.

Моя программа подключается к правильному последовательному порту, однако, когда я пытаюсь отправить информацию в виде строки, доступ к com-порту запрещается.Это странно, потому что последовательный порт был открыт до отправки ему Gcode. Он даже отправил некоторые данные обратно. В чем проблема и как я могу это исправить?

Ниже приведены строки кода, которые я использую. Список команд gcode доступен на этомстраница.

Я попытался добавить"\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");
        }

    }
 sawdust15 окт. 2012 г., 01:21
"Port.Write (" G28 ")" - «g28» даже не указан как допустимая операция; какую операцию вы пытаетесь сделать? «G» или «M» должны быть написаны заглавными буквами, и вам нужно завершить строку с помощью «\ n».«Он даже отправил некоторые данные обратно». - Что это было за сообщение?
 Arthur Mamou-Mani15 окт. 2012 г., 01:12
@sawdust Перед отправкой Gcode на последовательный порт я только что обновил вопрос. Большое спасибо.
 sawdust15 окт. 2012 г., 01:08
«Доступ к com-порту запрещен, когда это было раньше». - До чего? Вы пробовалистолица (он же прописной) "G"?
 Mark Hall15 окт. 2012 г., 01:51
@ ArthurMamou-Mani Попробуйте поместить port.Close () в конце вашего метода.
 Mark Hall15 окт. 2012 г., 01:37
Я предполагаю, что SolveInstance вызывается только один раз, в противном случае порт будет заблокирован созданным Com-портом во время первого вызова.

Ответы на вопрос(1)

Решение Вопроса

когда я создаю 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.

Второй вариант с SerialPort уровня класса Попробуйте что-то вроде этого:

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

}   
 Arthur Mamou-Mani15 окт. 2012 г., 02:31
Извините, если я вывезу всеif заявления SolveInstance, как я смогу получить к ним доступ из моей программы, поскольку метод SolveInstance () - это место, где я могу назначить ему данные? Спасибо.
 Arthur Mamou-Mani15 окт. 2012 г., 13:23
Обновление: благодаря вашему ответу мне удалось отправить gcode, и машина отреагировала правильно (так что это правильный ответ), но я больше не получаю обратной связи. я буду работать над этим.
 Arthur Mamou-Mani15 окт. 2012 г., 02:22
Большое спасибо, что бы вы включили вInitialization Code из кода выше?
 Arthur Mamou-Mani15 окт. 2012 г., 11:57
Большое спасибо @MarkHall, со вторым вариантом я получаю ошибку при включенииHomeAll на:Error: Solution exception: A device attached to the system is not functioning Затем, когда я включаю другие команды, а порт должен быть подключен, я получаю:Error:Solution exception: The port is closed. Ошибки исчезают, когда все команды на ложь. Я хочу подключиться только к одному устройству. Я не понимаю сообщениеaccess denied больше, что является положительным моментом даже при выключении и включенииConnecttoDevice несколько раз.
 Mark Hall15 окт. 2012 г., 02:42
@ ArthurMamou-Mani Посмотрите на второй вариант, главное - не создавать несколько последовательных портов.

Ваш ответ на вопрос