%3CLINGO-SUB%20id%3D%22lingo-sub-337762%22%20slang%3D%22en-US%22%3ESmall%20Basic%20-%20Arduino%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-337762%22%20slang%3D%22en-US%22%3E%0A%20%26lt%3Bmeta%20http-equiv%3D%22Content-Type%22%20content%3D%22text%2Fhtml%3B%20charset%3DUTF-8%22%20%2F%26gt%3B%3CSTRONG%3E%20First%20published%20on%20MSDN%20on%20Mar%2022%2C%202016%20%3C%2FSTRONG%3E%20%3CBR%20%2F%3E%3CP%3E%3CI%3E%20Authored%20by%20LitDev%20%3C%2FI%3E%3C%2FP%3E%3CBR%20%2F%3E%20%3CA%20href%3D%22https%3A%2F%2Fwww.arduino.cc%2F%22%20target%3D%22_blank%22%20rel%3D%22nofollow%20noopener%20noreferrer%20noopener%20noreferrer%22%3EArduino%20%3C%2FA%3E%20is%20a%20cheap%20and%20popular%20way%20to%20build%20your%20own%20electronics%2C%20typically%20with%20small%20sensors%20and%20motors%2C%20and%20learn%20a%20bit%20of%20programming%20to%20control%20it.%20%3CBR%20%2F%3E%20%3CBR%20%2F%3E%20Controlling%20it%20with%20Small%20Basic%20enables%20you%20to%20display%20data%20it%20generates%20or%20change%20settings%20interactively%20from%20your%20PC.%20%3CBR%20%2F%3E%20%3CBR%20%2F%3E%20%3CIMG%20src%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fimage%2Fserverpage%2Fimage-id%2F74490i972A49F68F42FA0A%22%20%2F%3E%20%3CBR%20%2F%3E%3CH2%20id%3D%22toc-hId-1676196316%22%20id%3D%22toc-hId-1846178894%22%3ESerial%20Communication%3C%2FH2%3E%3CBR%20%2F%3E%20This%20blog%20is%20not%20about%20Arduino%20features%2C%20but%20how%20to%20communicate%20with%20it%20with%20Small%20Basic%20using%20a%20serial%20port%20extension%2C%20in%20this%20case%3CCODE%3E%0A%20%20%20LDCommPort%0A%20%20%3C%2FCODE%3E%0A%20%20in%20the%0A%20%20%3CA%20href%3D%22http%3A%2F%2Flitdev.co.uk%2F%22%20target%3D%22_blank%22%20rel%3D%22nofollow%20noopener%20noreferrer%20noopener%20noreferrer%22%3E%0A%20%20%20LitDev%0A%20%20%3C%2FA%3E%0A%20%20extension%26nbsp%3B%20(see%0A%20%20%3CA%20href%3D%22http%3A%2F%2Flitdev.co.uk%2FLitDev_LDCommPort.html%22%20target%3D%22_blank%22%20rel%3D%22nofollow%20noopener%20noreferrer%20noopener%20noreferrer%22%3E%0A%20%20%20LDCommPort%20API%0A%20%20%3C%2FA%3E%0A%20%20).%26nbsp%3B%20Basically%2C%20we%20can%20send%20and%20receive%20data%20as%20bytes%20or%20strings%20to%20the%20Arduino%20via%20its%20USB%20connection.%26nbsp%3B%20I%20used%20strings%20since%20we%20can%20always%20cast%20these%20to%20anything%20else%20like%20numbers%20in%20Arduino%20and%20Small%20Basic.%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20You%20could%20use%20any%20convention%20for%20your%20data%2C%20but%20you%20will%20need%20an%20event%20(%0A%20%20%3CCODE%3E%0A%20%20%20LDCommPort.DataReceived%0A%20%20%3C%2FCODE%3E%0A%20%20)%20in%20Small%20Basic%20to%20detect%20that%20data%20has%20been%20received.%26nbsp%3B%20No%20event%20is%20required%20in%20the%20Arduino%20program%2C%20since%20it%20operates%20in%20a%20continual%20loop%2C%20you%20just%20check%20for%20new%20data%20each%20time%20the%20loop%20runs.%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CH2%20id%3D%22toc-hId--875960645%22%20id%3D%22toc-hId--705978067%22%3E%0A%20%20%20Send%20Data%20to%20Arduino%20from%20Small%20Basic%0A%20%20%3C%2FH2%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20When%20sending%20data%20to%20the%20Arduino%2C%20I%20used%20the%20first%20character%20to%20define%20the%20data%20type%3A%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CUL%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CLI%3E%0A%20%20%20%20%3CSTRONG%3E%0A%20%20%20%20%20i%0A%20%20%20%20%3C%2FSTRONG%3E%0A%20%20%20%20for%20an%20integer%0A%20%20%20%3C%2FLI%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CLI%3E%0A%20%20%20%20%3CSTRONG%3E%0A%20%20%20%20%20f%0A%20%20%20%20%3C%2FSTRONG%3E%0A%20%20%20%20for%20a%20float%0A%20%20%20%3C%2FLI%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CLI%3E%0A%20%20%20%20%3CSTRONG%3E%0A%20%20%20%20%20s%0A%20%20%20%20%3C%2FSTRONG%3E%0A%20%20%20%20for%20a%20string%0A%20%20%20%3C%2FLI%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CLI%3E%0A%20%20%20%20%3CSTRONG%3E%0A%20%20%20%20%201%0A%20%20%20%20%3C%2FSTRONG%3E%0A%20%20%20%20-%0A%20%20%20%20%3CSTRONG%3E%0A%20%20%20%20%208%0A%20%20%20%20%3C%2FSTRONG%3E%0A%20%20%20%20for%20one%20of%208%20buttons%20I%20created%20in%20the%20Small%20Basic%20interface%0A%20%20%20%3C%2FLI%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%3C%2FUL%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CH2%20id%3D%22toc-hId-866849690%22%20id%3D%22toc-hId-1036832268%22%3E%0A%20%20%20Send%20Data%20to%20Small%20Basic%20from%20Arduino%0A%20%20%3C%2FH2%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20When%20sending%20data%20from%20the%20Arduino%20to%20Small%20Basic%2C%20I%20just%20sent%20whatever%20data%20I%20wanted%20as%20an%20ascii%20string%2C%20testing%20integers%2C%20floats%2C%20strings%20and%20characters.%26nbsp%3B%20I%20used%20a%20line-feed%20character%20'%5Cn'%20(ascii%20code%2010)%20to%20terminate%20all%20data%20for%20transfer.%26nbsp%3B%20This%20is%20automatically%20added%20by%20the%20Arduino%20command%0A%20%20%3CCODE%3E%0A%20%20%20Serial.println%0A%20%20%3C%2FCODE%3E%0A%20%20%2C%20but%20not%20by%0A%20%20%3CCODE%3E%0A%20%20%20Serial.print%0A%20%20%3C%2FCODE%3E%0A%20%20.%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CH2%20id%3D%22toc-hId--1685307271%22%20id%3D%22toc-hId--1515324693%22%3E%0A%20%20%20Arduino%20Settings%0A%20%20%3C%2FH2%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20The%20following%20are%20the%20Arduino%20settings%20I%20used%20for%20an%20Arduino%20UNO%2C%20note%20it%20uses%20COM3%20(yours%20may%20be%20different)%20port%20and%20ArduinoISP%20programmer.%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CIMG%20src%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fimage%2Fserverpage%2Fimage-id%2F74491iF6C9E718DADED979%22%20%2F%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CH2%20id%3D%22toc-hId-57503064%22%20id%3D%22toc-hId-227485642%22%3E%0A%20%20%20Small%20Basic%20Interface%0A%20%20%3C%2FH2%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20This%20is%20the%20Small%20Basic%20interface%2C%20import%0A%20%20%3CSTRONG%3E%0A%20%20%20VBZ059%0A%20%20%3C%2FSTRONG%3E%0A%20%20.%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CIMG%20src%3D%22https%3A%2F%2Ftechcommunity.microsoft.com%2Ft5%2Fimage%2Fserverpage%2Fimage-id%2F74492i50E61173832E518F%22%20%2F%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20The%20Small%20Basic%20code%20for%20this%20interface%20is%20a%20bit%20longer%20than%20it%20could%20be%2C%20most%20of%20it%20is%20just%20creating%20the%20interface%20and%20button%20events.%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20Initialise()%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20'%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20'%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20'MAIN%20LOOP%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20'%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20'%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20While%20(%22True%22)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20If%20(newData%20%26lt%3B%26gt%3B%20%22%22)%20Then%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20tbData%20%3D%20Text.Append(%22Data%20received%20%3A%20%22%2BnewData%2Bnl%2CControls.GetTextBoxText(tb))%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20Controls.SetTextBoxText(tb%2CtbData)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20newData%20%3D%20%22%22%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20EndIf%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20Program.Delay(10)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20EndWhile%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20'%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20'%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20'SUBROUTINES%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20'%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20'%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20Sub%20Initialise%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20gw%20%3D%20600%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20gh%20%3D%20215%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20GraphicsWindow.Width%20%3D%20gw%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20GraphicsWindow.Height%20%3D%20gh%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20GraphicsWindow.Title%20%3D%20%22Small%20Basic%20Arduino%20Interface%22%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20GraphicsWindow.BackgroundColor%20%3D%20%22Gray%22%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20GraphicsWindow.BrushColor%20%3D%20%22Black%22%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20nl%20%3D%20Text.GetCharacter(10)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20'%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20status%20%3D%20LDCommPort.OpenPort(%22COM3%22%2C9600)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20LDCommPort.SetEncoding(%22Ascii%22)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20LDCommPort.DataReceived%20%3D%20OnDataReceived%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20'%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20nButton%20%3D%208%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20spacing%20%3D%20(gw-30)%2FnButton%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20width%20%3D%20(gw-40)%2FnButton-10%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20For%20i%20%3D%201%20To%20nButton%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20buttons%5Bi%5D%20%3D%20Controls.AddButton(%22Action%22%2Bi%2C20%2Bspacing*(i-1)%2C175)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20Controls.SetSize(buttons%5Bi%5D%2Cwidth%2C25)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20LDShapes.BrushColour(buttons%5Bi%5D%2C%22SteelBlue%22)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20EndFor%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20Controls.ButtonClicked%20%3D%20OnButtonClicked%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20'%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20clear%20%3D%20Controls.AddButton(%22Clear%22%2C20%2C20)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20Controls.SetSize(clear%2Cwidth%2C25)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20LDShapes.BrushColour(clear%2C%22SteelBlue%22)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20'%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20send%20%3D%20Controls.AddButton(%22Send%22%2C20%2Bspacing%2C20)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20Controls.SetSize(send%2Cwidth%2C25)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20LDShapes.BrushColour(send%2C%22SteelBlue%22)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20'%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20value%20%3D%20Controls.AddTextBox(20%2B2*spacing%2C20)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20Controls.SetSize(value%2Cgw-2*spacing-40%2C25)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20LDShapes.PenColour(value%2C%22White%22)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20LDShapes.BrushColour(value%2C%22DimGray%22)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20'%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20tb%20%3D%20Controls.AddMultiLineTextBox(20%2C60)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20Controls.SetTextBoxText(tb%2C%22Connection%20status%20%3A%20%22%2Bstatus)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20Controls.SetSize(tb%2Cgw-40%2C100)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20LDShapes.PenColour(tb%2C%22White%22)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20LDShapes.BrushColour(tb%2C%22DimGray%22)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20EndSub%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20'%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20'%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20'EVENT%20SUBROUTINES%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20'%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20'%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20Sub%20OnDataReceived%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20dataIn%20%3D%20Text.Append(dataIn%2CLDCommPort.RXAll())%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20If%20(Text.IsSubText(dataIn%2Cnl))%20Then%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20newData%20%3D%20LDText.Trim(dataIn)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20dataIn%20%3D%20%22%22%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20EndIf%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20EndSub%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20'%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20Sub%20OnButtonClicked%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20button%20%3D%20Controls.LastClickedButton%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20If%20(button%20%3D%20clear)%20Then%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20tbData%20%3D%20%22%22%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20ElseIf%20(button%20%3D%20send)%20Then%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20val%20%3D%20Controls.GetTextBoxText(value)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20If%20(val%20%3D%20Math.Round(val))%20Then%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20tbData%20%3D%20Text.Append(%22***%20%22%2Bval%2B%22%20sent%20as%20integer%20***%22%2Bnl%2CControls.GetTextBoxText(tb))%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20val%20%3D%20%22i%22%2Bval%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20ElseIf%20(val%2B0%20%3D%20val)%20Then%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20tbData%20%3D%20Text.Append(%22***%20%22%2Bval%2B%22%20sent%20as%20float%20***%22%2Bnl%2CControls.GetTextBoxText(tb))%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20val%20%3D%20%22f%22%2Bval%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20ElseIf%20(val%20%26lt%3B%26gt%3B%20%22%22)%20Then%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20tbData%20%3D%20Text.Append(%22***%20%22%2Bval%2B%22%20sent%20as%20string%20***%22%2Bnl%2CControls.GetTextBoxText(tb))%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20val%20%3D%20%22s%22%2Bval%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20Else%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20tbData%20%3D%20Text.Append(%22***%20Nothing%20sent%20***%22%2Bnl%2CControls.GetTextBoxText(tb))%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20EndIf%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20If%20(val%20%26lt%3B%26gt%3B%20%22%22)%20Then%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20LDCommPort.TXString(val)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20EndIf%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20Else%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20For%20i%20%3D%201%20To%20nButton%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20If%20(button%20%3D%20buttons%5Bi%5D)%20Then%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20tbData%20%3D%20Text.Append(%22***%20Action%20%22%2Bi%2B%22%20instruction%20sent%20***%22%2Bnl%2CControls.GetTextBoxText(tb))%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20LDCommPort.TXString(i)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20EndIf%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20EndFor%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20EndIf%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20Controls.SetTextBoxText(tb%2CtbData)%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%20%3CDIV%3E%0A%20%20%20%20EndSub%0A%20%20%20%3C%2FDIV%3E%0A%20%20%20%3CBR%20%2F%3E%0A%20%20%3C%2FDIV%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CH2%20id%3D%22toc-hId-1800313399%22%20id%3D%22toc-hId-1970295977%22%3E%0A%20%20%20Arduino%20Code%0A%20%20%3C%2FH2%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20The%20Arduino%20code%20is%20similar%20to%20C%2B%2B%2C%20and%20there%20are%20lots%20of%20samples%20for%20all%20sorts%20of%20electronic%20projects%20out%20there.%26nbsp%3B%20It%20is%20compiled%20and%20sent%20to%20the%20Arduino%20using%20a%20special%20Arduino%20IDE.%26nbsp%3B%20My%20sample%20below%20is%20just%20testing%20the%20serial%20communication%2C%20with%20no%20electronics%20at%20all.%26nbsp%3B%20It%20could%20be%20shorter%20if%20you%20just%20wanted%20to%20send%20data%20to%20Small%20Basic%20or%20only%20have%20a%20couple%20buttons%20(code%20size%20is%20quite%20limited%20on%20Arduino)%2C%20but%20I%20wanted%20to%20test%20various%20data%20types%20in%20the%20communication.%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20The%0A%20%20%3CCODE%3E%0A%20%20%20Serial.begin(9600)%0A%20%20%3C%2FCODE%3E%0A%20%20sets%20the%20serial%20communication%20speed%2C%20also%20set%20in%20Small%20Basic%2C%0A%20%20%3CCODE%3E%0A%20%20%20LDCommPort.OpenPort(%22COM3%22%2C9600)%0A%20%20%3C%2FCODE%3E%0A%20%20.%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20The%0A%20%20%3CCODE%3E%0A%20%20%20Serial.setTimeout(10)%0A%20%20%3C%2FCODE%3E%0A%20%20prevents%20partial%20data%20from%20being%20used%2C%20you%20may%20need%20to%20change%20this.%26nbsp%3B%20If%20you%20are%20reading%20bytes%20consider%20using%0A%20%20%3CCODE%3E%0A%20%20%20Serial.available()%0A%20%20%3C%2FCODE%3E%0A%20%20in%20a%0A%20%20%3CCODE%3E%0A%20%20%20while%0A%20%20%3C%2FCODE%3E%0A%20%20loop%20to%20read%20all%20available%20bytes.%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20char%20cInput%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20int%20iInput%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20float%20fInput%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20String%20sInput%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20void%20setup()%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20%7B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20Serial.begin(9600)%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20Serial.setTimeout(10)%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20%7D%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20void%20loop()%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20%7B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20Input()%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20delay(10)%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20%7D%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20void%20Input()%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20%7B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20sInput%20%3D%20Serial.readString()%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20cInput%20%3D%20'0'%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20if%20(sInput.length()%20%26gt%3B%200)%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20%7B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20cInput%20%3D%20sInput.charAt(0)%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20switch%20(cInput)%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20%7B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20case%20'i'%3A%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20iInput%20%3D%20sInput.substring(1).toInt()%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20Serial.println(iInput)%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20break%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20case%20'f'%3A%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20fInput%20%3D%20sInput.substring(1).toFloat()%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20Serial.println(fInput)%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20break%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20case%20's'%3A%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20sInput%20%3D%20sInput.substring(1)%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20Serial.println(sInput)%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20break%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20case%20'1'%3A%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20fInput%20%3D%203.14%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20Serial.println(fInput)%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20break%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20case%20'2'%3A%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20iInput%20%3D%20random(256)%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20Serial.println(iInput)%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20break%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20case%20'3'%3A%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20Serial.println(%22A%20text%20result%22)%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20break%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20case%20'4'%3A%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20Serial.print('A')%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20Serial.print('B')%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20Serial.println('C')%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20break%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20default%3A%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20Serial.println(%22Error%22)%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20break%3B%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20%7D%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20%7D%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CCODE%3E%0A%20%20%20%7D%0A%20%20%3C%2FCODE%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20%3CBR%20%2F%3E%0A%20%20Enjoy%20playing%20with%20Small%20Basic%20and%20Arduino.%0A%20%0A%3C%2FLINGO-BODY%3E%3CLINGO-TEASER%20id%3D%22lingo-teaser-337762%22%20slang%3D%22en-US%22%3EFirst%20published%20on%20MSDN%20on%20Mar%2022%2C%202016%20Authored%20by%20LitDevArduino%20is%20a%20cheap%20and%20popular%20way%20to%20build%20your%20own%20electronics%2C%20typically%20with%20small%20sensors%20and%20motors%2C%20and%20learn%20a%20bit%20of%20programming%20to%20control%20it.%3C%2FLINGO-TEASER%3E
Microsoft
First published on MSDN on Mar 22, 2016

Authored by LitDev


Arduino is a cheap and popular way to build your own electronics, typically with small sensors and motors, and learn a bit of programming to control it.

Controlling it with Small Basic enables you to display data it generates or change settings interactively from your PC.


Serial Communication


This blog is not about Arduino features, but how to communicate with it with Small Basic using a serial port extension, in this case LDCommPort in the LitDev extension  (see LDCommPort API ).  Basically, we can send and receive data as bytes or strings to the Arduino via its USB connection.  I used strings since we can always cast these to anything else like numbers in Arduino and Small Basic.

You could use any convention for your data, but you will need an event ( LDCommPort.DataReceived ) in Small Basic to detect that data has been received.  No event is required in the Arduino program, since it operates in a continual loop, you just check for new data each time the loop runs.

Send Data to Arduino from Small Basic


When sending data to the Arduino, I used the first character to define the data type:

  • i for an integer

  • f for a float

  • s for a string

  • 1 - 8 for one of 8 buttons I created in the Small Basic interface


Send Data to Small Basic from Arduino


When sending data from the Arduino to Small Basic, I just sent whatever data I wanted as an ascii string, testing integers, floats, strings and characters.  I used a line-feed character '\n' (ascii code 10) to terminate all data for transfer.  This is automatically added by the Arduino command Serial.println , but not by Serial.print .

Arduino Settings


The following are the Arduino settings I used for an Arduino UNO, note it uses COM3 (yours may be different) port and ArduinoISP programmer.


Small Basic Interface


This is the Small Basic interface, import VBZ059 .



The Small Basic code for this interface is a bit longer than it could be, most of it is just creating the interface and button events.

Initialise()

'

'==================================================

'MAIN LOOP

'==================================================

'

While ("True")

If (newData <> "") Then

tbData = Text.Append("Data received : "+newData+nl,Controls.GetTextBoxText(tb))

Controls.SetTextBoxText(tb,tbData)

newData = ""

EndIf

Program.Delay(10)

EndWhile

'

'==================================================

'SUBROUTINES

'==================================================

'

Sub Initialise

gw = 600

gh = 215

GraphicsWindow.Width = gw

GraphicsWindow.Height = gh

GraphicsWindow.Title = "Small Basic Arduino Interface"

GraphicsWindow.BackgroundColor = "Gray"

GraphicsWindow.BrushColor = "Black"

nl = Text.GetCharacter(10)

'

status = LDCommPort.OpenPort("COM3",9600)

LDCommPort.SetEncoding("Ascii")

LDCommPort.DataReceived = OnDataReceived

'

nButton = 8

spacing = (gw-30)/nButton

width = (gw-40)/nButton-10

For i = 1 To nButton

buttons[i] = Controls.AddButton("Action"+i,20+spacing*(i-1),175)

Controls.SetSize(buttons[i],width,25)

LDShapes.BrushColour(buttons[i],"SteelBlue")

EndFor

Controls.ButtonClicked = OnButtonClicked

'

clear = Controls.AddButton("Clear",20,20)

Controls.SetSize(clear,width,25)

LDShapes.BrushColour(clear,"SteelBlue")

'

send = Controls.AddButton("Send",20+spacing,20)

Controls.SetSize(send,width,25)

LDShapes.BrushColour(send,"SteelBlue")

'

value = Controls.AddTextBox(20+2*spacing,20)

Controls.SetSize(value,gw-2*spacing-40,25)

LDShapes.PenColour(value,"White")

LDShapes.BrushColour(value,"DimGray")

'

tb = Controls.AddMultiLineTextBox(20,60)

Controls.SetTextBoxText(tb,"Connection status : "+status)

Controls.SetSize(tb,gw-40,100)

LDShapes.PenColour(tb,"White")

LDShapes.BrushColour(tb,"DimGray")

EndSub

'

'==================================================

'EVENT SUBROUTINES

'==================================================

'

Sub OnDataReceived

dataIn = Text.Append(dataIn,LDCommPort.RXAll())

If (Text.IsSubText(dataIn,nl)) Then

newData = LDText.Trim(dataIn)

dataIn = ""

EndIf

EndSub

'

Sub OnButtonClicked

button = Controls.LastClickedButton

If (button = clear) Then

tbData = ""

ElseIf (button = send) Then

val = Controls.GetTextBoxText(value)

If (val = Math.Round(val)) Then

tbData = Text.Append("*** "+val+" sent as integer ***"+nl,Controls.GetTextBoxText(tb))

val = "i"+val

ElseIf (val+0 = val) Then

tbData = Text.Append("*** "+val+" sent as float ***"+nl,Controls.GetTextBoxText(tb))

val = "f"+val

ElseIf (val <> "") Then

tbData = Text.Append("*** "+val+" sent as string ***"+nl,Controls.GetTextBoxText(tb))

val = "s"+val

Else

tbData = Text.Append("*** Nothing sent ***"+nl,Controls.GetTextBoxText(tb))

EndIf

If (val <> "") Then

LDCommPort.TXString(val)

EndIf

Else

For i = 1 To nButton

If (button = buttons[i]) Then

tbData = Text.Append("*** Action "+i+" instruction sent ***"+nl,Controls.GetTextBoxText(tb))

LDCommPort.TXString(i)

EndIf

EndFor

EndIf

Controls.SetTextBoxText(tb,tbData)

EndSub


Arduino Code


The Arduino code is similar to C++, and there are lots of samples for all sorts of electronic projects out there.  It is compiled and sent to the Arduino using a special Arduino IDE.  My sample below is just testing the serial communication, with no electronics at all.  It could be shorter if you just wanted to send data to Small Basic or only have a couple buttons (code size is quite limited on Arduino), but I wanted to test various data types in the communication.

The Serial.begin(9600) sets the serial communication speed, also set in Small Basic, LDCommPort.OpenPort("COM3",9600) .

The Serial.setTimeout(10) prevents partial data from being used, you may need to change this.  If you are reading bytes consider using Serial.available() in a while loop to read all available bytes.

char cInput;
int iInput;
float fInput;
String sInput;

void setup()
{
Serial.begin(9600);
Serial.setTimeout(10);
}

void loop()
{
Input();
delay(10);
}

void Input()
{
sInput = Serial.readString();
cInput = '0';
if (sInput.length() > 0)
{
cInput = sInput.charAt(0);
switch (cInput)
{
case 'i':
iInput = sInput.substring(1).toInt();
Serial.println(iInput);
break;
case 'f':
fInput = sInput.substring(1).toFloat();
Serial.println(fInput);
break;
case 's':
sInput = sInput.substring(1);
Serial.println(sInput);
break;
case '1':
fInput = 3.14;
Serial.println(fInput);
break;
case '2':
iInput = random(256);
Serial.println(iInput);
break;
case '3':
Serial.println("A text result");
break;
case '4':
Serial.print('A');
Serial.print('B');
Serial.println('C');
break;
default:
Serial.println("Error");
break;
}
}
}

Enjoy playing with Small Basic and Arduino.