В 19 байте всегда передается ноль. Если отправлять так: d(18) = bat , то байт передается нормально.
Светодиодная матрица - МОДЖЕТ (антигаджет) на Пурике
Сообщений 421 страница 446 из 446
Поделиться42230.03.2012 20:18:47
Если правильно понял, то код надо переделать так:
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() и смотри что приходит.
Можно пример?
Поделиться42330.03.2012 21:22:56
Можно пример?
Как только пришли данные, выводи их в отладочное окно и смотри что пришло.
Byte.a
CountBytes = AvailableSerialPortInput(1)
If CountBytes>0
  For i=1 To CountBytes
    ReadSerialPortData(1, @Byte, 1)
    Debug Byte
  Next i
EndIfПоделиться42430.03.2012 22:39:38
Что-то я не допанимаю. Можете ткнуть куда вствавить код?
Поделиться42531.03.2012 12:55:24
Нужно посмотреть что присылает контроллер, так?
Вот пишешь что-то типа этого: 
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Поделиться42631.03.2012 21:04:40
Сделал так:
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)
Поделиться42731.03.2012 22:33:43
программа виснет.
Естественно.
Виснет в цикле. Вообще-то тот код что я выложил, это самостоятельная программа, а не вставка в др. код.
Ведь ее задача в том, чтобы посмотреть что присылает контроллер.
Поделиться42831.03.2012 22:39:36
Дело в том, что связь одностороняя(от ПК до МК). Хотелось посмотреть что уходит в порт, так как плату еще пока не собрал. Есть другие варианты?
Поделиться42931.03.2012 23:14:15
Хотелось посмотреть что уходит в порт
Если ориентироваться на этот код. Светодиодная матрица - МОДЖЕТ (антигаджет) на Пурике
То добавь перед строкой 
WriteSerialPortData(1, *Datas, 21)
строку.
ShowMemoryViewer(*Datas, 21)
в окне отладчика будут данные из памяти, отправляемые в порт.
И смотри что возвращает функция WriteSerialPortData(). Это будет число байт, отправленных в порт.
Поделиться43031.03.2012 23:19:19
Спасибо.
Поделиться43131.03.2012 23:36:56
В 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Остался вопрос с кнопкой. Может можно как-то по другому?
Поделиться43231.03.2012 23:42:45
Остался вопрос с кнопкой. Может можно как-то по другому?
Кнопка генерирует событие после отпускания, а не при нажатии.
Так что тут нужно придумывать что-то свое и имеющийся вариант впринципе неплох.
Сделал так:
А не лучше ли тогда заменить:
; Заполнение массива. 
  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)
Поделиться43301.04.2012 18:23:18
Спасибо. Добавил опрос кнопки, но он не работает, то есть нет передачи в порт. Код прилагаю.
Поделиться43401.04.2012 20:09:15
Добавил опрос кнопки, но он не работает, то есть нет передачи в порт.
Это?
Select Event 
     Case #WM_LBUTTONDOWN 
       If GetGadget(0)= GadgetID(92):bat=170: Debug bat:EndIf 
 EndSelectА где тут код отправки в порт?
Поделиться43501.04.2012 20:11:50
А где тут код отправки в порт?
Если бы знать.  Я думал, что присвоив значение переменной, само в порт отправится.
 Я думал, что присвоив значение переменной, само в порт отправится.
Поделиться43601.04.2012 20:47:13
Я думал, что присвоив значение переменной, само в порт отправится.
А может еще нужно вызвать код отправки в порт?
Поделиться43701.04.2012 21:02:16
Добавил опрос кнопки, но он не работает, то есть нет передачи в порт.
В коде вывода данных в порт была "заремлена" строчка
d(19)=bat
поэтому данные в порт не отправлялись. Теперь нормально.
Поделиться43802.04.2012 18:43:32
Привет. 
Возникла интересная проблема: данные по 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Пишу сообщение и думаю: неужели это из-за того, что закрывается библиотека?   
 
Пошел проверять.
  
   
   Дело было именно в библиотеке.
 Дело было именно в библиотеке. 
Вынес в отдельное условие и все стало нормально:
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)
Поделиться43910.04.2012 22:29:48
Привет.
Интересует вопрос: возможно ли сделать переназначение выводов для COM-порта как для USB? Есла да, то как?
Поделиться44011.04.2012 10:55:17
переназначение выводов для COM-порта как для USB
Разве у USB можно переназначить выводы? Скажем, чтобы там где было питание, шли данные? 
Ни у COM ни у USB порта нельзя переназначать выводы, т. к. это не поддерживают их контроллеры. 
Поделиться44111.04.2012 15:55:30
Не так выразился. Я имел ввиду переназначение выводов для COM-порта как для USB в программе.
Поделиться44211.04.2012 19:25:54
Все равно не понятно.
Программно нельзя переназначить выводы как для USB, так и для COM порта.
Поделиться44311.04.2012 19:39:10
В программе Cat's Eye можно переназначить номер фильтра, подключенного к порту. Для COM-порта так можно сделать?
Поделиться44411.04.2012 19:58:48
Надо поменять порядок бит в данных передаваемых через порт?
Поделиться44511.04.2012 20:35:10
Ну да, наверное.
Поделиться44611.04.2012 22:35:20
И с чем именно сложности?
Читаем бит в одной переменой и помещаем его в другую переменную в требуемую позицию.
В программе ведь есть что-то подобное. Нужно сделать тоже самое.