purebasic.info

PureBasic forum
Текущее время: Ср апр 25, 2018 7:46 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 70 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения: Re: Работа с байтами UART
СообщениеДобавлено: Пн фев 29, 2016 3:37 pm 
Не в сети
студент

Зарегистрирован: Пн фев 29, 2016 3:15 pm
Сообщений: 5
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Добрый день!
Возможно, повторяюсь с предыдущим вопросом, но не очень понятно, как выводить принимаемые данные с COM порта в нужный гаджет. Данные в терминале будут приходить так (примерно):
250 25
....
251 26
....
252 27

Расшифровка:
250 25 - вывести число 25 в гаджет №11
251 26 - вывести число 26 в гаджет №13
252 27 - вывести число 25 в гаджет №15

Ну и так далее...

Думал так сделать:
----------------------------------------------------------
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Repeat 
  Event = WaitWindowEvent()
  InData()  ;принимаем данные из UART все время пока работает программа
  If Event=#PB_Event_Gadget  ;
    Gadget = EventGadget ( ) ;
   
    Dim InByte.с(3)
    If InByte(1)=250
      SetGadgetText(11,Str( InByte(2)))
    EndIf
    Delay(20)
   
   
  EndIf
EndIf
Until Event=#PB_Event_CloseWindow
EndIf


-------------------------------------------
Но что-то не работает совсем) Может подскажете)
Заранее спасибо..


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с байтами UART
СообщениеДобавлено: Пн фев 29, 2016 4:40 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11108
Благодарил (а): 4 раз.
Поблагодарили: 395 раз.
В это коде нет приема данных из COM порта. Кроме того, поступление новых данных в порт не является событием гаджета.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с байтами UART
СообщениеДобавлено: Вт мар 01, 2016 10:23 am 
Не в сети
студент

Зарегистрирован: Пн фев 29, 2016 3:15 pm
Сообщений: 5
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Добрый день!
Задача выдать в каждый гаджет по одному принятому символу из трех соответственно

в терминале идет следующее:

33 34 35 0D 0A

т.е. по идее число 3 должно вывестись в окно 0
-/- число 4 в окно 1
-/- число 5 в окно 2
--------------------------------------------------------
Воспользовался предыдущими Вашими примерами и получил следующее:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
;----------------------------------------------------------
#COM_Port = 2 ;Идентификатор COM порта.
 
 
;Процедура открытия порта. выбранного из списка
;-------------------------------------------------------------------------------------------------------
Procedure Select_ComPort()
 Protected Port.s, Text.s, Color
 
