последовательный порт устройства, команды, ответы и C # - PullRequest
2 голосов
/ 28 января 2012

Я пишу магистерскую диссертацию и застрял с программированием связи через последовательный порт устройства.

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

Я использую и USB-устройство для управления более крутыми двигателями, и устройство National Instruments для получения сигнала.

Мое приложение управляет двумя шаговыми двигателями (оно должно контролировать).

У меня есть USB-контроллер для управления этими двигателями, он отображается в системе как устройство COM. Я могу управлять им с помощью гипертерминала и простого приложения, поэтому проблема не в коммуникации.

У меня проблема с построением двусторонней связи между устройством и моим приложением.

Я отправляю строки на устройство следующим образом:

serial.Write("CAL\r"); - это калибровка устройства. Но он может вернуть два ответа - «CAL OK» или «BUSY» - калибровка в порядке или устройство выполняет что-то еще прямо сейчас.

Я могу прослушать событие DataRecived на последовательном порту, а затем выполнить string.equals.

Мое приложение должно управлять двигателями и ждать ответа.

В простом сценарии:

  1. Запустить приложение
  2. При вводе вводится размер образца, который будет сканироваться.
  3. Нажмите кнопку контура - приложение начинает перемещать двигатели сначала в верхний левый угол, затем в верхний правый, нижний правый и нижний левый. (Я могу отправить простую команду, но как отправить одну, дождаться ответа, затем отправить другую и после четвертой кнопки включения в графическом интерфейсе?)
  4. Если регион определен правильно, нажмите «Далее» и сканирование начнется.
  5. Двигатели движутся к точке 1,1 (давайте назовем это так), и начинается сбор сигнала.
  6. Собранные данные обрабатываются, а затем мы переходим к точке 1,2
  7. Весь регион завершен, и пользователь получает сообщение о том, что сканирование завершено.

Я не знаю, как начать с этого последовательного порта связи. Как реализовать эту двустороннюю связь.

У меня есть простой класс (singleton), который открывает com-порт, отправляет команды и имеет событие, которое вызывается для всех полученных данных.

Было бы хорошим решением создать стек в моем классе и отправить все команды в нем, а затем в цикле взять их и отправить на устройство?

Но как справиться с этой угрозой? Сон угрозы и затем проверить, все ли команды обработаны, если нет, то снова сон сна?

Буду благодарен за любые советы.

Я редактирую это, чтобы показать, как я хотел бы, чтобы мое приложение выглядело / работало

У меня есть простое приложение, в котором есть TabControl (модифицированная версия, которая скрывает вкладки в приложении, я вижу их только в режиме разработки).

Первая вкладка содержит текст и информацию (в основном, статистику). Второй позволяет приобретение.

Пользователь нажимает кнопку на первой вкладке «Перейти к приобретению», эта вкладка отображается, но все кнопки на ней отключены.

Он должен нажать кнопку «Открыть калибровку». Затем в этом диалоговом окне он калибрует устройство и вводит все параметры сбора данных (в этом диалоговом окне он имеет возможность выполнить контурное перемещение двигателя в 4 угла на образце, который будет измеряться). После завершения калибровки он может закрыть это диалоговое окно, и тогда все элементы управления активируются в главной форме. Теперь он может нажать кнопку «Начать приобретение». После того, как более крутые двигатели переместятся в определенную позицию (рассчитанную для каждой точки), данные для этой точки будут получены, обработаны, сохранены в файл и отображены в виде пикселя в окне изображения. Затем двигатели переместятся в другую точку, и процесс повторяется до конца выборки. По сути, я буду сканировать квадратный образец, перемещая лазер в определенные точки, собирая данные и создавая тепловое изображение из этого, что-то вроде построения пикселя за пикселем.

Я попытаюсь проиллюстрировать мою идею с помощью диаграммы или скриншота.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...