uart
|
|
Lelik54 | Дата: Понедельник, 18.02.2013, 09:26 | Сообщение # 1 |
Группа: Проверенные
Сообщений: 11
Статус: Offline
| Учу purebasic для общего развития и всяких полезностей дома и в гараже.взял за основу статью Управляем микроконтроллером с ПК по UART,и начал мудрить.на контроллер прикрутил ацп,а принять данные могу только в EditorGadget,там всё правильно отображается,а вот в StringGadget и ProgressBarGadget показания неправильные.Код #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(), InBytes,#PB_Ascii )) SetGadgetState (70,(InBytes) ) SetGadgetText(40,Str(InBytes)) EndIf EndIf EndIf EndProcedure
;Процедура передачи данных Procedure ComOut(Send_data.s) If IsSerialPort(#COM_Port) ;если порт открыт ComWrite(SerialPortID(#COM_Port),@send_data,1) ;Шлем данные из переменной Send_data Else ;Выводим сообщение об ошибке. MessageRequester("Ошибка","Текущий порт не доступен!",16) EndIf EndProcedure
If OpenWindow(0, 200, 200, 500, 590, "Не понятно что это???",#PB_Window_MinimizeGadget | #PB_Window_SizeGadget) ;Создаем окно программы ButtonGadget(1, 90, 380, 110, 35, "Зажечь", #PB_Button_Default) ;Кнопка "Зажечь" ButtonGadget(10, 90, 420, 110, 35, "Зажечь 2", #PB_Button_Default) ;Кнопка "Зажечь 2" TextGadget(2,10,310,25,15,"Порт") ;Выводим в окно надпись "Порт". ComboBoxGadget(3, 10, 325, 70, 21, #PB_ComboBox_Editable) ;гаджет выпадающего списка For i=1 To 3 ;создаем список от 1 до 3 с возможными портами для открытия AddGadgetItem(3,-1,"COM"+Str(i)) Next i AddWindowTimer(0, 123, 250) StringGadget(40, 330, 40, 100, 100, "", #PB_String_ReadOnly)
;SetGadgetFont(40,FontID(1))
SetGadgetState(3,0) ;Делаем активным нулевой пункт выпадающего списка. EditorGadget(4, 8, 10, 305, 280,#PB_Editor_ReadOnly) TextGadget(5,10,350,200,15,"") ;Здесь будет отображаться результат открытия порта. StringGadget(12, 70, 480, 200, 20, "") ButtonGadget(6, 200, 380, 110, 35, "Погасить", #PB_Button_Default) ;Кнопка "Погасить" ButtonGadget(11, 200, 420, 110, 35, "Погасить 2", #PB_Button_Default) ;Кнопка "Погасить" Select_ComPort() ProgressBarGadget(70, 330, 230, 150, 30, 0, 1000) ; ProgressBarGadget(23, 10, 480, 250, 30, 0, 100) ; SetGadgetState (0, 20 ) ; set 1st progressbar (ID = 0) to 50 of 100 Repeat Event = WaitWindowEvent() If Event = #PB_Event_Timer And EventTimer() = 123 InData() EndIf ;InData() ;принимаем данные из UART все время пока работает программа If Event=#PB_Event_Gadget ;если произошло срабатывание гаджета Gadget = EventGadget ( ) ;узнаем какой гаджет был активирован If Gadget=1 ;если нажата кнопка "Зажечь" ComOut("A") ;Переходим на процедуру передачи байта. :InData() ElseIf Gadget=10 ;если нажата кнопка "Зажечь2" ComOut("K") ;Переходим на процедуру передачи байта. ;InData() ElseIf Gadget=3 ;если был активирован выпадающий список ComboBox.s=GetGadgetText(3) ;Считываем текст из текущего пункта выпадающего списка. ; Переходим на процедуру, закрывающую текущий порт и открывающую выбранный. Select_ComPort() EndIf ;InData() If Gadget=6 ;нажата кнопка "Погасить" ComOut("B") ;Переходим на процедуру передачи байта. ;InData() ElseIf Gadget=11 ;нажата кнопка "Погасить2" ComOut("L") ;Переходим на процедуру передачи байта. ;InData() EndIf EndIf ;EndIf
;EndIf Until Event=#PB_Event_CloseWindow EndIf End предпологаю что в inbytes зарыто животное,но не могу понять.направте в пожалуйсто в нужное русло.
|
|
| |
301992 | Дата: Понедельник, 18.02.2013, 18:08 | Сообщение # 2 |
Группа: Проверенные
Сообщений: 47
Статус: Offline
| Есть интересная программа Hiasm. Это своего рода конструктор для написания программ как для ПК, так и для МК. На сайте www.Hiasm.com можно почитать подробнее. Я с ее помощью, в свое время написал хороший диплом .
Так в ней работа с COM и USB, очень просто осуществляется. Вот один из примеров :http://www.getchip.net/posts/082-avtomat-upravleniya-nagruzkami-apdejjt-gcn_effector_12/. Там для этой оболочки, хороший человек начал делать конструктор для МК, но на выходе или готовый хекс или код на Си. Есть желание написать данный конструкор, но с компилятором Bascom. Начал заниматься, но времени нехватает. если есть интерес, то можно всем хором написать данный конструктор и это облегчит знакомство с МК.
|
|
| |
exersizze | Дата: Вторник, 19.02.2013, 10:12 | Сообщение # 3 |
Группа: Администраторы
Сообщений: 723
Статус: Offline
| 301992, это что-то наподобе Algorithm Builder'a? Для асма подобные графические оболочки еще более менее полезны, а вот для баскома это лишнее, имхо. Он и без того предельно прост в освоении.
|
|
| |
301992 | Дата: Вторник, 19.02.2013, 11:02 | Сообщение # 4 |
Группа: Проверенные
Сообщений: 47
Статус: Offline
| Это не Algorithm Builder, а гараздо удобнее. Имел знакомство с Algorithm Builder, так вообще ничего не понял. Здесь все предельно понятно. По поводу Баскома я согласен, он прост в освоении. Надо только немного времени и терпения. Hiasm альтернатива С++, да еще какая. Я голову сломал с этими закорючками, пока не наткнулся на Hiasm. Последний можно использовать для написания программ для ПК (WINDA, LINUX) или для Андроида, для сопряжения своего детища с ними.
|
|
| |
Lelik54 | Дата: Вторник, 19.02.2013, 11:35 | Сообщение # 5 |
Группа: Проверенные
Сообщений: 11
Статус: Offline
| Я не силен в программировании,поэтому вопросы и задаю.Кто ни будь,что ни будь подскажет???
|
|
| |
exersizze | Дата: Вторник, 19.02.2013, 12:56 | Сообщение # 6 |
Группа: Администраторы
Сообщений: 723
Статус: Offline
| Lelik54, думается мне что значение не той переменной пытаетесь использовать. В InBytes лежит всего-навсего кол-во байт, которые находятся в буфере. Попробуйте использовать InBuffer
|
|
| |
Петр | Дата: Вторник, 19.02.2013, 13:12 | Сообщение # 7 |
Группа: Проверенные
Сообщений: 47
Статус: Offline
| Цитата (Lelik54) в StringGadget и ProgressBarGadget показания неправильные Нужно было еще написать что туда должно выводится, а то догадаться сложно. Допустим, что в StringGadget() должен отображаться текущий принятый текст, а что должно быть в ProgressBarGadget(), даже представить не могу. Код #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+4), RealInBytes RealInBytes = ReadSerialPortData(#COM_Port, @InBuffer(), InBytes) If RealInBytes>0 AddGadgetItem(4, -1, PeekS(@InBuffer(), InBytes,#PB_Ascii )) SetGadgetState(70, InBytes) SetGadgetText(40, PeekS(@InBuffer(), InBytes,#PB_Ascii )) EndIf EndIf EndIf EndProcedure
;Процедура передачи данных Procedure ComOut(Send_data.s) If IsSerialPort(#COM_Port) ;если порт открыт WriteSerialPortData(#COM_Port,@send_data,1) ;Шлем данные из переменной Send_data Else ;Выводим сообщение об ошибке. MessageRequester("Ошибка","Текущий порт не доступен!",16) EndIf EndProcedure
If OpenWindow(0, 200, 200, 500, 590, "Не понятно что это???",#PB_Window_MinimizeGadget | #PB_Window_ScreenCentered) ;Создаем окно программы ButtonGadget(1, 90, 380, 110, 35, "Зажечь", #PB_Button_Default) ;Кнопка "Зажечь" ButtonGadget(10, 90, 420, 110, 35, "Зажечь 2", #PB_Button_Default) ;Кнопка "Зажечь 2" TextGadget(2,10,310,25,15,"Порт") ;Выводим в окно надпись "Порт". ComboBoxGadget(3, 10, 325, 70, 21, #PB_ComboBox_Editable) ;гаджет выпадающего списка For i=1 To 3 ;создаем список от 1 до 3 с возможными портами для открытия AddGadgetItem(3,-1,"COM"+Str(i)) Next i AddWindowTimer(0, 123, 250) StringGadget(40, 330, 40, 100, 100, "", #PB_String_ReadOnly) ;SetGadgetFont(40,FontID(1)) SetGadgetState(3,0) ;Делаем активным нулевой пункт выпадающего списка. EditorGadget(4, 8, 10, 305, 280,#PB_Editor_ReadOnly) TextGadget(5,10,350,200,15,"") ;Здесь будет отображаться результат открытия порта. StringGadget(12, 70, 480, 200, 20, "") ButtonGadget(6, 200, 380, 110, 35, "Погасить", #PB_Button_Default) ;Кнопка "Погасить" ButtonGadget(11, 200, 420, 110, 35, "Погасить 2", #PB_Button_Default) ;Кнопка "Погасить" Select_ComPort() ProgressBarGadget(70, 330, 230, 150, 30, 0, 1000) ; ProgressBarGadget(23, 10, 480, 250, 30, 0, 100) ; SetGadgetState (0, 20 ) ; set 1st progressbar (ID = 0) to 50 of 100 Repeat Event = WaitWindowEvent() If Event = #PB_Event_Timer And EventTimer() = 123 InData() EndIf ;InData() ;принимаем данные из UART все время пока работает программа If Event=#PB_Event_Gadget ;если произошло срабатывание гаджета Gadget = EventGadget ( ) ;узнаем какой гаджет был активирован If Gadget=1 ;если нажата кнопка "Зажечь" ComOut("A") ;Переходим на процедуру передачи байта. :InData() ElseIf Gadget=10 ;если нажата кнопка "Зажечь2" ComOut("K") ;Переходим на процедуру передачи байта. ;InData() ElseIf Gadget=3 ;если был активирован выпадающий список ComboBox.s=GetGadgetText(3) ;Считываем текст из текущего пункта выпадающего списка. ; Переходим на процедуру, закрывающую текущий порт и открывающую выбранный. Select_ComPort() EndIf ;InData() If Gadget=6 ;нажата кнопка "Погасить" ComOut("B") ;Переходим на процедуру передачи байта. ;InData() ElseIf Gadget=11 ;нажата кнопка "Погасить2" ComOut("L") ;Переходим на процедуру передачи байта. ;InData() EndIf EndIf ;EndIf ;EndIf Until Event=#PB_Event_CloseWindow EndIf End
Цитата (301992) Я голову сломал с этими закорючками, пока не наткнулся на Hiasm В хайасме некоторые вещи реализованы не очень логично и если не найдется необходимого компонента (например, на данный момент, нет компонента для работы с USB HID), то вы без ЯП не сможете реализовать задумку.
Сообщение отредактировал Петр - Вторник, 19.02.2013, 13:15 |
|
| |
Lelik54 | Дата: Вторник, 19.02.2013, 14:26 | Сообщение # 8 |
Группа: Проверенные
Сообщений: 11
Статус: Offline
| и в StringGadget() и ProgressBarGadget() должно отображаться напряжение снятое с АЦП.одно и тоже,просто для разной визуализации.когда использую переменную InBuffer ,на выходе отображается 3747728,а в EditorGadget как положено 560-это то что передает atmega.ни к чему привязать то,не получается эти 7 цифр.
|
|
| |
Петр | Дата: Вторник, 19.02.2013, 16:20 | Сообщение # 9 |
Группа: Проверенные
Сообщений: 47
Статус: Offline
| Цитата (Lelik54) должно отображаться напряжение снятое с АЦП В каком виде эти данные передает MK? Хотя бы скопируйте то, что выводится в EditorGadget, а там посмотрим.
|
|
| |
Lelik54 | Дата: Вторник, 19.02.2013, 16:38 | Сообщение # 10 |
Группа: Проверенные
Сообщений: 11
Статус: Offline
| Петр,могу avr код выложить,но там обычно,A=getAdc() Код Код [color=#828282]$regfile = "M8535.dat"[/color][color=#828282]$crystal = 8000000[/color][color=#828282]$baud = 19200[/color] [color=#828282]Config Porta.1 = Output[/color][color=#828282]Config Porta.3 = Output[/color][color=#828282]Config Porta.4 = Input[/color][color=#828282]$lib "lcd4.lbx"[/color][color=#828282]Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7[/color][color=#828282]Config Lcd = 16 * 2 'подключаем светодиод[/color][color=#828282]Led Alias Porta.3[/color][color=#828282]Led1 Alias Porta.1[/color][color=#828282]Config Adc = Single , Prescaler = Auto , Reference = Avcc[/color] [color=#828282]'объявляем подпрограммы[/color][color=#828282]Declare Sub Getline(s As String) 'чтение данных из буфера[/color][color=#828282]Declare Sub Del_buffer() 'очистка буфера[/color][color=#828282]Dim F As Byte[/color][color=#828282]Dim R As Byte[/color][color=#828282]Dim S As String * 1[/color][color=#828282]Dim B As Byte[/color][color=#828282]Dim A As Word[/color][color=#828282]Dim P As Byte[/color] [color=#828282]Start Adc[/color][color=#828282]Cursor Off[/color][color=#828282]Cls[/color][color=#828282]Do[/color][color=#828282]If F = 10 Then[/color] [color=#828282]F = 0[/color][color=#828282]End If[/color][color=#828282]F = F + 1[/color][color=#828282]A = Getadc(5)[/color] [color=#828282]Waitms 100[/color][color=#828282]R = Ischarwaiting() 'проверка наличия команды в буфере UART[/color] [color=#828282]If R = 1 Then 'если в буфере что-то есть переменной R присвоится значение 1[/color] [color=#828282]Getline S 'вытаскиваем содержимое буфера в переменную S[/color] [color=#828282]If S = "A" Then 'если там символ "А"[/color] [color=#828282]Print "Свет1 включен" 'отошлем сообщение[/color] [color=#828282]Led = 1 'и включим светодиод[/color] [color=#828282]Elseif S = "B" Then 'если там символ "В"[/color] [color=#828282]Print "Свет1 выключен" 'сообщим о выключении[/color] [color=#828282]Led = 0[/color] [color=#828282]'выключаем светодиод[/color] [color=#828282]End If[/color] [color=#828282]If S = "K" Then 'если там символ "А"[/color] [color=#828282]Print "Свет2 включен" 'отошлем сообщение[/color] [color=#828282]Led1 = 1 'и включим светодиод[/color] [color=#828282]Elseif S = "L" Then 'если там символ "В"[/color] [color=#828282]Print "Свет 2 выключен" 'сообщим о выключении[/color] [color=#828282]Led1 = 0 'выключаем светодиод[/color] [color=#828282]End If[/color] [color=#828282]'End If[/color] [color=#828282]Del_buffer 'если в буфере что-то другое очищаем его[/color] [color=#828282]End If[/color][color=#828282]' Debounce Pind.3 , 1 , Rr[/color] [color=#828282]If Pind.3 = 1 Then[/color] [color=#828282]Waitms 100[/color] [color=#828282]Print "сработал концевик"[/color] [color=#828282]End If[/color] [color=#828282]If F = 5 Then[/color][color=#828282]' Print "b"[/color][color=#828282]Print A[/color] [color=#828282]End If[/color] [color=#828282]Locate 1 , 1[/color] [color=#828282]Lcd A[/color] [color=#828282]Locate 2 , 1[/color] [color=#828282]Lcd F[/color] [color=#828282]Locate 1 , 5[/color] [color=#828282]Lcd S[/color] [color=#828282]Loop[/color][color=#828282]End[/color] [color=#828282]'подпрограмма для разбора сообщения c UART[/color][color=#828282]'=========================================[/color][color=#828282]Sub Getline(s As String)[/color][color=#828282]S = ""[/color][color=#828282]Do[/color] [color=#828282]B = Inkey()[/color] [color=#828282]'берем символ из буфера в формате ASCII[/color] [color=#828282]Select Case B[/color] [color=#828282]Case 0 : Exit Do 'если дальше буфер пуст - выходим из цикла[/color] [color=#828282]Case 10 : If S <> "" Then Exit Do 'конец строки, значит выходим из цикла[/color] [color=#828282]Case Else : If B > 31 Then S = S + Chr(b) 'составляем строку[/color] [color=#828282]End Select[/color][color=#828282]Loop[/color][color=#828282]End Sub[/color] [color=#828282]'очистка буфера UART[/color][color=#828282]'===================[/color][color=#828282]Sub Del_buffer()[/color] [color=#828282]Do[/color] [color=#828282]B = Inkey() 'кладем в переменную "В" данные из буфера[/color] [color=#828282]Loop Until B = 0 'выходим из цикла когда в переменную попадет 0 (буфер пуст)[/color][color=#828282]End Sub[/color][color=#828282]'Rr:[/color][color=#828282]'Set Porta.3[/color][color=#828282]'Print "butt"[/color][color=#828282]'Return [/color]
|
|
| |
Lelik54 | Дата: Вторник, 19.02.2013, 16:39 | Сообщение # 11 |
Группа: Проверенные
Сообщений: 11
Статус: Offline
| как то коряво получилось выложить
|
|
| |
Lelik54 | Дата: Вторник, 19.02.2013, 16:41 | Сообщение # 12 |
Группа: Проверенные
Сообщений: 11
Статус: Offline
| Код Код [color=#828282]$regfile = "M8535.dat"[/color][color=#828282]$crystal = 8000000[/color][color=#828282]$baud = 19200[/color] [color=#828282]Config Porta.1 = Output[/color][color=#828282]Config Porta.3 = Output[/color][color=#828282]Config Porta.4 = Input[/color][color=#828282]$lib "lcd4.lbx"[/color][color=#828282]Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7[/color][color=#828282]Config Lcd = 16 * 2 'подключаем светодиод[/color][color=#828282]Led Alias Porta.3[/color][color=#828282]Led1 Alias Porta.1[/color][color=#828282]Config Adc = Single , Prescaler = Auto , Reference = Avcc[/color] [color=#828282]'объявляем подпрограммы[/color][color=#828282]Declare Sub Getline(s As String) 'чтение данных из буфера[/color][color=#828282]Declare Sub Del_buffer() 'очистка буфера[/color][color=#828282]Dim F As Byte[/color][color=#828282]Dim R As Byte[/color][color=#828282]Dim S As String * 1[/color][color=#828282]Dim B As Byte[/color][color=#828282]Dim A As Word[/color][color=#828282]Dim P As Byte[/color] [color=#828282]Start Adc[/color][color=#828282]Cursor Off[/color][color=#828282]Cls[/color][color=#828282]Do[/color][color=#828282]If F = 10 Then[/color] [color=#828282]F = 0[/color][color=#828282]End If[/color][color=#828282]F = F + 1[/color][color=#828282]A = Getadc(5)[/color] [color=#828282]Waitms 100[/color][color=#828282]R = Ischarwaiting() 'проверка наличия команды в буфере UART[/color] [color=#828282]If R = 1 Then 'если в буфере что-то есть переменной R присвоится значение 1[/color] [color=#828282]Getline S 'вытаскиваем содержимое буфера в переменную S[/color] [color=#828282]If S = "A" Then 'если там символ "А"[/color] [color=#828282]Print "Свет1 включен" 'отошлем сообщение[/color] [color=#828282]Led = 1 'и включим светодиод[/color] [color=#828282]Elseif S = "B" Then 'если там символ "В"[/color] [color=#828282]Print "Свет1 выключен" 'сообщим о выключении[/color] [color=#828282]Led = 0[/color] [color=#828282]'выключаем светодиод[/color] [color=#828282]End If[/color] [color=#828282]If S = "K" Then 'если там символ "А"[/color] [color=#828282]Print "Свет2 включен" 'отошлем сообщение[/color] [color=#828282]Led1 = 1 'и включим светодиод[/color] [color=#828282]Elseif S = "L" Then 'если там символ "В"[/color] [color=#828282]Print "Свет 2 выключен" 'сообщим о выключении[/color] [color=#828282]Led1 = 0 'выключаем светодиод[/color] [color=#828282]End If[/color] [color=#828282]'End If[/color] [color=#828282]Del_buffer 'если в буфере что-то другое очищаем его[/color] [color=#828282]End If[/color][color=#828282]' Debounce Pind.3 , 1 , Rr[/color] [color=#828282]If Pind.3 = 1 Then[/color] [color=#828282]Waitms 100[/color] [color=#828282]Print "сработал концевик"[/color] [color=#828282]End If[/color] [color=#828282]If F = 5 Then[/color][color=#828282]' Print "b"[/color][color=#828282]Print A[/color] [color=#828282]End If[/color] [color=#828282]Locate 1 , 1[/color] [color=#828282]Lcd A[/color] [color=#828282]Locate 2 , 1[/color] [color=#828282]Lcd F[/color] [color=#828282]Locate 1 , 5[/color] [color=#828282]Lcd S[/color] [color=#828282]Loop[/color][color=#828282]End[/color] [color=#828282]'подпрограмма для разбора сообщения c UART[/color][color=#828282]'=========================================[/color][color=#828282]Sub Getline(s As String)[/color][color=#828282]S = ""[/color][color=#828282]Do[/color] [color=#828282]B = Inkey()[/color] [color=#828282]'берем символ из буфера в формате ASCII[/color] [color=#828282]Select Case B[/color] [color=#828282]Case 0 : Exit Do 'если дальше буфер пуст - выходим из цикла[/color] [color=#828282]Case 10 : If S <> "" Then Exit Do 'конец строки, значит выходим из цикла[/color] [color=#828282]Case Else : If B > 31 Then S = S + Chr(b) 'составляем строку[/color] [color=#828282]End Select[/color][color=#828282]Loop[/color][color=#828282]End Sub[/color] [color=#828282]'очистка буфера UART[/color][color=#828282]'===================[/color][color=#828282]Sub Del_buffer()[/color] [color=#828282]Do[/color] [color=#828282]B = Inkey() 'кладем в переменную "В" данные из буфера[/color] [color=#828282]Loop Until B = 0 'выходим из цикла когда в переменную попадет 0 (буфер пуст)[/color][color=#828282]End Sub[/color][color=#828282]'Rr:[/color][color=#828282]'Set Porta.3[/color][color=#828282]'Print "butt"[/color][color=#828282]'Return[/color] вот так лучше будет
|
|
| |
Lelik54 | Дата: Вторник, 19.02.2013, 16:42 | Сообщение # 13 |
Группа: Проверенные
Сообщений: 11
Статус: Offline
| простите,что то не получается.
|
|
| |
exersizze | Дата: Вторник, 19.02.2013, 19:00 | Сообщение # 14 |
Группа: Администраторы
Сообщений: 723
Статус: Offline
| Lelik54, скопируй текст программы и вставь между тэгами [code]
|
|
| |
exersizze | Дата: Вторник, 19.02.2013, 19:23 | Сообщение # 15 |
Группа: Администраторы
Сообщений: 723
Статус: Offline
| Можно использовать вот эту кнопку
|
|
| |
Lelik54 | Дата: Вторник, 19.02.2013, 20:19 | Сообщение # 16 |
Группа: Проверенные
Сообщений: 11
Статус: Offline
| Код $regfile = "M8535.dat" $crystal = 8000000 $baud = 19200 Config Porta.1 = Output Config Porta.3 = Output Config Porta.4 = Input $lib "lcd4.lbx" Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 Config Lcd = 16 * 2 'подключаем светодиод Led Alias Porta.3 Led1 Alias Porta.1 Config Adc = Single , Prescaler = Auto , Reference = Avcc
'объявляем подпрограммы Declare Sub Getline(s As String) 'чтение данных из буфера Declare Sub Del_buffer() 'очистка буфера Dim F As Byte Dim R As Byte Dim S As String * 1 Dim B As Byte Dim A As Word Dim P As Byte
Start Adc Cursor Off Cls Do If F = 10 Then
F = 0 End If F = F + 1 A = Getadc(5)
Waitms 100 R = Ischarwaiting() 'проверка наличия команды в буфере UART If R = 1 Then 'если в буфере что-то есть переменной R присвоится значение 1 Getline S 'вытаскиваем содержимое буфера в переменную S If S = "A" Then 'если там символ "А" Print "Свет1 включен" 'отошлем сообщение Led = 1 'и включим светодиод Elseif S = "B" Then 'если там символ "В" Print "Свет1 выключен" 'сообщим о выключении Led = 0 'выключаем светодиод End If If S = "K" Then 'если там символ "А" Print "Свет2 включен" 'отошлем сообщение Led1 = 1 'и включим светодиод Elseif S = "L" Then 'если там символ "В" Print "Свет 2 выключен" 'сообщим о выключении Led1 = 0 'выключаем светодиод End If 'End If Del_buffer 'если в буфере что-то другое очищаем его End If ' Debounce Pind.3 , 1 , Rr If Pind.3 = 1 Then Waitms 100 Print "сработал концевик" End If
If F = 5 Then ' Print "b" Print A End If Locate 1 , 1 Lcd A Locate 2 , 1 Lcd F Locate 1 , 5 Lcd S
Loop End
'подпрограмма для разбора сообщения c UART '========================================= Sub Getline(s As String) S = "" Do B = Inkey() 'берем символ из буфера в формате ASCII Select Case B Case 0 : Exit Do 'если дальше буфер пуст - выходим из цикла Case 10 : If S <> "" Then Exit Do 'конец строки, значит выходим из цикла Case Else : If B > 31 Then S = S + Chr(b) 'составляем строку End Select Loop End Sub
'очистка буфера UART '=================== Sub Del_buffer() Do B = Inkey() 'кладем в переменную "В" данные из буфера Loop Until B = 0 'выходим из цикла когда в переменную попадет 0 (буфер пуст) End Sub 'Rr: 'Set Porta.3 'Print "butt" 'Return
|
|
| |