[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Форум » форумы » Общение с ПК » uart
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  можно почитать подробнее. Я с ее помощью, в свое время написал хороший диплом smile .

Так в ней работа с 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
Можно использовать вот эту кнопку

Прикрепления: 7922367.png (20.8 Kb)


 
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


 
Форум » форумы » Общение с ПК » uart
  • Страница 1 из 1
  • 1
Поиск: