Ошибка последовательного порта 9 неверный дескриптор

Здравствуйте друзья!

Приобрёл на Али CNC 1419 за 25 тыр., думаю, отличие от CNC 3018 не большое.

На фото 1 это то, что получил.

Но как то не заходит,( может возраст сказывается, мне 64й идёт) прошу помощи кто сталкивался с подобным или есть какие соображения. Буду очень благодарен за участие.

Опишу проблему. Прошу не судить строго, т.к. сей агрегат вижу впервые и могу описать не общепринятыми выражениями, а по своему умозаключению.

И так, при получении и сборке ось «Х» не накручивалась на латунную втулку,(фото 2) вернее их две со шлицами и между ними пружина, туда сюда разобрался, что у вала шаг другой, выписал с Али нужный вал, поставил, но люфт на валу не менее 0,25 мм ( причём на всех).Для уменьшения люфта поставил дополнительные пружины поверх существующих раза в 3-4 мощнее. Прочитал на форуме, что пружина даёт дополнительный износ втулок (мы же сначала собираем, потом инструкцию читаем).Теперь буду опять всё разбирать и снимать дополнительные пружины. Прошивку поставил 1.1 , запустил Candle и пробую китайскую модель в .nc формате. И двигатель произвольно в любом месте отключается и в программе отображается следующее:

[CTRL+X] < Grbl 1.1f [‘$’ for help]

M3 S1500 < ok

M5 < ok

M3 S1500 < ok

M5 < ok

M3 S1500 < ok

Ошибка последовательного порта 9: Операция ввода/вывода была прервана из-за завершения потока команд или по запросу приложения.

Ошибка последовательного порта 2: Отказано в доступе.

Ошибка последовательного порта 9: Неверный дескриптор.

Ошибка последовательного порта 1: No such file or directory

[CTRL+X] < Grbl 1.1f [‘$’ for help]

M3 S1500 < ok

Нажимаешь в программе на значок «шпиндель»-молчит, но на визуализации показывает, что крутиться. Рукой тронул вал, он раскручивается и останавливается. И так можно бесконечное количество раз. Бывает и рукой не трогаешь запуститься, а тронешь -останавливается.

Пытался поставить лазер, предварительно выставив $32=1.Его как будто и нету.

Блок питания регулируемый от 12 до 24 вольт на 5 ампер. При подключении к нему двигателя (шпинделя) на прямую, работает прекрасно, чётко, без остановок.
Друзья, прошу отозваться , у кого какие мысли, куда посмотреть , что сделать?

Спасибо!

dshym

Новичок
Сообщения: 31
Зарегистрирован: 28 окт 2017, 20:08
Репутация: 0
Настоящее имя: Дмитрий
Контактная информация:


Ошибка последовательного порта При включенном шпинделе

Описание станка, основные характеристики: Самодельный станок по собственному проекту, материал металл 8мм. Шаговые двигатели nema 23hs8430. Шпиндель 500Вт (китай)
Рабочее поле: 500*700
Обрабатываемые материалы: Как получится
Вопросы: Проблема возникла после покупки шпинделя, до этого фрезеровал гравером и было все нормально. При включении шпинделя grblcontroll начинает выводить какие то символы (скорее всего помехи от коллекторного шпинделя)
Лог программы:
порта 1: No such file or directory
[CTRL+X] < Grbl 0.9j [‘$’ for help]
.000,0.000,0.000>
.000,0.000,0.000>
0.000,0.000,0.000>
0.000,0.000,0.000>
0.000,0.000,0.000>
.000,0.000,0.000>
.000,0.000,0.000>
0.000,0.000,0.000>
.000,0.000,0.000>
:0.000,0.000,0.000>
0.000,0.000,0.000>
.000,0.000,0.000>
.000,0.000,0.000>
.000,0.000,0.000>
.000,0.000,0.000>
Ошибка последовательного порта 11: Неизвестная ошибка
Ошибка последовательного порта 9: Неверный дескриптор.
[CTRL+X]
Шпиндель питается от комплектного БП 100 вольт, как я понял он построен на ШИМе.
С двух сторон провода шпинделя одеты ферритовые трубки, так же по питанию БП.
Управляет всем arduino UNO, драйверы шаговых двигателей TB6600.
Заземление в доме и на станке отсутствует (я понимаю что его надо… нету)
Все пока находится в стадии настройки, короб будет для Блока управления.
Ориентировочный бюджет: Станок вышел на 35К

Вложения
a4PHd0G7Ce0.jpg (3075 просмотров) <a class='original' href='./download/file.php?id=141030&sid=ed397ca1947ab782ae9c50b7505734a7&mode=view' target=_blank>Загрузить оригинал (402.17 КБ)</a>

Я разработал простую программу для последовательного порта, которая отлично работает с COM-портами ниже 10 (COM9, COM8,… COM1). Но когда мое устройство подключено к порту более 10, например COM11, оно не подключается, и я получаю INVALID_HANDLE. Мой код:

comport = CreateFileA(comPortName.toAscii(), GENERIC_READ|GENERIC_WRITE,
                      FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);

if(comport == INVALID_HANDLE_VALUE)
{
    //Write exception code here
    connectionStatus = CONNECTION_STATUS_DISCONNECTED;
}

Что случилось с моим кодом? Есть ли какое-либо решение?

02 нояб. 2012, в 10:28

Поделиться

Источник

2 ответа

Чтобы добраться до COM-портов >= 10, вы можете использовать символическую ссылку драйвера. Например, для COM10 это \\.\COM10.

Просто попробуйте:

comport = CreateFileA("\\.\COM10", GENERIC_READ|GENERIC_WRITE,
                  FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);

if(comport == INVALID_HANDLE_VALUE)
{
    // Write exception code here
    connectionStatus = CONNECTION_STATUS_DISCONNECTED;
}

Конечно, это также работает для COM-портов < 10.

David J
02 нояб. 2012, в 09:28

Поделиться

Ещё вопросы

  • 0jQuery при нажатии prepend divs в начале «списка»
  • 0как сообщить, что область видимости обновлена в angularjs?
  • 0Функция импорта Matlab Coder и C ++ исполняемый файл
  • 0Не можете прочитать свойство $ обещание тогда неопределено?
  • 0ASP.NET API Controller возвращает XMLHttpRequest не может загрузить URL Неверный код состояния HTTP 404
  • 1Scrapy пустой CSV-файл
  • 1Получение ошибки Gradle без указания причины
  • 0Запретить ввод, пока не закончится первое действие?
  • 1Python — необычное вещание для загадки особого случая
  • 0тип начала эффекта (HTML, CSS, JQUERY)
  • 0Если в iframe показать / скрыть div
  • 1Использование foreach с движком представления ASP.NET внутри ASP: Repeater не работает
  • 1Это отношения многие ко многим?
  • 0Почему ElementTree не может правильно проанализировать этот тег XML?
  • 1Какова сложность времени для следующей программы?
  • 0Как найти ближайшие значения как нижних, так и верхних в массиве объектов в PHP?
  • 0Несколько экземпляров свойства перехода среди классов, используемых в одном элементе
  • 1Группировать по numpy.mean
  • 0Связывание проблем с libharu
  • 0Сделайте фон поля поиска кликабельным
  • 0Добавить, где предложения к SQL выбрать динамически
  • 1Как я могу сделать цикл в XML-файле, который я получаю значение Attributte?
  • 0Начиная Angular на Xampp
  • 1NancyFx не может найти ссылку на NewtonSoft в Razor View Engine
  • 1Чтение данных из Http-ответа редко вызывает BindException: адрес уже используется
  • 0Ошибка подключения к базе данных, статус HTTP 500
  • 0Доступ к защищенным статическим членам суперкласса подклассами в C ++
  • 0Symfony отображает значение BLOB-объекта
  • 0asp.net получает данные из запроса
  • 0Сортировка пользовательского связанного списка с помощью <алгоритма> сортировки
  • 0Как подключиться к серверу sql используя php в xampp
  • 0как передать max_streak_length из командной строки
  • 1выбрать отдельные строки в мультииндексном панде данных [дубликаты]
  • 1Самый простой способ добавить политику конфиденциальности с моим приложением для Android
  • 0Предупреждающее сообщение Недопустимый тип смещения от функции Где Mysql php
  • 0AngularJS Valdiation не работает с директивой People Picker
  • 0Замена строкового значения в PHP
  • 1Десериализовать JSON C #
  • 1Закрепление WinForm внутри другого WinForm
  • 1Разделить ArrayList на несколько ArrayList в зависимости от ввода пользователя
  • 1Ищет наличие составного ключа в трех DataFrames и соответственно объединяет DataFrames
  • 0HTML несколько уровней развернуть свернуть для таблицы с большим количеством строк медленно
  • 1Добавить DataFrame внутри функции
  • 0Подождите, пока загрузится следующая страница, затем нажмите
  • 1Как проверить, что одно из многих условий выполнено на Мокито? Можно ли проверить, был ли вызван один ИЛИ другой метод?
  • 0Коды Javascripts, которые запомнят предыдущие настройки пользователя на Radio flash Player
  • 0Как я могу изменить массив в директиве, а затем отразить это изменение в моем контроллере?
  • 0Разобрать $ routeParams в объекте config
  • 0Чтение данных с firebase в angularfire
  • 1Имеет ли название «взаимосвязанный» какое-то конкретное значение?

