PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Светодиодная матрица - МОДЖЕТ (антигаджет) на Пурике


Светодиодная матрица - МОДЖЕТ (антигаджет) на Пурике

Сообщений 421 страница 446 из 446

421

В 19 байте всегда передается ноль. Если отправлять так: d(18) = bat , то байт передается нормально.

0

422

Если правильно понял, то код надо переделать так:

Код:
Global bat.a=0

Procedure GetGadget(WindowID.l) 
    Protected cursorpos.POINT 
    GetCursorPos_(@cursorpos) 
    MapWindowPoints_(0, WindowID(WindowID), cursorpos, 1) 
    ProcedureReturn ChildWindowFromPoint_(WindowID(WindowID), cursorpos\x | cursorpos\y<<32) 
  EndProcedure 
   
   OpenWindow(0, 235, 169, 400, 113, "Window_0", #PB_Window_ScreenCentered|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar) 
   ButtonGadget(2, 15, 65, 130, 25, "Button") 
   
 Repeat 
   Event = WaitWindowEvent() 
   Select Event 
     Case #WM_LBUTTONDOWN 
       If GetGadget(0)= GadgetID(2):bat=170: Debug bat:EndIf 
     Case #PB_Event_Gadget 
       EventGadget = EventGadget() 
       EventType = EventType() 
    If EventGadget = 2 
         bat=0
         Debug bat 
       EndIf 
   EndSelect 
 Until Event= #PB_Event_CloseWindow
Пётр написал(а):

Принимай побайтно функцией ReadSerialPortData() и смотри что приходит.

Можно пример?

0

423

max написал(а):

Можно пример?

Как только пришли данные, выводи их в отладочное окно и смотри что пришло.

Код:
Byte.a
CountBytes = AvailableSerialPortInput(1)
If CountBytes>0
  For i=1 To CountBytes
    ReadSerialPortData(1, @Byte, 1)
    Debug Byte
  Next i
EndIf

0

424

Что-то я не допанимаю. Можете ткнуть куда вствавить код?

0

425

Нужно посмотреть что присылает контроллер, так?
Вот пишешь что-то типа этого:

Код:
If OpenSerialPort(1, "COM2", 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 255, 255)
  Repeat
    Byte.a
    CountBytes = AvailableSerialPortInput(1)
    If CountBytes>0
      For i=1 To CountBytes
        ReadSerialPortData(1, @Byte, 1)
        Debug Byte
      Next i
    EndIf
  ForEver
EndIf

0

426

Сделал так:

Код:
If OpenSerialPort(1, GetGadgetText(91), 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 255, 255)
         Repeat
             flgRS232 = 1
    Byte.a
    CountBytes = AvailableSerialPortInput(1)
    If CountBytes>0
      For i=1 To CountBytes
        ReadSerialPortData(1, @Byte, 1)
        Debug Byte
      Next i
    EndIf
  ForEver
          
        EndIf

программа виснет. Код прилагаю.
С кнопкой и отправкой 19-го байта так и не разобрался.

Отредактировано max (31.03.2012 21:06:06)

0

427

max написал(а):

программа виснет.

Естественно.
Виснет в цикле. Вообще-то тот код что я выложил, это самостоятельная программа, а не вставка в др. код.
Ведь ее задача в том, чтобы посмотреть что присылает контроллер.

0

428

Дело в том, что связь одностороняя(от ПК до МК). Хотелось посмотреть что уходит в порт, так как плату еще пока не собрал. Есть другие варианты?

0

429

max написал(а):

Хотелось посмотреть что уходит в порт

Если ориентироваться на этот код. Светодиодная матрица - МОДЖЕТ (антигаджет) на Пурике
То добавь перед строкой

Код:
WriteSerialPortData(1, *Datas, 21)

строку.

Код:
ShowMemoryViewer(*Datas, 21)

в окне отладчика будут данные из памяти, отправляемые в порт.
И смотри что возвращает функция WriteSerialPortData(). Это будет число байт, отправленных в порт.

0

430

Спасибо.

0

431

max написал(а):

В 19 байте всегда передается ноль. Если отправлять так: d(18) = bat , то байт передается нормально.

С тим разобрался. В массив не заполнялся 19 байт. Было так:

Код:
; Заполнение массива. 
  PokeS(*Datas, Chr(255)) 
  For i=1 To 18 
    PokeS(*Datas+i, Chr(d(i))) 
    Next i   
  WriteSerialPortData(1, *Datas, 21)   
  FreeMemory(*Datas) 
EndIf
EndIf

Сделал так:

Код:
; Заполнение массива. 
  PokeS(*Datas, Chr(255)) 
  For i=1 To 19 
    PokeS(*Datas+i, Chr(d(i))) 
  Next i   
    WriteSerialPortData(1, *Datas, 21)   
  FreeMemory(*Datas) 
EndIf
EndIf

Остался вопрос с кнопкой. Может можно как-то по другому?

0

432

max написал(а):

Остался вопрос с кнопкой. Может можно как-то по другому?

Кнопка генерирует событие после отпускания, а не при нажатии.
Так что тут нужно придумывать что-то свое и имеющийся вариант впринципе неплох.

max написал(а):

Сделал так:

А не лучше ли тогда заменить:

Код:
; Заполнение массива. 
  PokeS(*Datas, Chr(255)) 
  For i=1 To 19 
    PokeS(*Datas+i, Chr(d(i))) 
  Next i   
  WriteSerialPortData(1, *Datas, 21)

на:

Код:
d(0)=255
WriteSerialPortData(1, @d(), 21)

0

433

Спасибо. Добавил опрос кнопки, но он не работает, то есть нет передачи в порт. Код прилагаю.

0

434

max написал(а):

Добавил опрос кнопки, но он не работает, то есть нет передачи в порт.

Это?

Код:
Select Event 
     Case #WM_LBUTTONDOWN 
       If GetGadget(0)= GadgetID(92):bat=170: Debug bat:EndIf 
 EndSelect

А где тут код отправки в порт?

0

435

Пётр написал(а):

А где тут код отправки в порт?

Если бы знать. :dontknow: Я думал, что присвоив значение переменной, само в порт отправится.

0

436

max написал(а):

Я думал, что присвоив значение переменной, само в порт отправится.

А может еще нужно вызвать код отправки в порт?

0

437

max написал(а):

Добавил опрос кнопки, но он не работает, то есть нет передачи в порт.

В коде вывода данных в порт была "заремлена" строчка

Код:
d(19)=bat

поэтому данные в порт не отправлялись. Теперь нормально.

0

438

Привет.
Возникла интересная проблема: данные по RS232 идут при выборе USB, при этом кнопка недоступна, и наоборот, при выборе COM кнопка доступна, но данные идут через USB. Как выяснилось дело в том, что я решил при выборе COM "потушить" светодиоды USB, а при выборе USB "зажечь" таким образом:

Код:
      Case 91 ;Выбор последовательного порта
                If EventType()=1
          Select GetGadgetState(91)
            Case 0
              exit_usb = 0
              DisableGadget(92, 1)
       TextGadget(46,181,39,22,16,"PD0")
       If HID_Lib_DeviceTest(USB_PID, USB_VID)
       SetGadgetText(0, #YES_Device)
       SetGadgetColor(0, #PB_Gadget_FrontColor, $00FF0F) 
       Else
       SetGadgetText(0, #NO_Device)
       SetGadgetColor(0, #PB_Gadget_FrontColor, $0000FF)
       EndIf
     Case 1 To 64
       exit_usb = 1
       DisableGadget(92, 0)
       TextGadget(46,181,39,22,16,"PD2")
       TextGadget(0, 119, 8, 57 ,18,#YES_Com, #PB_Text_Border|#PB_Text_Center)
       SetGadgetColor(0, #PB_Gadget_FrontColor, $00FF0F)
        ;Закроем открытый порт
           If flgRS232 = 1
          CloseSerialPort(1) 
          flgRS232 = 0     
        EndIf
        If OpenSerialPort(1, GetGadgetText(91), 9600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 255, 255)
          flgRS232 = 1
         EndIf 
          EndSelect
        EndIf

так как есть такой код:

Код:
If exit_usb = 1
;{----Выключим все светодиоды usb-----
OutBytes() : nt.c=0 
 OutBytes(1) =  0  
SendDevice()     
OutBytes() : nt.c=0 
 OutBytes(1) =  64 
SendDevice()   
OutBytes() : nt.c=0 
 OutBytes(1) =  128  
SendDevice()
;}-------------------------------- 

;{----Выключим все светодиоды lpt-----
    LPT_Out($378,0)
    LPT_Out($37A,11) 
 ;}-------------------------------- 
 
 CloseLibrary(1) ; Закрываем файл inpout32.dll
 ;MessageRequester("", "Программа Закрыта !", 16)   
  
EndIf

Пишу сообщение и думаю: неужели это из-за того, что закрывается библиотека?  :dontknow:
Пошел проверять.

:canthearyou:  :confused:  :crazyfun: Дело было именно в библиотеке.
Вынес в отдельное условие и все стало нормально:

Код:
If exit_usb_input_com = 1
;{----Выключим все светодиоды usb-----
OutBytes() : nt.c=0 
 OutBytes(1) =  0  
SendDevice()     
OutBytes() : nt.c=0 
 OutBytes(1) =  64 
SendDevice()   
OutBytes() : nt.c=0 
 OutBytes(1) =  128  
 SendDevice()
 EndIf
;}--------------------------------

Отредактировано max (02.04.2012 19:15:50)

0

439

Привет.
Интересует вопрос: возможно ли сделать переназначение выводов для COM-порта как для USB? Есла да, то как?

0

440

max написал(а):

переназначение выводов для COM-порта как для USB

Разве у USB можно переназначить выводы? Скажем, чтобы там где было питание, шли данные? o.O
Ни у COM ни у USB порта нельзя переназначать выводы, т. к. это не поддерживают их контроллеры. :dontknow:

0

441

Не так выразился. Я имел ввиду переназначение выводов для COM-порта как для USB в программе.

0

442

Все равно не понятно.
Программно нельзя переназначить выводы как для USB, так и для COM порта.

0

443

В программе Cat's Eye можно переназначить номер фильтра, подключенного к порту. Для COM-порта так можно сделать?

0

444

Надо поменять порядок бит в данных передаваемых через  порт?

0

445

Ну да, наверное.

0

446

И с чем именно сложности?
Читаем бит в одной переменой и помещаем его в другую переменную в требуемую позицию.
В программе ведь есть что-то подобное. Нужно сделать тоже самое.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Светодиодная матрица - МОДЖЕТ (антигаджет) на Пурике