| PureBasic. Работа с COM портом | 
| 
				
			 | 
| 
| Aleks8383 | Дата: Вторник, 28.05.2013, 13:32 | Сообщение # 51 |  | Группа: Проверенные Сообщений: 102 
 Статус: Offline | Вот спасибо самое то,я то просто хотел чтобы полоска бегала,что то на подобии как тут,просто не как не разберусь как с графикой работать. 
 
 |  
 |  |  |  | 
| 
| Петр | Дата: Вторник, 28.05.2013, 16:42 | Сообщение # 52 |  | Группа: Проверенные Сообщений: 47 
 Статус: Offline | В простейшем случае, можно обойтись без работы с графикой. Код If OpenWindow(0, 0, 0, 400, 50, "Timer Example", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) ProgressBarGadget(0, 10, 10, 380, 20, 0, 100)
 AddWindowTimer(0, 123, 10)
 
 Value = 0 : State = 0
 Repeat
 Event = WaitWindowEvent()
 
 If Event = #PB_Event_Timer And EventTimer() = 123
 If State = 0
 Value + 4
 If Value>100 : State=1 : EndIf
 Else
 Value - 4
 If Value<0 : State=0 : EndIf
 EndIf
 SetGadgetState(0, Value)
 EndIf
 
 Until Event = #PB_Event_CloseWindow
 EndIf
 
 
 |  
 |  |  |  | 
| 
| Aleks8383 | Дата: Вторник, 28.05.2013, 17:01 | Сообщение # 53 |  | Группа: Проверенные Сообщений: 102 
 Статус: Offline | Спасибо,возьму на заметку.Я как раз и пытался из  ProgressBar сделать,но не получилось.Но "спидометр" мне больше понравился применю его. 
 
 |  
 |  |  |  | 
| 
| Aleks8383 | Дата: Среда, 29.05.2013, 10:28 | Сообщение # 54 |  | Группа: Проверенные Сообщений: 102 
 Статус: Offline | Пётр,а вы не пробовали этот индикатор(стрелочный) куда небудь применять??У меня не хочет работать,выдаёт ошибку" строка1:структура отсутствует:pbi" версия последняя стоит 5.11 библиотеки тоже вроде стоят.В чём может быть проблема?? 
 
 |  
 |  |  |  | 
| 
| Петр | Дата: Среда, 29.05.2013, 12:51 | Сообщение # 55 |  | Группа: Проверенные Сообщений: 47 
 Статус: Offline | Пока нет.Цитата (Aleks8383) не пробовали этот индикатор(стрелочный) куда небудь применять
 
 Выложите содержимое строки. В ней что-то не так.Цитата (Aleks8383) выдаёт ошибку" строка1:структура отсутствует:pbi"
 Но судя по всему, производится попытка подключить файл с исходником. Это нужно делать следующим образом:
 где MeterGadget.pbi это файл с исходником стрелочного индикатора, находящийся в той же папке, где и основой исходник.Код IncludeFile "MeterGadget.pbi"
 
 |  
 |  |  |  | 
| 
| Aleks8383 | Дата: Среда, 29.05.2013, 14:20 | Сообщение # 56 |  | Группа: Проверенные Сообщений: 102 
 Статус: Offline | Всё заработало, всё было очень просто.Когда копировал код,одну ковычку не скопировал и из за этого выдовало ошибку. 
 
 |  
 |  |  |  | 
| 
| foxit | Дата: Воскресенье, 09.06.2013, 10:55 | Сообщение # 57 |  | Группа: Пользователи Сообщений: 5 
 Статус: Offline | Здравствуйте Заинтересовался программой PUREBASIC
 Хочу с ее помощью принимать и обрабатывать сообщения с GPS приемника через UART.
 
 Помогите начать.
 
 
 |  
 |  |  |  | 
| 
| Петр | Дата: Воскресенье, 09.06.2013, 22:23 | Сообщение # 58 |  | Группа: Проверенные Сообщений: 47 
 Статус: Offline | То есть приемник будет подключен к COM порту компа не используя микроконтроллер? Тогда нужно принимать данные из приемника (функции) и обрабатывать их.
 Обычно приемники выдают информацию в текстовом виде, поэтому нужно освоить работу со строками.
 
 
 |  
 |  |  |  | 
