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