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