If IsSerialPort(#COM_Port) ;С таким ИД уже открыт порт.
 CloseSerialPort(#COM_Port)  ;Закрываем его.
EndIf
 
Port = GetGadgetText(3) ;Тут открываем порт с необходимыми настройками
If OpenSerialPort(#COM_Port,Port,19200,#PB_SerialPort_NoParity,8,1,#PB_SerialPort_NoHandshake,255,255)
Text="Порт "+Port+" открыт" : Color=RGB(46, 137, 36)
 
Else
 Text="Не удалось открыть порт "+Port : Color=RGB(255,0,0)
EndIf
 SetGadgetText(5, Text)
 SetGadgetColor(5, #PB_Gadget_FrontColor, Color)
 
EndProcedure
 
;Процедура приема данных
;---------------------------------------------------------------------------------------------------------
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
   AddGadgetItem(4, -1, PeekS(@InBuffer(), RealInBytes, #PB_Ascii))
   
     
 
 EndIf
 EndIf
 EndIf
 
   
EndProcedure
 
Procedure InComStr() ; Прием строк из COM порта.
  Static InBuff.s
  Protected Bytes, Buff.a, u, n.u=0
 
  Bytes = AvailableSerialPortInput(#COM_Port)
  If Bytes>0
    For u=1 To Bytes
      If ReadSerialPortData(#COM_Port, @Buff, 1)=1
        If Buff<>#CR And Buff<>#LF
          InBuff+Chr(Buff)
        Else        
          SetGadgetText(n,InBuff)
          n+1
          InBuff=""
        EndIf
      EndIf
    Next u
  EndIf
 
EndProcedure
 
 
 
 
If OpenWindow(20, 300, 100, 320, 370, "ПРОГРАММА_1",#PB_Window_MinimizeGadget | #PB_Window_SizeGadget) ;Создаем окно программы
 
 
 TextGadget(22,10,310,25,15,"Порт") ;Выводим в окно надпись "Порт".
 
 ComboBoxGadget(3, 10, 325, 70, 21, #PB_ComboBox_Editable) ;гаджет выпадающего списка
 
 For i=21 To 22 ;создаем список от 1 до 99 с возможными портами для открытия
   
   AddGadgetItem(3,-1,"COM"+Str(i))
   
 Next i
 
 SetGadgetState(3,0) ;Делаем активным нулевой пункт выпадающего списка.
 
 EditorGadget(4, 8, 10, 305, 28,#PB_String_ReadOnly)
 
 TextGadget(5,10,350,200,15,"")  ;Здесь будет отображаться результат открытия порта.
 
 
StringGadget(0, 40, 62, 90, 50, "", #PB_String_ReadOnly)
StringGadget(1, 40, 147, 90, 50, "", #PB_String_ReadOnly)
StringGadget(2, 40, 232, 90, 50, "", #PB_String_ReadOnly)
 
 
 
Select_ComPort()
 
 Repeat
 
          Event = WaitWindowEvent()
 
          InData()  ;принимаем данные из UART все время пока работает программа
       
      If Event=#PB_Event_Gadget  ;если произошло срабатывание гаджета
          Gadget = EventGadget ( )  ;узнаем какой гаджет был активирован
 
      ElseIf Gadget=3  ;если был активирован выпадающий список
          ComboBox.s=GetGadgetText(3)  ;Считываем текст из текущего пункта выпадающего списка.
          Select_ComPort()
          ;InComStr()    
 
      EndIf
 
 Until Event=#PB_Event_CloseWindow
 
EndIf
End
;---------------------------------------------------------------------------------------


Не могу вот понять, куда вставить вызов процедуры приема строк из сом порта InComStr()
Я так понимаю, что в цикле Repeat, но почему-то после запуска программы после начала выбора номера порта ( у меня №22) , выскакивает сообщение об ошибке:

[10:19:37] [ERROR] The specified #SerialPort is not initialised.
[10:19:45] The debugged executable quit unexpectedly.

Ругается именно на вставку этой процедуры, если ее не вызывать, то порт открывается нормально, данные в терминале идут

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


Последний раз редактировалось kvitaliy Вт мар 01, 2016 11:12 am, всего редактировалось 1 раз.
Пользуйся для выделения кода тегами


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с байтами UART
СообщениеДобавлено: Вт мар 01, 2016 12:24 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11108
Благодарил (а): 4 раз.
Поблагодарили: 395 раз.
Теперь должно работать лучше.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
;----------------------------------------------------------
#COM_Port = 2 ;Идентификатор COM порта.
 
 
;Процедура открытия порта. выбранного из списка
;-------------------------------------------------------------------------------------------------------
Procedure Select_ComPort()
  Protected Port.s, Text.s, Color
 
  If IsSerialPort(#COM_Port) ;С таким ИД уже открыт порт.
    CloseSerialPort(#COM_Port)  ;Закрываем его.
  EndIf
 
  Port = GetGadgetText(3) ;Тут открываем порт с необходимыми настройками
  If OpenSerialPort(#COM_Port,Port,19200,#PB_SerialPort_NoParity,8,1,#PB_SerialPort_NoHandshake,255,255)
    Text="Порт "+Port+" открыт" : Color=RGB(46, 137, 36)
   
  Else
    Text="Не удалось открыть порт "+Port : Color=RGB(255,0,0)
  EndIf
  SetGadgetText(5, Text)
  SetGadgetColor(5, #PB_Gadget_FrontColor, Color)
 
EndProcedure
 
;Процедура приема данных
;---------------------------------------------------------------------------------------------------------
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
        AddGadgetItem(4, -1, PeekS(@InBuffer(), RealInBytes, #PB_Ascii))
       
       
       
      EndIf
    EndIf
  EndIf
 
 
EndProcedure
 
Procedure InComStr() ; Прием строк из COM порта.
  Static InBuff.s
  Protected Bytes, Buff.a, u, n.u=0
 
  If IsSerialPort(#COM_Port)
    Bytes = AvailableSerialPortInput(#COM_Port)
    If Bytes>0
      For u=1 To Bytes
        If ReadSerialPortData(#COM_Port, @Buff, 1)=1
          If Buff<>#CR And Buff<>#LF
            InBuff+Chr(Buff)
          Else        
            SetGadgetText(n,InBuff)
            n+1
            InBuff=""
          EndIf
        EndIf
      Next u
    EndIf
  EndIf
 
EndProcedure
 
 
 
 
If OpenWindow(20, 300, 100, 320, 370, "ПРОГРАММА_1",#PB_Window_MinimizeGadget | #PB_Window_SizeGadget) ;Создаем окно программы
 
 
  TextGadget(22,10,310,25,15,"Порт") ;Выводим в окно надпись "Порт".
 
  ComboBoxGadget(3, 10, 325, 70, 21, #PB_ComboBox_Editable) ;гаджет выпадающего списка
 
  For i=21 To 22 ;создаем список от 1 до 99 с возможными портами для открытия
   
    AddGadgetItem(3,-1,"COM"+Str(i))
   
  Next i
 
  SetGadgetState(3,0) ;Делаем активным нулевой пункт выпадающего списка.
 
  EditorGadget(4, 8, 10, 305, 28,#PB_String_ReadOnly)
 
  TextGadget(5,10,350,200,15,"")  ;Здесь будет отображаться результат открытия порта.
 
 
  StringGadget(0, 40, 62, 90, 50, "", #PB_String_ReadOnly)
  StringGadget(1, 40, 147, 90, 50, "", #PB_String_ReadOnly)
  StringGadget(2, 40, 232, 90, 50, "", #PB_String_ReadOnly)
 
 
 
  Select_ComPort()
  AddWindowTimer(20, 0, 100)
 
  Repeat
   
    Event = WaitWindowEvent()
   
       
   
    If Event=#PB_Event_Gadget  ;если произошло срабатывание гаджета
      Gadget = EventGadget ( ) ;узнаем какой гаджет был активирован
     
      If Gadget=3  ;если был активирован выпадающий список
        If EventType() = #PB_EventType_Change
          ;ComboBox.s=GetGadgetText(3)  ;Считываем текст из текущего пункта выпадающего списка.
          Select_ComPort()
        EndIf
        ;InComStr()  
      EndIf
     
    ElseIf Event=#PB_Event_Timer
      If EventTimer() = 0
        ;InData()  ;принимаем данные из UART все время пока работает программа
        InComStr()
      EndIf
    EndIf
   
  Until Event=#PB_Event_CloseWindow
 
EndIf
End
;---------------------------------------------------------------------------------------



vadim722 писал(а):
в терминале идет следующее: 33 34 35 0D 0A
В начале было написано другое.
vadim722 писал(а):
Данные в терминале будут приходить так (примерно):250 25 ....251 26....252 27

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с байтами UART
СообщениеДобавлено: Вт мар 01, 2016 1:28 pm 
Не в сети
студент

Зарегистрирован: Пн фев 29, 2016 3:15 pm
Сообщений: 5
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Спасибо за ответ, Петр. Стало лучше но не совсем
Теперь все принятые данные уходят в гаджет №0 (Скрин Программа_1.jpg)

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

Приходят в порт три числа от контроллера, например 55 , 56, 57 в ASCII коде

В терминале это выглядит так:"Скрин COM_1.jpg"

Каждое число надо вывести в свой гаджет
55 - в гаджет 0,
56 - в гаджет 1,
57 - в гаджет 2

Буду копать дальше, но на Вашу помощь больше надежды), спасибо


Вложения:
Cкрин Программа_1.jpg [92.06 KiB]
Скачиваний: 0
Скрин COM Port_1.jpg [119.54 KiB]
Скачиваний: 0
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с байтами UART
СообщениеДобавлено: Вт мар 01, 2016 1:51 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11108
Благодарил (а): 4 раз.
Поблагодарили: 395 раз.
То есть разделителями чисел служат пробелы?
В процедуре InComStr() нужно заменить эти строки
Код:
1
2
            SetGadgetText(n,InBuff)
            n+1

на эти
Код:
1
2
3
4
            InBuff = Trim(InBuff) ; Убираем пробелы в начале и конце строки.
            For i=0 To 2
              SetGadgetText(i, StringField(InBuff, i+1, "  ")) ; Разделителями служат 2 пробела.
            Next i


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с байтами UART
СообщениеДобавлено: Вт мар 01, 2016 2:10 pm 
Не в сети
студент

Зарегистрирован: Пн фев 29, 2016 3:15 pm
Сообщений: 5
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Спасибо, Петр, вроде задышало, цифры появляются там где надо, только один нюанс) - цифры появляются на доли секунды в окнах и пропадают до поступления новой пачки данных, моргают в общем...
Как бы удерживать отображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с байтами UART
СообщениеДобавлено: Вт мар 01, 2016 2:23 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11108
Благодарил (а): 4 раз.
Поблагодарили: 395 раз.
Код:
1
2
3
4
5
6
            If InBuff<>""
              InBuff = Trim(InBuff) ; Убираем пробелы в начале и конце строки.
              For i=0 To 2
                SetGadgetText(i, StringField(InBuff, i+1, "  ")) ; Разделителями служат 2 пробела.
              Next i
            EndIf


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с байтами UART
СообщениеДобавлено: Вт мар 01, 2016 2:33 pm 
Не в сети
студент

Зарегистрирован: Пн фев 29, 2016 3:15 pm
Сообщений: 5
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Спасибо, спасибо огромное, Петр!, все заработало! Счастья Вам!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с байтами UART
СообщениеДобавлено: Чт май 11, 2017 9:36 am 
Не в сети
док

Зарегистрирован: Пн сен 27, 2010 10:30 am
Сообщений: 143
Откуда: Уренгой
Благодарил (а): 0 раз.
Поблагодарили: 10 раз.
Пункты репутации: 5
Всем привет! У меня беда :)
Столкнулся с неприятной особенностью при приеме информации через COM порт: если в принимаемом пакете попадаются байты $11, $13 - то они просто игнорируются, т.е. не принимаются. Пробовал использовать библиотеку MVCOM - тоже самое. Поиск по паутине показал, что проблема имеет место быть, обусловлена используемыми библиотеками. Вопрос собственно, как быть, пробовать подключать что-то стороннее или же есть готовое лекарство?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с байтами UART
СообщениеДобавлено: Чт май 11, 2017 12:38 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11108
Благодарил (а): 4 раз.
Поблагодарили: 395 раз.
КЭС писал(а):
Столкнулся с неприятной особенностью при приеме информации через COM порт: если в принимаемом пакете попадаются байты $11, $13 - то они просто игнорируются, т.е. не принимаются.
Может где-то ошибка в коде, потому что данные нормально принимаются.


Вложения:
USART_Test.png [35.24 KiB]
Скачиваний: 0

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с байтами UART
СообщениеДобавлено: Чт май 11, 2017 2:11 pm 
Не в сети
док

Зарегистрирован: Пн сен 27, 2010 10:30 am
Сообщений: 143
Откуда: Уренгой
Благодарил (а): 0 раз.
Поблагодарили: 10 раз.
Пункты репутации: 5
Странно все это. А у меня другая картина.


Вложения:
скрин.jpg [154.65 KiB]
Скачиваний: 0
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с байтами UART
СообщениеДобавлено: Чт май 11, 2017 3:43 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11108
Благодарил (а): 4 раз.
Поблагодарили: 395 раз.
Проверил в 5.11 - работает нормально. Значит дело не в PB.
По умолчанию байты $11, $13 отвечают за программное управление потоком. При открытии порта видно что оно отключено, но почему-то активно и видимо производится программное управление приемом и передачей.
Для начала нужно открыть в диспетчере устройств свойства порта (вкладка "Параметры порта") и посмотреть что там с управлением потоком. Должно быть отключено. Можно также попробовать функцией SetSerialPortStatus с атрибутами #PB_SerialPort_XonCharacter и #PB_SerialPort_XoffCharacter сменить байты управления потоком.
Если COM порт это преобразователь USB-UART то можно попробовать его заменить на другой на основе другой микросхемы.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с байтами UART
СообщениеДобавлено: Чт май 11, 2017 5:16 pm 
Не в сети
док

Зарегистрирован: Пн сен 27, 2010 10:30 am
Сообщений: 143
Откуда: Уренгой
Благодарил (а): 0 раз.
Поблагодарили: 10 раз.
Пункты репутации: 5
Петр, спасибо!
SetSerialPortStatus(0, #PB_SerialPort_XonCharacter, 255) :SetSerialPortStatus(0, #PB_SerialPort_XoffCharacter, 255) помогло. Понятно, что теперь споткнется при приеме $FF.
Странно, ведь управление потоком отключено при открытии порта (флаг #PB_SerialPort_NoHandshake), в диспетчере свойства смотрел - тоже.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Работа с байтами UART
СообщениеДобавлено: Чт май 11, 2017 7:36 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11108
Благодарил (а): 4 раз.
Поблагодарили: 395 раз.
Возможно ошибка в драйвере порта.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 70 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB