Постоянная потеря последовательных данных через USB. Исключили аппаратное и программное обеспечение rx/tx. Что осталось?
У меня есть Lasersaur, который представляет собой лазерный резак с открытым исходным кодом на базе arduino. Частью его возможностей является растровая гравировка, при которой изображения вытравливаются на основе пиксельных данных, а не векторных. Недавно у меня возникла странная проблема, из-за которой я теряю некоторые данные, которые отправляю по последовательному каналу на машину, и конец изображения обрезается. Я не верю, что эти детали имеют отношение к этому вопросу, но вы можете прочитать мои сообщения здесь для получения дополнительной информации.
В принципе, на моем старом ноутбуке B гравировка работает. Если я использую точно такое же аппаратное соединение USB, прошивку, исполняемый файл программного обеспечения frontend, настройки гравировки и файл изображения на моем текущем ноутбуке A, я вижу плохие результаты. Последние ~ 20 пикселей или около того каждой строки изображения не вытравлены, и единственная причина, по которой я могу думать об этом, заключается в том, что цветовые данные для этих пикселей не были отправлены в первую очередь. Примечательно, что ноутбук А работал несколько месяцев назад, когда я в последний раз пробовал это сделать. Поэтому я вполне уверен, что исключил аппаратное обеспечение и программное обеспечение rx / tx в качестве возможных проблем.
Единственная разница между двумя машинами, о которой я могу думать и которая изменилась с тех пор, заключается в том, что я установил обновление Windows 10 1909, а также некоторое другое программное обеспечение, которое мне придется перерыть, чтобы перечислить. Мне бы очень не хотелось делать новую переустановку Windows на моей основной машине, но я близок к этому.
Может ли что-то там быть причиной проблемы? На данный момент я не в своей тарелке и не знаю, как операционная система или другая программа могут влиять на последовательную передачу данных, и не знаю, как сузить ее.
Еще несколько мыслей, которые могут быть важными, а могут и не быть:
- Похоже, что повреждения данных нет, только потеря данных. Протокол rx / tx реализует некоторое обнаружение ошибок (отправляет каждый байт дважды и проверяет равенство), и я не вижу сообщений об ошибках, которые выскакивали бы, если бы это было так.
- Кажется, здесь нет никакой случайности. То же самое поведение происходит для изображений разной ширины (что заставляет меня думать, что буфер tx не заполняется), одинаково для каждой строки изображения и всегда было последовательным.
- Arduino в машине - это Arduino Uno R3. Компиляция выполняется с помощью компилятора Arduino на некотором пользовательском коде C (не через IDE).
@Scott, 👍1
Обсуждение3 ответа
Лучший ответ:
Я решил эту ошибку, вы можете увидеть запись в группе Lasersaur google. Короче говоря, это была программная ошибка, которая срабатывала только тогда, когда аппаратное обеспечение сговаривалось с некоторыми временными задержками. Я до сих пор не понимаю, почему поведение было непоследовательным ранее - должно быть, я был на границе задержек данных, вызывающих проблему, или нет.
Плата драйвера для вашего "Lasersaur", похоже, основана на Adafruit Trinket Pro.
Эта плата на веб-сайте Adafruit устарела со следующим предупреждением:
Предупреждение об устаревании: Технология Pro Trinket bit-bang USB, которую он использует, работает не так хорошо, как в 2014 году, многие современные компьютеры не будут работать хорошо. Поэтому, хотя мы все еще носим Pro Trinket, чтобы люди могли поддерживать некоторые старые проекты, мы больше не рекомендуем его.
Так что в основном интерфейс USB - это naff. Он слишком медленный, чтобы идти в ногу с современными компьютерами (поэтому ваш старый ноутбук работает, а новый - нет), и вы теряете данные.
Вы должны рассмотреть возможность модернизации платы контроллера до чего-то более современного и способного.
У плат на базе UNO R3 есть еще один фундаментальный недостаток: имеется 64-байтовый буфер приема и отсутствует управление потоком. Это означает, что если вы отправите данные слишком быстро - быстрее, чем плата сможет их обработать, - данные будут потеряны.
Хм, покопался еще немного, и похоже, что плата, которая должна быть в машине, - это Arduino Uno R3. Я откину крышку, когда вернусь домой сегодня, чтобы проверить, но не могли бы вы указать мне, где вы видели эту информацию? Я понимал, что если я общаюсь с правильной скоростью, то не должно быть такого понятия, как "отправка слишком быстро", но я могу ошибаться. Может быть, я мог бы попробовать искусственно замедлить скорость передачи..., @Scott
Какой? Каким должно быть устройство или предупреждение об устаревании?, @Majenko
Каким должно быть устройство, я смог найти предупреждение об устаревании., @Scott
@Scott Это был результат долгих раскопок. Руководство привело меня к репо GitHub. Внутри лежала ведомость материалов. В нем была ссылка на файл fritzing для печатной платы. В этом и заключалась безделушка., @Majenko
Сегодня я узнал о фрицевании. Я предполагаю, что это было репо? https://github.com/nortd/driveboard/tree/master/DriveboardUSB Спасибо! Ты дал мне очень многое, чтобы я мог разыскать тебя., @Scott
Я не верю, что это конкретная проблема, я покопался в файле frizting и не увидел ничего, связанного с Trinket Pro, поэтому я открыл коробку электроники, и единственный микроконтроллер там - тот, что на Uno R3. Чтобы замедлить процесс, я попытался сократить бодрейт вдвое, но это, похоже, не изменило результатов. Все еще мертвый в воде, я думаю, что переустановка Windows и скрещивание пальцев - это единственный шаг, который я могу придумать., @Scott
Ну, я смог решить эту проблему, но не знаю как. Пройдя через шаги, которые я описал в своих ответах на ответы здесь, я попытался купить новый Arduino Uno R3, но это тоже ничего не исправило. Моим последним шагом было сделать “Сброс” Windows, который переустановит Windows, сохранив файлы, но сбросит настройки и программы. После переустановки и добавления всех программ, которые у меня были изначально, последовательная связь снова заработала. У меня действительно нет хорошего объяснения, почему это сработало, но, по крайней мере, так оно и было.
Edit: Эта проблема появилась снова, и на этот раз сброс Windows не устранил проблему.
- Как скомпилировать программу Arduino для настольного ПК
- Устройства CH340G и CP2102 не распознаются Thinkpad L380
- Как запустить последовательный монитор при запуске Windows
- Программирование серийного описания
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
Знаете ли вы, в каком формате данные передаются на arduino, передает ли он все изображение целиком, отдельные линии или отдельные пиксели? Я также подозреваю проблемы с буфером. Можете ли вы распечатать то, что когда-либо получает atmega? Как правило, я не верю, что переустановка Windows поможет, @Sim Son
Это пользовательский протокол, в котором байты от 0-127 являются флагами сообщений, а 128-255 - данными. Изображение разбито на список горизонтальных линий. Ноутбук отправляет данные конфигурации (уровень мощности, размер пикселя в мм, скорость перемещения и т.д.), Затем начальные и конечные координаты каждой растровой линии, затем поток байтов, который имеет значение оттенков серого для каждого пикселя. Это повторяется по одной строке за раз, поэтому изображение отправляется не сразу. Для тестового изображения, которое я использую, в каждой строке около 400 пикселей, но я использовал тестовые изображения с ~ 5000 пикселями в каждой строке, и это все еще только последние 20 или..., @Scott
Вы уверены, что ваш новый ноутбук вызывает проблему (будь то другая ОС или что-то еще) и что с тех пор, как вы в последний раз успешно пытались это сделать, прошивка не менялась? Простой тест: подключите tx к rx на стороне ПК и сравните, отправляет ли frontend sw то, что он должен отправить., @Sim Son
.. итак, которые вырезаны. Это не значит, что это не ошибка буфера, но это намекает мне, что это не что-то очевидное, как заполнение буфера. Я могу ошибаться. Поскольку код, передаваемый на Atmega, не выполняется через arduino IDE, было бы нелегко повторить то, что он получает, но я мог бы это сделать., @Scott
Я уверен, что это относится именно к ноутбуку, а не к прошивке atmega, вчера вечером у меня были два ноутбука бок о бок, и я менял местами USB-кабель между ними (с перезапуском, а не просто горячей заменой, так что это не было бы проблемой). Подключить линию rx обратно к машине tx и прочитать ее - хорошая идея ... может быть, я погуглю, чтобы попытаться выяснить, как это сделать. У программного обеспечения frontend есть отладочный терминал, который выплевывает то, что он * думает *, что отправляет, так что я мог бы сравнить его с тем, что он есть на самом деле. Но я до сих пор не знаю, что бы я сделал, чтобы исправить это, если бы они были другими., @Scott
Чтобы дополнительно выяснить, что именно отправляется, вы можете использовать другой Arduino / микроконтроллер и позволить ему следить за линией PCs TX., @chrisl
В качестве альтернативы предложению @chrisl (это хорошо!) вы можете изменить код Arduino, чтобы подсчитать полученные байты и показать их соответствующим образом. На какой ОС работает ваш ноутбук B?, @the busybee
Ноутбук B работает под управлением Windows 10 версии 1803. Ноутбук А работал, когда я тестировал его несколько месяцев назад на Windows 10 версии 1903., @Scott