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