Я пишу магистерскую диссертацию и застрял с программированием связи через последовательный порт устройства.
Пишу фотоакустический сканер. Приложение, которое позволит создавать тепловые изображения.
Я использую и USB-устройство для управления более крутыми двигателями, и устройство National Instruments для получения сигнала.
Мое приложение управляет двумя шаговыми двигателями (оно должно контролировать).
У меня есть USB-контроллер для управления этими двигателями, он отображается в системе как устройство COM. Я могу управлять им с помощью гипертерминала и простого приложения, поэтому проблема не в коммуникации.
У меня проблема с построением двусторонней связи между устройством и моим приложением.
Я отправляю строки на устройство следующим образом:
serial.Write("CAL\r");
- это калибровка устройства. Но он может вернуть два ответа - «CAL OK» или «BUSY» - калибровка в порядке или устройство выполняет что-то еще прямо сейчас.
Я могу прослушать событие DataRecived на последовательном порту, а затем выполнить string.equals.
Мое приложение должно управлять двигателями и ждать ответа.
В простом сценарии:
- Запустить приложение
- При вводе вводится размер образца, который будет сканироваться.
- Нажмите кнопку контура - приложение начинает перемещать двигатели сначала в верхний левый угол, затем в верхний правый, нижний правый и нижний левый. (Я могу отправить простую команду, но как отправить одну, дождаться ответа, затем отправить другую и после четвертой кнопки включения в графическом интерфейсе?)
- Если регион определен правильно, нажмите «Далее» и сканирование начнется.
- Двигатели движутся к точке 1,1 (давайте назовем это так), и начинается сбор сигнала.
- Собранные данные обрабатываются, а затем мы переходим к точке 1,2
- Весь регион завершен, и пользователь получает сообщение о том, что сканирование завершено.
Я не знаю, как начать с этого последовательного порта связи. Как реализовать эту двустороннюю связь.
У меня есть простой класс (singleton), который открывает com-порт, отправляет команды и имеет событие, которое вызывается для всех полученных данных.
Было бы хорошим решением создать стек в моем классе и отправить все команды в нем, а затем в цикле взять их и отправить на устройство?
Но как справиться с этой угрозой?
Сон угрозы и затем проверить, все ли команды обработаны, если нет, то снова сон сна?
Буду благодарен за любые советы.
Я редактирую это, чтобы показать, как я хотел бы, чтобы мое приложение выглядело / работало
У меня есть простое приложение, в котором есть TabControl (модифицированная версия, которая скрывает вкладки в приложении, я вижу их только в режиме разработки).
Первая вкладка содержит текст и информацию (в основном, статистику). Второй позволяет приобретение.
Пользователь нажимает кнопку на первой вкладке «Перейти к приобретению», эта вкладка отображается, но все кнопки на ней отключены.
Он должен нажать кнопку «Открыть калибровку». Затем в этом диалоговом окне он калибрует устройство и вводит все параметры сбора данных (в этом диалоговом окне он имеет возможность выполнить контурное перемещение двигателя в 4 угла на образце, который будет измеряться). После завершения калибровки он может закрыть это диалоговое окно, и тогда все элементы управления активируются в главной форме. Теперь он может нажать кнопку «Начать приобретение». После того, как более крутые двигатели переместятся в определенную позицию (рассчитанную для каждой точки), данные для этой точки будут получены, обработаны, сохранены в файл и отображены в виде пикселя в окне изображения. Затем двигатели переместятся в другую точку, и процесс повторяется до конца выборки. По сути, я буду сканировать квадратный образец, перемещая лазер в определенные точки, собирая данные и создавая тепловое изображение из этого, что-то вроде построения пикселя за пикселем.
Я попытаюсь проиллюстрировать мою идею с помощью диаграммы или скриншота.