Сообщество Overcoder

#c #serial-port #file-descriptor

#c #последовательный порт #файловый дескриптор

Вопрос:

Я реализую простой протокол для передачи файлов между 2 ПК через последовательный порт, и я получаю странную ошибку.

На главном я вызываю функцию «llopen»:

 int 
llopen(int port, int type) {

    int     fd = 0;
    char*   PORT;


    PORT = malloc( sizeof(char) * (strlen(COM)   1) );
    sprintf(PORT,"%s%d",COM,port);

    fd = initialization(PORT); // Open(...): returns a file descriptor!

    switch(type) {
            case SENDER:
                    return connectSender(fd);
                    break;
            case RECEIVER:
                    return connectReceiver(fd);
                    break;
    }

    return fd; // The fd value here is 5

}
 

После этого я вызываю функцию llwrite(int fd, …), чтобы записать строку в файловый дескриптор, но я получаю сообщение об ошибке: «Неверный файловый дескриптор» на llwrite(int fd, …). Если я снова вызову функцию инициализации (порта), перед этим она сработает и запишет N байтов в файловый дескриптор, но если я этого не сделаю, она снова выдаст мне ошибку «Неверный файловый дескриптор».

Здесь это функция llwrite(int fd, …):

 int 
llwrite(int fileDescriptor, unsigned char* buffer, unsigned int length) {


    // The fd value here is 5
    return writeBuffer(fileDescriptor,buffer,length);

}
 

Даже перед операцией return, если я вызываю, например, функцию tcflush(…), я получаю сообщение об ошибке «Неверный файловый дескриптор».

Есть какие-нибудь подсказки? Заранее спасибо!

Редактировать:

Проблема решена.

ошибка llopen(…). Я возвращал количество байтов, записанных в ConnectReceiver(…) / ConnectSender(…), а не в файловый дескриптор

Теперь все правильно:

 int 
llopen(int port, int type) {

   int     fd = 0;
   char*   PORT;


   PORT = malloc( sizeof(char) * (strlen(COM)   1) );
   sprintf(PORT,"%s%d",COM,port);

   fd = initialization(PORT); // Open(...): returns a file descriptor!

   switch(type) {
           case SENDER:
                   if( connectSender(fd) > 0 ) return fd;
           case RECEIVER:
                   if( connectReceiver(fd) > 0 ) return fd;
   }

   return -1;

}
 