| 
| foxit | Дата: Понедельник, 10.06.2013, 00:32 | Сообщение # 59 |  | Группа: Пользователи Сообщений: 5 
 Статус: Offline | Да, приемник будет подключен к Com порту ПК. А можете помочь примером?
 
 
 |  
 |  |  |  | 
| 
| Петр | Дата: Понедельник, 10.06.2013, 01:16 | Сообщение # 60 |  | Группа: Проверенные Сообщений: 47 
 Статус: Offline | Чтобы сделать пример, нужно иметь GPS приемник.... 
 
 |  
 |  |  |  | 
| 
| foxit | Дата: Понедельник, 10.06.2013, 11:55 | Сообщение # 61 |  | Группа: Пользователи Сообщений: 5 
 Статус: Offline | Вместо приемника можно использовать эмулятор Fidelity Satellite Emulator  http://www.rampro.ru/?page_id=570 Для эмуляции COM портов пригодится  Virtual Serial Ports Emulator http://www.addictivetips.com/windows....mulator
 
 
 
 
 Сообщение отредактировал foxit - Понедельник, 10.06.2013, 11:55 |  
 |  |  |  | 
| 
| BoyKot | Дата: Понедельник, 09.09.2013, 12:41 | Сообщение # 62 |  | Группа: Пользователи Сообщений: 2 
 Статус: Offline | PureBasic ругается на строку ComWrite(SerialPortID(#COM_Port),@send_data,1) из примера на сайте. Чтобы ее использовать нужна лицензия? 
 
 |  
 |  |  |  | 
| 
| Петр | Дата: Понедельник, 09.09.2013, 13:29 | Сообщение # 63 |  | Группа: Проверенные Сообщений: 47 
 Статус: Offline | Нет лицензия для этого не нужна. Это функция одной из дополнительных библиотек, но она использовалась раньше, когда в PB не было нативной поддержки порта. Сейчас в ней нет необходимости.Цитата (BoyKot) PureBasic ругается на строку ComWrite(SerialPortID(#COM_Port),@send_data,1) из примера на сайте.В текущих версиях, имеются встроенные функции работы с портом. http://purebasic.ru/manual.php?id=1148&lng=rus
 
 Судя по строке кода, имеется в виду эта статья?
 Посмотрите 9 и 10 комментарий к статье.
 
 Замените проблемную строку на эту.
 Код WriteSerialPortData(#COM_Port, @send_data, 1)
 
 |  
 |  |  |  | 
| 
| BoyKot | Дата: Понедельник, 09.09.2013, 14:21 | Сообщение # 64 |  | Группа: Пользователи Сообщений: 2 
 Статус: Offline | Помогло. Спасибо огромное! 
 
 |  
 |  |  |  | 
| 
| Петр | Дата: Пятница, 20.12.2013, 01:52 | Сообщение # 65 |  | Группа: Проверенные Сообщений: 47 
 Статус: Offline | Еще один пример работы с COM портом - градусник на DS18B20. Схема устройства, исходники и скомпилированная программа (для Windows и Linux) в архиве.
 Для компиляции нужна версия PureBasic 5.20 и выше. Подойдет демо версия.
 
 
 
 
 Сообщение отредактировал Петр - Пятница, 20.12.2013, 01:57 |  
 |  |  |  | 
| 
| AlekS | Дата: Пятница, 20.12.2013, 23:38 | Сообщение # 66 |  | Группа: Проверенные Сообщений: 247 
 Статус: Offline | Петр, спасибо интересно. 
 
 |  
 |  |  |  | 
| 
| Dzhylli | Дата: Четверг, 28.04.2016, 10:44 | Сообщение # 67 |  |   Группа: Пользователи Сообщений: 1 
 Статус: Offline | Доброго времени суток. Нужна помощь. Задача такая: необходимо принять данные по нажатию кнопки и в зависимости от нажатой кнопки вывести данные в соответствующие поля. Далее нужно записать принятые данные в файл. Проблема: при нажатии кнопки информация выводится во все три поля, если вставляю в принятие данных условие (If i= 3, 4, 6) и по этому условию вписывать данные в нужное поле, то система совсем ничего не принимает. Задача вторая, записать данные в файл. В данной проге попробовала сделать только при нажатии времени, файл создается, но данные в него не записываются( Подскажите где ошибка.
 
 #Com_Port=7
 If IsSerialPort (#Com_port)
 CloseSerialPort (#Com_port)
 EndIf
 If OpenSerialPort(#Com_port, "COM7", 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
 Debug "Порт открыт успешно"
 Else
 Debug "Порт не обнаружен"
 EndIf
 
 Procedure InData() ; Прием данных.
 Protected InBytes
 
 If IsSerialPort(#COM_Port)   ; С таким ИД порт открыт.
 InBytes = AvailableSerialPortInput(#COM_Port)
 If InBytes>0 ; Получены данные.
 
 Protected Dim InBuffer.a(InBytes), RealInBytes
 
 RealInBytes = ReadSerialPortData(#COM_Port, @InBuffer(), InBytes)
 If RealInBytes>0
 ;    If i=3
 AddGadgetItem(3, -1, PeekS(@InBuffer(), RealInBytes, #PB_Ascii))
 ;      EndIf
 
 ;   If i=4
 AddGadgetItem(4, -1, PeekS(@InBuffer(), RealInBytes, #PB_Ascii))
 ;EndIf
 ;  If i=6
 AddGadgetItem(6, -1, PeekS(@InBuffer(), RealInBytes, #PB_Ascii))
 ;
 ;
 ; EndIf
 EndIf
 
 EndIf
 EndIf
 EndProcedure
 
 Procedure ComOut (Sent_data.s)
 If IsSerialPort(#Com_port)
 ;ComWrite (SerialPortID(#Com_port),@Sent_data,1)
 WriteSerialPortData(#Com_Port,@Sent_data,1)
 Else
 ;MessageRequester("Ошибка!Порт не доступен!",16)
 Debug "Куда данные посылать?"
 EndIf
 EndProcedure
 
 ;http://www.purebasic.com/documentation/file/openfile.html
 
 OpenWindow(0,0,0,700,500,"Тестовая программа",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered); открываем окно
 
 ButtonGadget(1,50,120,100,35,"Время ", #PB_Button_Default); выводим кнопку
 EditorGadget(3, 50, 160, 330, 50); место для внесения текста к времени
 ButtonGadget(2,50,10,170,35,"температура за бортом", #PB_Button_Default); выводим кнопку
 EditorGadget(4, 50, 50, 330, 50); место для внесения текста к датчикам
 
 ButtonGadget(5,50,230,170,35,"Давление", #PB_Button_Default); выводим кнопку
 EditorGadget(6, 50, 270, 330, 50); место для внесения текста к датчикам
 
 Repeat
 Event=WaitWindowEvent() ; Получаем идентификатор события.
 Gadget=EventGadget() ; Узнаём идентификатор активного гаджета.
 If Gadget=1 ; Условие будет выполнено при щелчке по кнопке.
 i=3
 ComOut("M")
 InData()
 
 
 If OpenFile(0,"Данные датчиков.xls")
 WriteByte(0, RealInBytes)
 CloseFile(0)
 EndIf
 
 EndIf
 If Gadget=2; условие для кнопки температура
 i=4
 ComOut("T")
 InData()
 ;   If OpenFile(1,"шшш.txt")
 ;  WriteString(1, "Температура"+ RealInBytes$)
 ;  CloseFile(1)
 ;  EndIf
 ;StringGadget(3,70,70,150,35,"",#PB_String_ReadOnly)
 ;EditorGadget(3, 10, 100, 330, 50); место для внесения текста
 EndIf
 If Gadget=5; условие для кнопки температура
 i=6
 ComOut("P")
 InData()
 
 
 EndIf
 Until Event = #PB_Event_CloseWindow ; Прерываем цикл при закрытии окна
 
 End ;
 
 
 
 
 |  
 |  |  |  | 
| 
| Петр | Дата: Вторник, 03.05.2016, 22:07 | Сообщение # 68 |  | Группа: Проверенные Сообщений: 47 
 Статус: Offline | В переменную i ничего не записывается и в ней по умолчанию будет 0. Нужно например через аргумент процедуры передать номер гаджета в который следует вывести информацию.Цитата Dzhylli (  ) если вставляю в принятие данных условие (If i= 3, 4, 6) и по этому условию вписывать данные в нужное поле, то система совсем ничего не принимает.
 
 Они записываются, но в файле будет 0 вместо данных. Переменная RealInBytes локальная и существует только в пределах процедуры. Ее значение можно возвратить как результат.Цитата Dzhylli (  ) В данной проге попробовала сделать только при нажатии времени, файл создается, но данные в него не записываютсяКод #Com_Port=7If IsSerialPort (#Com_port)
 CloseSerialPort (#Com_port)
 EndIf
 If OpenSerialPort(#Com_port, "COM7", 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
 Debug "Порт открыт успешно"
 Else
 Debug "Порт не обнаружен"
 EndIf
 
 Procedure InData(Gadget) ; Прием данных.
 Protected InBytes
 
 If IsSerialPort(#COM_Port)   ; С таким ИД порт открыт.
 InBytes = AvailableSerialPortInput(#COM_Port)
 If InBytes>0 ; Получены данные.
 
 Protected Dim InBuffer.a(InBytes), RealInBytes
 
 RealInBytes = ReadSerialPortData(#COM_Port, @InBuffer(), InBytes)
 If RealInBytes>0
 
 AddGadgetItem(Gadget, -1, PeekS(@InBuffer(), RealInBytes, #PB_Ascii))
 
 ;         ;    If i=3
 ;         AddGadgetItem(3, -1, PeekS(@InBuffer(), RealInBytes, #PB_Ascii))
 ;         ;      EndIf
 ;
 ;         ;   If i=4
 ;         AddGadgetItem(4, -1, PeekS(@InBuffer(), RealInBytes, #PB_Ascii))
 ;         ;EndIf
 ;         ;  If i=6
 ;         AddGadgetItem(6, -1, PeekS(@InBuffer(), RealInBytes, #PB_Ascii))
 ;         ;
 ;         ;
 ;         ; EndIf
 EndIf
 
 EndIf
 EndIf
 
 ProcedureReturn RealInBytes
 EndProcedure
 
 Procedure ComOut (Sent_data.s)
 If IsSerialPort(#Com_port)
 ;ComWrite (SerialPortID(#Com_port),@Sent_data,1)
 WriteSerialPortData(#Com_Port,@Sent_data,1)
 Else
 ;MessageRequester("Ошибка!Порт не доступен!",16)
 Debug "Куда данные посылать?"
 EndIf
 EndProcedure
 
 ;http://www.purebasic.com/documentation/file/openfile.html
 
 OpenWindow(0,0,0,700,500,"Тестовая программа",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered); открываем окно
 
 ButtonGadget(1,50,120,100,35,"Время ", #PB_Button_Default); выводим кнопку
 EditorGadget(3, 50, 160, 330, 50)                         ; место для внесения текста к времени
 ButtonGadget(2,50,10,170,35,"температура за бортом", #PB_Button_Default); выводим кнопку
 EditorGadget(4, 50, 50, 330, 50)                    ; место для внесения текста к датчикам
 
 ButtonGadget(5,50,230,170,35,"Давление", #PB_Button_Default); выводим кнопку
 EditorGadget(6, 50, 270, 330, 50)                           ; место для внесения текста к датчикам
 
 Repeat
 Event=WaitWindowEvent() ; Получаем идентификатор события.
 Gadget=EventGadget()    ; Узнаём идентификатор активного гаджета.
 If Gadget=1             ; Условие будет выполнено при щелчке по кнопке.
 i=3
 ComOut("M")
 RealInBytes = InData(3)
 
 
 If OpenFile(0,"Данные датчиков.xls")
 WriteByte(0, RealInBytes)
 CloseFile(0)
 EndIf
 
 EndIf
 If Gadget=2; условие для кнопки температура
 i=4
 ComOut("T")
 InData(4)
 ;   If OpenFile(1,"шшш.txt")
 ;  WriteString(1, "Температура"+ RealInBytes$)
 ;  CloseFile(1)
 ;  EndIf
 ;StringGadget(3,70,70,150,35,"",#PB_String_ReadOnly)
 ;EditorGadget(3, 10, 100, 330, 50); место для внесения текста
 EndIf
 If Gadget=5; условие для кнопки температура
 i=6
 ComOut("P")
 InData(6)
 
 
 EndIf
 Until Event = #PB_Event_CloseWindow ; Прерываем цикл при закрытии окна
 
 End ;
 
 
 
 Сообщение отредактировал Петр - Вторник, 03.05.2016, 22:08 |  
 |  |  |  |