PureBasic. Работа с COM портом
|
|
Aleks8383 | Дата: Вторник, 28.05.2013, 13:32 | Сообщение # 51 |
Группа: Проверенные
Сообщений: 104
Статус: 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 |
Группа: Проверенные
Сообщений: 104
Статус: Offline
| Спасибо,возьму на заметку.Я как раз и пытался из ProgressBar сделать,но не получилось.Но "спидометр" мне больше понравился применю его.
|
|
| |
Aleks8383 | Дата: Среда, 29.05.2013, 10:28 | Сообщение # 54 |
Группа: Проверенные
Сообщений: 104
Статус: Offline
| Пётр,а вы не пробовали этот индикатор(стрелочный) куда небудь применять??У меня не хочет работать,выдаёт ошибку" строка1:структура отсутствует:pbi" версия последняя стоит 5.11 библиотеки тоже вроде стоят.В чём может быть проблема??
|
|
| |
Петр | Дата: Среда, 29.05.2013, 12:51 | Сообщение # 55 |
Группа: Проверенные
Сообщений: 47
Статус: Offline
| Цитата (Aleks8383) не пробовали этот индикатор(стрелочный) куда небудь применять Пока нет.
Цитата (Aleks8383) выдаёт ошибку" строка1:структура отсутствует:pbi" Выложите содержимое строки. В ней что-то не так.
Но судя по всему, производится попытка подключить файл с исходником. Это нужно делать следующим образом: Код IncludeFile "MeterGadget.pbi" где MeterGadget.pbi это файл с исходником стрелочного индикатора, находящийся в той же папке, где и основой исходник.
|
|
| |
Aleks8383 | Дата: Среда, 29.05.2013, 14:20 | Сообщение # 56 |
Группа: Проверенные
Сообщений: 104
Статус: 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
| Цитата (BoyKot) PureBasic ругается на строку ComWrite(SerialPortID(#COM_Port),@send_data,1) из примера на сайте. Нет лицензия для этого не нужна. Это функция одной из дополнительных библиотек, но она использовалась раньше, когда в PB не было нативной поддержки порта. Сейчас в ней нет необходимости. В текущих версиях, имеются встроенные функции работы с портом. 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
| Цитата Dzhylli ( ) если вставляю в принятие данных условие (If i= 3, 4, 6) и по этому условию вписывать данные в нужное поле, то система совсем ничего не принимает. В переменную i ничего не записывается и в ней по умолчанию будет 0. Нужно например через аргумент процедуры передать номер гаджета в который следует вывести информацию.
Цитата Dzhylli ( ) В данной проге попробовала сделать только при нажатии времени, файл создается, но данные в него не записываются Они записываются, но в файле будет 0 вместо данных. Переменная RealInBytes локальная и существует только в пределах процедуры. Ее значение можно возвратить как результат.Код #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(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 |
|
| |