Комментарии:

1. Вы не выделяете достаточно байтов для порта, должно быть не менее 2, чтобы хватило места для номера порта. В остальном это кажущаяся странной смесь *nix и кода Windows.

2. обратите внимание, что это позволяет использовать только порт COM1 на COM9 и может привести к сбою с некоторыми usb / последовательными преобразователями. вы действительно должны открыться .COM1 (остерегайтесь правильного экранирования обратной косой черты …)

3. @HansPassant Да, вы правы. Но проблема не в этом. Я имею в виду, я могу выполнить ConnectSender(…) и ConnectReceiver(…) , и я получаю правильный файловый дескриптор, но затем я пытаюсь выполнить llwrite(int fd) , и это не работает.

4. @AdrienPlisson Это не имеет отношения к делу.

5. Ну, вы знаете, что повреждаете кучу, а затем задаетесь вопросом, почему программа работает неправильно. Сначала прекратите разрушать кучу. Используйте отладчик, если это не поможет.

Ответ №1:

На самом деле здесь недостаточно информации, но стоит отметить, что вы делаете

 return connectSender(fd);
break;
 

Разрыв там является мертвым кодом, поскольку возврат останавливает выполнение функции. Возможно, вы не хотели возвращаться?

Если это не так, попробуйте использовать strace , чтобы получить более подробную информацию о том, что происходит. Если вы не используете Linux, в других ОС должны быть аналогичные инструменты, такие как dtruss или ktrace .

Комментарии:

1. Вы правы. Это мертвый код, и я хотел вернуться прямо туда, но это не имеет отношения к проблеме.

  1. Доброго времени. При управлении нагрузкой через ардуино по последовательному порту, очень часто возникает проблема: выдает ошибку «Ошибка при настройке параметров последовательного порта: 9 600 N 8 1». Нагрузкой является двигатель, который вращается в разные стороны. Пример кода:

    void setup() {
      // put your setup code here, to run once:
    Serial.begin(9600);
    pinMode(7,OUTPUT);
    pinMode(8,OUTPUT);
    digitalWrite(7,LOW);
    digitalWrite(8,LOW);
    }

    void loop() {
      // put your main code here, to run repeatedly:
    if(Serial.available()>0){

       
      int val = Serial.read();
      if(val==‘1’){   //если нажата 1, то вал двигателя вращается по часовой стрелке
        digitalWrite(7,HIGH);
        digitalWrite(8,LOW);
        Serial.println(«RIGHT»);
      }
      if(val==‘2’){//если нажата 2, то вал двигателя вращается против часовой стрелке
        digitalWrite(7,LOW);
        digitalWrite(8,HIGH);
        Serial.println(«LEFT»);
      }
      if(val==‘3’){ //если нажата 3, то останавливаем
        digitalWrite(7,LOW);
        digitalWrite(8,LOW);
        Serial.println(«STOP»);
      }
    }
    }

    Собственно говоря, не в коде дело. Дело в том, что эта ошибка постоянно возникает. Как ее решать даже не знаю. Двигатель подключен через реле. Параллельно управляющей обмотке стоит диод. Что интересно, данная проблема достает на 7 винде, а на 8 не так часто. По вашему опыту в чем может быть дело?

  2. rkit, а с чем эти проблемы (с usb) могут быть связаны?

  3. Питание для двигателя откуда берется?

  4. 127 В переменного напряжения

  5. Со всем, что касается usb. Начиная от драйверов и заканчивая электромагнитным фоном в помещении.

Понравилась статья? Поделить с друзьями:

Не пропустите эти материалы по теме:

  • Яндекс еда ошибка привязки карты
  • Ошибка последовательного порта 11 превышен таймаут семафора
  • Ошибка получения трансляции сбер салют
  • Ошибка после установки игры
  • Ошибка получения токена что это

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии