Rod
Full Member
member is offline


Gender: 
Posts: 110
|
 |
Re: Com port code works in lb but not lbb
« Reply #8 on: Apr 20th, 2015, 08:52am » |
|
OK, it is a simple speed issue and program structure fault.
Typically you will open a serial port once, give it a little time to establish and then use it. A serial port can take a good few hundred milliseconds to establish. Once completely finished close it once.
My test code gave the port 500ms before attempting to use it.
So that's all that is required to fix the problem. In this code I open the port first thing, by the time the user gets round to pressing keys the port is established and responds without the need of any handshaking.
Code:port=4 'your com port number
'Open the com port
open "COM" ; port ; ":9600,n,8,1" for random as #ArduinoCOMPort
dim pins$(100)
'Populate pin list
for x = 0 to 13
pins$(x) = str$(x)
next x
'nomainwin
WindowWidth = 360
WindowHeight = 445
UpperLeftX=int((DisplayWidth-WindowWidth)/2)
UpperLeftY=int((DisplayHeight-WindowHeight)/2)
listbox #main.PinSelector, pins$(, [listbox1DoubleClick], 10, 82, 130, 320
statictext #main.statictext2, "Pin Selector", 10, 62, 130, 20
textbox #main.ValToSend, 165, 32, 170, 25
statictext #main.statictext4, "Value To Send", 165, 12, 170, 20
statictext #main.statictext5, "Return Value", 165, 62, 175, 20
textbox #main.ReturnValue, 165, 82, 170, 25
button #main.button7,"Set Pin High/Low Status",[Set.Pin], UL, 165, 117, 170, 25
button #main.button8,"Get Pin High/Low Status",[Get.Pin], UL, 165, 152, 170, 25
button #main.button9,"PWM Output (Servos)",[PWM.Out], UL, 165, 187, 170, 25
button #main.button10,"PWM Input",[PWM.In], UL, 165, 222, 170, 25
statictext #main.statictext11, "Com Port Number", 10, 12, 145, 20
textbox #main.ComPortNo, 10, 32, 130, 25
open "LB Ultra Simple Arduino Demo" for dialog as #main
print #main, "trapclose [quit.main]"
wait
[Set.Pin]
gosub [Get.The.Selctions.And.Textboxes.From.Main.Win]
return.value = AD.Set(Com.port.Selection, Pin.Selection, Val.To.Send)
print #main.ReturnValue, return.value
wait
[Get.Pin]
gosub [Get.The.Selctions.And.Textboxes.From.Main.Win]
return.value = AD.Get(Com.port.Selection, Pin.Selection)
print #main.ReturnValue, return.value
wait
[PWM.Out]
gosub [Get.The.Selctions.And.Textboxes.From.Main.Win]
return.value = AD.PWM.Out(Com.port.Selection, Pin.Selection, Val.To.Send)
print #main.ReturnValue, return.value
wait
[PWM.In]
gosub [Get.The.Selctions.And.Textboxes.From.Main.Win]
return.value = AD.PWM.In(Com.port.Selection, Pin.Selection)
print #main.ReturnValue, return.value
wait
[quit.main]
close #main
close #ArduinoCOMPort
end
[Get.The.Selctions.And.Textboxes.From.Main.Win]
print #main.ValToSend, "!contents? Val.To.Send";
print #main.ComPortNo, "!contents? Com.port.Selection";
print #main.PinSelector, "selection? Pin.Selection"
return
'Begin Arduino Code here -------------------------------------------------------
'These functions can be added to any program to provide arduini power input and output
'Descriptions for functions are in there comments
function AD.Set(com.port, PinNo, value)
'Set an Arduino pin high or low,
'Will return 1 one if successful, 0 if not
AD.Set = val(AD.talk.to.device$(com.port,"set ";PinNo;" ";value))
end function
function AD.Get(com.port, PinNo)
'Will return the current state of the input pin
'1 for high, 0 for low
AD.Get = val(AD.talk.to.device$(com.port,"get ";PinNo))
end function
function AD.PWM.Out(com.port, PinNo, value)
'Set the PWM output on the select pin to the value
'Will return a 1 for success and 0 for failure.
AD.PWM.Out = val(AD.talk.to.device$(com.port,"pwm.out ";PinNo;" ";value))
end function
function AD.PWM.In(com.port, PinNo)
'Get the PWM input from the pin
'Will return a value of 0 to 1023
AD.PWM.In = val(AD.talk.to.device$(com.port,"pwm.in ";PinNo))
end function
Function AD.talk.to.device$(port,msg$)
'Send a Message to the arduino and return the result sent back by the device
if msg$ <> "" then
'Send message to device
print #ArduinoCOMPort, msg$
'Wait until there is a carriage return
while foundLF = 0
while lof(#ArduinoCOMPort) > 0
temp$ = input$(#ArduinoCOMPort, 1)
buffer$ = buffer$ + temp$
if temp$ = chr$(13) then
foundLF = 1
exit while
end if
wend
wend
'Place the returned text in to AD.talk.to.device$
AD.talk.to.device$ = buffer$
else
Notice "Improper Message Received, Must contain a command"
end if
End function
|