Страница 1 из 1
Универсальная программа
Добавлено: Ср сен 21, 2011 11:27:25
gotter
Ребят. По роду своей деятельности часто сталкиваюсь с достаточно простыми системами управления оборудованием через микроконтроллеры. Обычно логика, зашитая в МК управляется кнопками, подключенными к входам. А вот каждый раз, когда нужно сделать программку, которая бы работала с девайсом по RS-232, обращаюсь к программисту. Но у того очень мало свободного времени

и порой я бываю посланным и работа затягивается на неопределенный срок.

Может кто-нибудь знает программку, которой можно сказать сколько кнопочек сделать, а она делает окошко, а потом, когда нажимаешь на кнопки, она отсылает номер кнопки в COM-порт компа? Меня пытались обучить дельфям, но беспрерпективно. Стар я уже для этого.

Re: Универсальная программа
Добавлено: Ср сен 21, 2011 12:45:45
Мурик
Все равно нужно знать основы программирования.
Хотя если вам нужно всего лишь однотипные программы с несколькими кнопками и отправкой данных в 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 ; Прерываем цикл при закрытии окна
Re: Универсальная программа
Добавлено: Ср сен 21, 2011 12:48:30
pyzhman
gotter писал(а):у того очень мало свободного времени
Заинтересовать надо человека.
Re: Универсальная программа
Добавлено: Ср сен 21, 2011 13:46:06
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/, но она после установки аварийно завершилась. После установки обновления от микрософта заработало. В принципе то что нужно, жаль точканет нужен. Хотя у меня все крутится на одном компе, поэтому пофиг. Но сыроватая прога и отправляет только текстовые данные, а мне желательно по одному байту.
Re: Универсальная программа
Добавлено: Ср сен 21, 2011 14:15:13
Мастер Ломастер
Мурик, порт правильнее открывать при старте проги, и закрывать при завершении, а не по событию от кнопки. иначе между событиями кому-нибудь приспичит порт открыть, и плакала ваша прога

Re: Универсальная программа
Добавлено: Ср сен 21, 2011 14:22:04
Мурик
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" и решили поделится с другими, но у многих программа для компа так же будет аварийно завершатся. Вам это надо?
Лучше изучить не сложный язык программирования чем использовать конструктор программ - возможностей будет намного больше.
Мастер Ломастер писал(а):Мурик, порт правильнее открывать при старте проги, и закрывать при завершении
Это я знаю.
В примере я показал что нужно закрывать порт когда он не нужен программе.
Re: Универсальная программа
Добавлено: Ср сен 21, 2011 15:06:27
Мастер Ломастер
Мурик писал(а):В примере я показал что нужно закрывать порт когда он не нужен программе.
а я как раз обратил ваше внимание на то, что этого как раз делать не стоит.
Re: Универсальная программа
Добавлено: Ср сен 21, 2011 15:16:51
Мурик
В реальной программе, нужно закрывать порт при выборе другого порта при условии что текущий больше не нужен или при закрытии программы.
Пример с открытием порта при старте программы и закрытием при ее завершении.
Код: Выделить всё
; Открываем порт 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 порт.
Re: Универсальная программа
Добавлено: Ср сен 21, 2011 15:41:02
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 порт.
Большое спасибо за ответ. Буду изучать.
Re: Универсальная программа
Добавлено: Пн окт 03, 2011 07:35:38
Tom91
А кто подскажет и даст пример как сделать например так:
Программа постоянно считывает 3 байта из COM порта (например часы, минуты, секунды) и размешает их значения в окне в данном виде byte0, ":",byte1, ":",byte2. Также в программе есть 3 текстовых метки: часы, минуты, секунды и напротив этих меток 3 текстовых поля для ввода числовых значений, а также имеется кнопка установка времени, при нажатии которой значения из текстовых полей последовательно передаются в COM порт.
Re: Универсальная программа
Добавлено: Пт окт 14, 2011 02:00:02
Nemridis
Вот хороший кандидат на "Универсальную программу"
http://ru.wikipedia.org/wiki/LabVIEW
Сам пользуюсь. Не люблю код писать.. Рисовать понятней как-то)
Re: Универсальная программа
Добавлено: Сб окт 15, 2011 13:51:42
Мурик
Nemridis, а вы пробовали запустить схему без LabVIEW?
Можно конечно, но за схемой придется тащить runtime, размером 100 МБ!
Эт не айс!
Re: Универсальная программа
Добавлено: Пт янв 27, 2012 23:18:55
Nemridis
Да, не айс. Но что такое 100 мегов по сравнению с вечностью?)
Необходимость использовать рантайм с лихвой перекрывается удобством и простотой создания нормально работающего приложения.
Впрочем я не программист. Делал несколько программ в этой среде, для личного пользования и не более того.
Re: Универсальная программа
Добавлено: Сб янв 28, 2012 14:22:33
Мурик
Nemridis писал(а):Необходимость использовать рантайм с лихвой перекрывается удобством и простотой создания
Вот поэтому программы все больше весят и потребляют ресурсов - главное простота разработки, а на пользователей плевать!
Re: Универсальная программа
Добавлено: Сб янв 28, 2012 15:14:56
Nemridis
Преимущество этой среды как-раз в том, что программу себе делает сам пользователь. Инженер\техник не знающий не одного языка программирования может "набросать" программу для своей задачи и получить нормальной работающее приложение. Да, сама среда и рантайм для нее много весят. НО есть разница- неделя\две на освоение ЛабВью или полгода\год на какой-нить С, С++?
Причем среда весьма серьезная. Позволяет делать много чего даже нубу.
Re: Универсальная программа
Добавлено: Ср фев 01, 2012 13:42:45
Alexeyslav
Это среда для единичных задач или обкатки идеи, никак не сможет заменить более тонкие языки программирования. Если тебе надо программу состряпать для какого-то однократного расчета или обработки данных здесь и сейчас - такая программа пойдет в самый раз.