Универсальная программа

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
gotter
Родился
Сообщения: 3
Зарегистрирован: Ср сен 21, 2011 11:12:37

Универсальная программа

Сообщение gotter »

Ребят. По роду своей деятельности часто сталкиваюсь с достаточно простыми системами управления оборудованием через микроконтроллеры. Обычно логика, зашитая в МК управляется кнопками, подключенными к входам. А вот каждый раз, когда нужно сделать программку, которая бы работала с девайсом по RS-232, обращаюсь к программисту. Но у того очень мало свободного времени :write: и порой я бываю посланным и работа затягивается на неопределенный срок. :facepalm: Может кто-нибудь знает программку, которой можно сказать сколько кнопочек сделать, а она делает окошко, а потом, когда нажимаешь на кнопки, она отсылает номер кнопки в COM-порт компа? Меня пытались обучить дельфям, но беспрерпективно. Стар я уже для этого. :kill:
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Универсальная программа

Сообщение Мурик »

Все равно нужно знать основы программирования.
Хотя если вам нужно всего лишь однотипные программы с несколькими кнопками и отправкой данных в COM порт, то задача упрощается.
Вот пример на PureBasic с отправкой байта со значением 2 когда нажимают на кнопку.

Код: Выделить всё

; Создаём окно.
OpenWindow(1,0,0,200,90,"Заголовок окна",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ButtonGadget(2,64,30,80,25,"Кнопка")

Repeat ; Начало главного цикла программы.
  Event=WaitWindowEvent() ; Получаем идентификатор события.
  Gadget=EventGadget()    ; Узнаём идентификатор гаджета в котором произошло событие.
 
  If Event=#PB_Event_Gadget And Gadget=2 ; Условие будет выполнено при щелчке по кнопке.
    ; Отерываем порт COM1, со скоростью перебачи 9600 бод.
    If OpenSerialPort(0, "COM1", 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 255, 255)
      OutByte.b = 2    ; Передаваемый байт.
      WriteSerialPortData(0, @OutByte, 1)  ; Отправка байта в COM порт.
      CloseSerialPort(0)                   ; Закрываем COM порт.
    Else ; Произошла ошибка при открытии порта.
      MessageRequester("", "Ошибка открытия порта")
    EndIf
  EndIf
 
Until Event = #PB_Event_CloseWindow ; Прерываем цикл при закрытии окна
Вложения
SendCom.rar
(10.29 КБ) 305 скачиваний
Последний раз редактировалось Мурик Ср сен 21, 2011 12:53:09, всего редактировалось 1 раз.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Универсальная программа

Сообщение pyzhman »

gotter писал(а):у того очень мало свободного времени

Заинтересовать надо человека.
Docendo discimus
gotter
Родился
Сообщения: 3
Зарегистрирован: Ср сен 21, 2011 11:12:37

Re: Универсальная программа

Сообщение gotter »

Мурик писал(а):Все равно нужно знать основы программирования.
Хотя если вам нужно всего лишь однотипные программы с несколькими кнопками и отправкой данных в COM порт, то задача упрощается.
Вот пример на PureBasic с отправкой байта со значением 2 когда нажимают на кнопку.

Код: Выделить всё

; Создаём окно.
OpenWindow(1,0,0,200,90,"Заголовок окна",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ButtonGadget(2,64,30,80,25,"Кнопка")

Repeat ; Начало главного цикла программы.
  Event=WaitWindowEvent() ; Получаем идентификатор события.
  Gadget=EventGadget()    ; Узнаём идентификатор гаджета в котором произошло событие.
 
  If Event=#PB_Event_Gadget And Gadget=2 ; Условие будет выполнено при щелчке по кнопке.
    ; Отерываем порт COM1, со скоростью перебачи 9600 бод.
    If OpenSerialPort(0, "COM1", 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 255, 255)
      OutByte.b = 2    ; Передаваемый байт.
      WriteSerialPortData(0, @OutByte, 1)  ; Отправка байта в COM порт.
      CloseSerialPort(0)                   ; Закрываем COM порт.
    Else ; Произошла ошибка при открытии порта.
      MessageRequester("", "Ошибка открытия порта")
    EndIf
  EndIf
 
Until Event = #PB_Event_CloseWindow ; Прерываем цикл при закрытии окна



Большое спасибо за пример. Как вариант. Жаль много букв писать надо. Тут на форуме изеелектроникс нашел такую штуку http://free-solutions.ru/modes/soft/MCUInterface/, но она после установки аварийно завершилась. После установки обновления от микрософта заработало. В принципе то что нужно, жаль точканет нужен. Хотя у меня все крутится на одном компе, поэтому пофиг. Но сыроватая прога и отправляет только текстовые данные, а мне желательно по одному байту.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Универсальная программа

Сообщение Мастер Ломастер »

Мурик, порт правильнее открывать при старте проги, и закрывать при завершении, а не по событию от кнопки. иначе между событиями кому-нибудь приспичит порт открыть, и плакала ваша прога :)
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Универсальная программа

Сообщение Мурик »

gotter писал(а):Жаль много букв писать надо.
Это только на первый взгляд так.
Я это сделал из готового шаблона и дописал только это

Код: Выделить всё

; Отерываем порт COM1, со скоростью перебачи 9600 бод.
    If OpenSerialPort(0, "COM1", 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 255, 255)
      OutByte.b = 2    ; Передаваемый байт.
      WriteSerialPortData(0, @OutByte, 1)  ; Отправка байта в COM порт.
      CloseSerialPort(0)                   ; Закрываем COM порт.
    Else ; Произошла ошибка при открытии порта.
      MessageRequester("", "Ошибка открытия порта")
    EndIf
Да и то, писал только часть, а остальное было добавлено с помощью автодополнения Изображение часть вообще было скопировано из справки через буфер обмена.
Так что реально напечатал не больше 10% из всего текста.

gotter писал(а):Тут на форуме изеелектроникс нашел такую штуку
Штука конечно хорошая, но думаю что годится лишь для простых задач типа передать байт в порт, а на что-то по сложнее (принять пару байт и произвести с ними кое-какие действия) ее не хватит.
gotter писал(а):но она после установки аварийно завершилась. После установки обновления от микрософта заработало.
Это касается не только самой программы, но и программ, создаваемых с ее помощью.
Представьте, вы разработали комплекс, состоящий из устройства на микроконтроллере и программы, созданной в "MCU Interface Studio" и решили поделится с другими, но у многих программа для компа так же будет аварийно завершатся. Вам это надо?

Лучше изучить не сложный язык программирования чем использовать конструктор программ - возможностей будет намного больше.

Мастер Ломастер писал(а):Мурик, порт правильнее открывать при старте проги, и закрывать при завершении
Это я знаю.
В примере я показал что нужно закрывать порт когда он не нужен программе.
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Универсальная программа

Сообщение Мастер Ломастер »

Мурик писал(а):В примере я показал что нужно закрывать порт когда он не нужен программе.

а я как раз обратил ваше внимание на то, что этого как раз делать не стоит.
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Универсальная программа

Сообщение Мурик »

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

Код: Выделить всё

; Открываем порт COM1, со скоростью передачи 9600 бод.
If OpenSerialPort(0,"COM1",9600,#PB_SerialPort_NoParity,8,1,#PB_SerialPort_NoHandshake,255,255)=0
  ; Произошла ошибка при открытии порта.
  MessageRequester("", "Ошибка открытия порта")
  End ; Так как эта программа без открытого порта работать не может, то завершаем её работу.
EndIf

; Создаём окно.
OpenWindow(1,0,0,200,90,"Заголовок окна",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ButtonGadget(2,64,30,80,25,"Кнопка")

Repeat ; Начало главного цикла программы.
  Event=WaitWindowEvent() ; Получаем идентификатор события.
  Gadget=EventGadget()    ; Узнаём идентификатор гаджета в котором произошло событие.
 
  If Event=#PB_Event_Gadget And Gadget=2 ; Условие будет выполнено при щелчке по кнопке.
    OutByte.b = 2                        ; Передаваемый байт.
    WriteSerialPortData(0, @OutByte, 1)  ; Отправка одного байта в COM порт.
  EndIf
 
Until Event = #PB_Event_CloseWindow ; Прерываем цикл при закрытии окна
CloseSerialPort(0)                   ; Закрываем COM порт.
gotter
Родился
Сообщения: 3
Зарегистрирован: Ср сен 21, 2011 11:12:37

Re: Универсальная программа

Сообщение gotter »

Мурик писал(а):В реальной программе, нужно закрывать порт при выборе другого порта при условии что текущий больше не нужен или при закрытии программы.
Пример с открытием порта при старте программы и закрытием при ее завершении.

Код: Выделить всё

; Открываем порт COM1, со скоростью передачи 9600 бод.
If OpenSerialPort(0,"COM1",9600,#PB_SerialPort_NoParity,8,1,#PB_SerialPort_NoHandshake,255,255)=0
  ; Произошла ошибка при открытии порта.
  MessageRequester("", "Ошибка открытия порта")
  End ; Так как эта программа без открытого порта работать не может, то завершаем её работу.
EndIf

; Создаём окно.
OpenWindow(1,0,0,200,90,"Заголовок окна",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ButtonGadget(2,64,30,80,25,"Кнопка")

Repeat ; Начало главного цикла программы.
  Event=WaitWindowEvent() ; Получаем идентификатор события.
  Gadget=EventGadget()    ; Узнаём идентификатор гаджета в котором произошло событие.
 
  If Event=#PB_Event_Gadget And Gadget=2 ; Условие будет выполнено при щелчке по кнопке.
    OutByte.b = 2                        ; Передаваемый байт.
    WriteSerialPortData(0, @OutByte, 1)  ; Отправка одного байта в COM порт.
  EndIf
 
Until Event = #PB_Event_CloseWindow ; Прерываем цикл при закрытии окна
CloseSerialPort(0)                   ; Закрываем COM порт.


Большое спасибо за ответ. Буду изучать.
Tom91
Встал на лапы
Сообщения: 108
Зарегистрирован: Пт окт 08, 2010 15:43:55

Re: Универсальная программа

Сообщение Tom91 »

А кто подскажет и даст пример как сделать например так:
Программа постоянно считывает 3 байта из COM порта (например часы, минуты, секунды) и размешает их значения в окне в данном виде byte0, ":",byte1, ":",byte2. Также в программе есть 3 текстовых метки: часы, минуты, секунды и напротив этих меток 3 текстовых поля для ввода числовых значений, а также имеется кнопка установка времени, при нажатии которой значения из текстовых полей последовательно передаются в COM порт.
Аватара пользователя
Nemridis
Родился
Сообщения: 17
Зарегистрирован: Вс окт 02, 2011 17:45:11
Откуда: Симферополь

Re: Универсальная программа

Сообщение Nemridis »

Вот хороший кандидат на "Универсальную программу"

http://ru.wikipedia.org/wiki/LabVIEW

Сам пользуюсь. Не люблю код писать.. Рисовать понятней как-то)
Моими устами глаголет истина. И такое при этом несет...
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Универсальная программа

Сообщение Мурик »

Nemridis, а вы пробовали запустить схему без LabVIEW?
Можно конечно, но за схемой придется тащить runtime, размером 100 МБ!
Эт не айс!
Аватара пользователя
Nemridis
Родился
Сообщения: 17
Зарегистрирован: Вс окт 02, 2011 17:45:11
Откуда: Симферополь

Re: Универсальная программа

Сообщение Nemridis »

Да, не айс. Но что такое 100 мегов по сравнению с вечностью?)
Необходимость использовать рантайм с лихвой перекрывается удобством и простотой создания нормально работающего приложения.
Впрочем я не программист. Делал несколько программ в этой среде, для личного пользования и не более того.
Моими устами глаголет истина. И такое при этом несет...
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Универсальная программа

Сообщение Мурик »

Nemridis писал(а):Необходимость использовать рантайм с лихвой перекрывается удобством и простотой создания
Вот поэтому программы все больше весят и потребляют ресурсов - главное простота разработки, а на пользователей плевать!
Аватара пользователя
Nemridis
Родился
Сообщения: 17
Зарегистрирован: Вс окт 02, 2011 17:45:11
Откуда: Симферополь

Re: Универсальная программа

Сообщение Nemridis »

Преимущество этой среды как-раз в том, что программу себе делает сам пользователь. Инженер\техник не знающий не одного языка программирования может "набросать" программу для своей задачи и получить нормальной работающее приложение. Да, сама среда и рантайм для нее много весят. НО есть разница- неделя\две на освоение ЛабВью или полгода\год на какой-нить С, С++?
Причем среда весьма серьезная. Позволяет делать много чего даже нубу.
Моими устами глаголет истина. И такое при этом несет...
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Универсальная программа

Сообщение Alexeyslav »

Это среда для единичных задач или обкатки идеи, никак не сможет заменить более тонкие языки программирования. Если тебе надо программу состряпать для какого-то однократного расчета или обработки данных здесь и сейчас - такая программа пойдет в самый раз.
Ответить

Вернуться в «Интеграция с ПК»