#1 2020-06-08 12:51:04

Валентин Штурм
Учасник
Зареєстрований: 2020-06-08
Повідомлень: 1

Помогите Пожалуйста Новичку

Привет всем.Помогите пожалуйста новичку.Не могу понять в чем проблема. В общем отправляю на ардуино нано код типа X1000 и так много раз, но в прекрасный момент код перестает исполняться и шаговый двигатель останавливается на 13 строчке кода. Использую ардуино нано, шд Nema 17,Может как то буфер переполняется я ХЗ?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using System.Diagnostics;
using AngleSharp.Text;
//using System.Windows.Documents;

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        bool isConnected = false;
        public Form1()
        {
            InitializeComponent();
            
        }
        
        private void button1_Click(object sender, EventArgs e)
        {
            comboBox1.Items.Clear();
            string[] portnames = SerialPort.GetPortNames();
            if (portnames.Length == 0)
            {
                MessageBox.Show("COM PORT not found");
            }
            foreach (string portName in portnames)
            {
                comboBox1.Items.Add(portName);
                Console.WriteLine(portnames.Length);
                if (portnames[0] != null)
                {
                    comboBox1.SelectedItem = portnames[0];
                }
            }
        }
        private void connectToArduino()
        {
            isConnected = true;
            string selectedPort = comboBox1.GetItemText(comboBox1.SelectedItem);
            serialPort1.PortName = selectedPort;
            serialPort1.Open();
            button2.Text = "Disconnect";
        }
        private void disconnectFromArduino()
        {
            isConnected = false;
            serialPort1.Close();
            button2.Text = "Connect";
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            // При закрытии программы, закрываем порт
            if (serialPort1.IsOpen) serialPort1.Close();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            if (!isConnected)
            {
                connectToArduino();
            }
            else
            {
                disconnectFromArduino();
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (isConnected)
            {
                

                if (checkBox1.Checked)
                {
                   serialPort1.Write("X");
                }
                if (checkBox2.Checked)
                {
                    serialPort1.Write("E");
                }
                if (checkBox3.Checked)
                {
                    serialPort1.Write("J");
                }


            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
             if(checkBox1.Checked)
            {
                serialPort1.Write("B");
            }
            if (checkBox2.Checked)
            {
                serialPort1.Write("C");
            }
            if (checkBox3.Checked)
            {
                serialPort1.Write("D");
            }
        }


        private void button5_Click(object sender, EventArgs e)
        {


            string[] lines = richTextBox1.Text.Split('\n');
            foreach (string s in lines)
            {
                serialPort1.Write(s);
            }
        }



            private void Form1_Load_1(object sender, EventArgs e)
        {
            


        }

        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {

        }
    }
}
#include <Arduino.h>
#include <AccelStepper.h>


AccelStepper mystepper(1, 5, 4);

int data; 
int data1;
int coefi = 8;

void  setup () {  
    Serial.begin (115200);  
    mystepper.setMaxSpeed(5000);
    mystepper.setAcceleration(800);
}  

void  loop () {  
     
     stepButton();

}
void stepButton(){
  if  (Serial.available()) {  
        data1 = Serial.read();
        data = Serial.parseInt()-'0'; 
        Serial.println(data);
         if (data1=='X'){
          //mystepper.setSpeed(9000);

          mystepper.setCurrentPosition(0);
          mystepper.runToNewPosition(data);
         }    
        
        if  (data1 ==  'E') {
          mystepper.setSpeed(9000);
          mystepper.setCurrentPosition(0);
          mystepper.runToNewPosition(2500*coefi);
        }
        if  (data1 ==  'J') {
          mystepper.setSpeed(9000);
          mystepper.setCurrentPosition(0);
          mystepper.runToNewPosition(-5000*coefi);
        }
        if  (data1 ==  'B' ) {
          mystepper.setSpeed(-9000);
          mystepper.setCurrentPosition(0);
          mystepper.runToNewPosition(-1000*coefi);
        }
        if(data1 == 'C'){
          mystepper.setSpeed(-9000);
          mystepper.setCurrentPosition(0);
          mystepper.runToNewPosition(-2500*coefi);
        }
        if(data1 == 'D'){
          mystepper.setSpeed(-9000);
          mystepper.setCurrentPosition(0);
          mystepper.runToNewPosition(5000*coefi);
                
        }
    }
}    

Неактивний

#2 2020-06-10 14:33:49

YK
Учасник
Зареєстрований: 2020-02-26
Повідомлень: 27

Re: Помогите Пожалуйста Новичку

Бегло просмтривая код, думаю проблема в рассинхронизации комманд.
Например ты отправляешь X1000 но по какой то причине Serial.parseint() не дочитывает данные.
Т.е. срабатывает time out 1 sec по умолчанию для parseint(). и Arduino вычитала только X100, соответсвенно все остальные команды уже сыпяться

Посмотри в отладчике порта, что ты получаешь в Arduino, ну и наверное надо команды терминировать новой строкой
Тогда ParseInt не будет ждать 1 sec, а для тебя это будет признак целостности команды, новый свой цикл всегда будет начинаться после получения новой строки
Код надо будет подправить что вычитать и проверить новую строку

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму