--- /dev/null
+\r
+Microsoft Visual Studio Solution File, Format Version 11.00\r
+# Visual Studio 2010\r
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ArduinoSerial", "ArduinoSerial\ArduinoSerial.vcxproj", "{CEF57CED-C17A-4E1C-998B-56B13896738B}"\r
+EndProject\r
+Global\r
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+ Debug|Win32 = Debug|Win32\r
+ Release|Win32 = Release|Win32\r
+ EndGlobalSection\r
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+ {CEF57CED-C17A-4E1C-998B-56B13896738B}.Debug|Win32.ActiveCfg = Debug|Win32\r
+ {CEF57CED-C17A-4E1C-998B-56B13896738B}.Debug|Win32.Build.0 = Debug|Win32\r
+ {CEF57CED-C17A-4E1C-998B-56B13896738B}.Release|Win32.ActiveCfg = Release|Win32\r
+ {CEF57CED-C17A-4E1C-998B-56B13896738B}.Release|Win32.Build.0 = Release|Win32\r
+ EndGlobalSection\r
+ GlobalSection(SolutionProperties) = preSolution\r
+ HideSolutionNode = FALSE\r
+ EndGlobalSection\r
+EndGlobal\r
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+ <ItemGroup Label="ProjectConfigurations">\r
+ <ProjectConfiguration Include="Debug|Win32">\r
+ <Configuration>Debug</Configuration>\r
+ <Platform>Win32</Platform>\r
+ </ProjectConfiguration>\r
+ <ProjectConfiguration Include="Release|Win32">\r
+ <Configuration>Release</Configuration>\r
+ <Platform>Win32</Platform>\r
+ </ProjectConfiguration>\r
+ </ItemGroup>\r
+ <PropertyGroup Label="Globals">\r
+ <ProjectGuid>{CEF57CED-C17A-4E1C-998B-56B13896738B}</ProjectGuid>\r
+ <Keyword>Win32Proj</Keyword>\r
+ <RootNamespace>ArduinoSerial</RootNamespace>\r
+ </PropertyGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">\r
+ <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+ <UseDebugLibraries>true</UseDebugLibraries>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">\r
+ <ConfigurationType>DynamicLibrary</ConfigurationType>\r
+ <UseDebugLibraries>false</UseDebugLibraries>\r
+ <WholeProgramOptimization>true</WholeProgramOptimization>\r
+ <CharacterSet>Unicode</CharacterSet>\r
+ </PropertyGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />\r
+ <ImportGroup Label="ExtensionSettings">\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />\r
+ </ImportGroup>\r
+ <PropertyGroup Label="UserMacros" />\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+ <LinkIncremental>true</LinkIncremental>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+ <LinkIncremental>false</LinkIncremental>\r
+ </PropertyGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
+ <ClCompile>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <Optimization>Disabled</Optimization>\r
+ <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;ARDUINOSERIAL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
+ <ClCompile>\r
+ <WarningLevel>Level3</WarningLevel>\r
+ <PrecompiledHeader>\r
+ </PrecompiledHeader>\r
+ <Optimization>MaxSpeed</Optimization>\r
+ <FunctionLevelLinking>true</FunctionLevelLinking>\r
+ <IntrinsicFunctions>true</IntrinsicFunctions>\r
+ <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;ARDUINOSERIAL_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>\r
+ </ClCompile>\r
+ <Link>\r
+ <SubSystem>Windows</SubSystem>\r
+ <GenerateDebugInformation>true</GenerateDebugInformation>\r
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>\r
+ <OptimizeReferences>true</OptimizeReferences>\r
+ </Link>\r
+ </ItemDefinitionGroup>\r
+ <ItemGroup>\r
+ <ClInclude Include="..\..\Serial.hpp" />\r
+ <ClInclude Include="..\..\SerialWindows.hpp" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClCompile Include="..\..\Serial.cpp" />\r
+ <ClCompile Include="..\..\SerialWindows.cpp" />\r
+ </ItemGroup>\r
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
+ <ImportGroup Label="ExtensionTargets">\r
+ </ImportGroup>\r
+</Project>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+ <ItemGroup>\r
+ <Filter Include="Source Files">\r
+ <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\r
+ <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\r
+ </Filter>\r
+ <Filter Include="Header Files">\r
+ <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\r
+ <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\r
+ </Filter>\r
+ <Filter Include="Resource Files">\r
+ <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\r
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\r
+ </Filter>\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClInclude Include="..\..\Serial.hpp">\r
+ <Filter>Header Files</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="..\..\SerialWindows.hpp">\r
+ <Filter>Header Files</Filter>\r
+ </ClInclude>\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <ClCompile Include="..\..\Serial.cpp">\r
+ <Filter>Source Files</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="..\..\SerialWindows.cpp">\r
+ <Filter>Source Files</Filter>\r
+ </ClCompile>\r
+ </ItemGroup>\r
+</Project>
\ No newline at end of file
--- /dev/null
+#include "Serial.hpp"\r
+\r
+Serial::Serial(const char *)\r
+:_connected(false)\r
+{\r
+}\r
+\r
+Serial::~Serial()\r
+{\r
+}\r
--- /dev/null
+#ifndef _SERIAL_\r
+#define _SERIAL_\r
+\r
+#define ARDUINO_WAIT_TIME 500\r
+\r
+class Serial\r
+{\r
+ public:\r
+ //Initialize Serial communication with the given COM port\r
+ __declspec(dllexport) Serial(const char *portName);\r
+\r
+ //Close the connection\r
+ //NOTA: for some reason you can't connect again before exiting\r
+ //the program and running it again\r
+ __declspec(dllexport) virtual ~Serial();\r
+\r
+ //Read data in a buffer, if nbChar is greater than the\r
+ //maximum number of bytes available, it will return only the\r
+ //bytes available. The function return -1 when nothing could\r
+ //be read, the number of bytes actually read.\r
+ __declspec(dllexport) virtual int ReadData(void *buffer, unsigned int nbChar)=0;\r
+\r
+ //Writes data from a buffer through the Serial connection\r
+ //return true on success.\r
+ __declspec(dllexport) virtual bool WriteData(void *buffer, unsigned int nbChar)=0;\r
+\r
+ //Check if we are actually connected\r
+ __declspec(dllexport) bool IsConnected() { return _connected; }\r
+\r
+ protected:\r
+ //Connection status\r
+ bool _connected;\r
+};\r
+\r
+#endif\r
--- /dev/null
+#include "SerialWindows.hpp"\r
+\r
+#include <iostream>\r
+using namespace std;\r
+
+#ifdef WIN32
+#include <windows.h>
+#endif
+\r
+SerialWindows::SerialWindows(const char *portName)\r
+:Serial(portName)\r
+{\r
+ //Try to connect to the given port throuh CreateFile\r
+ _hSerial = CreateFileA(portName,\r
+ GENERIC_READ | GENERIC_WRITE,\r
+ 0,\r
+ NULL,\r
+ OPEN_EXISTING,\r
+ FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH, //FILE_ATTRIBUTE_NORMAL,\r
+ NULL);\r
+\r
+ //Check if the connection was successfull\r
+ if(_hSerial == INVALID_HANDLE_VALUE)\r
+ {\r
+ //If not success full display an Error\r
+ if(GetLastError() == ERROR_FILE_NOT_FOUND)\r
+ cerr << "ERROR: Handle was not attached. Reason: " << portName << " not available." << endl;\r
+ else\r
+ cerr << "ERROR unknown" << endl;\r
+ char buffer[256];\r
+ sprintf(buffer, "Port %s does not exist or not reachable", portName);\r
+ throw buffer;\r
+ }\r
+ else\r
+ {\r
+ /*
+ COMMTIMEOUTS commTimeouts;
+ commTimeouts.ReadIntervalTimeout = 1;
+ commTimeouts.ReadTotalTimeoutMultiplier = 10;
+ commTimeouts.ReadTotalTimeoutConstant = 100;
+ commTimeouts.WriteTotalTimeoutMultiplier = 10;
+ commTimeouts.WriteTotalTimeoutConstant = 100;
+ if (SetCommTimeouts(_comport, &commTimeouts) == 0)
+ throw "Cannot set COM port timeouts";*/
+\r
+\r
+ //If connected we try to set the comm parameters\r
+ DCB dcbSerialParams = {0};\r
+\r
+ //Try to get the current\r
+ if (!GetCommState(_hSerial, &dcbSerialParams))\r
+ //If impossible, show an error\r
+ cerr << "ERROR: failed to get current serial parameters!" << endl;\r
+ else\r
+ {\r
+ //Define serial connection parameters for the arduino board\r
+ dcbSerialParams.BaudRate=CBR_57600;\r
+ dcbSerialParams.ByteSize=8;\r
+ dcbSerialParams.StopBits=ONESTOPBIT;\r
+ dcbSerialParams.Parity=NOPARITY;\r
+\r
+ //Set the parameters and check for their proper application\r
+ if(!SetCommState(_hSerial, &dcbSerialParams))\r
+ cerr << "ERROR: Could not set Serial Port parameters" << endl;\r
+ else\r
+ {\r
+ //If everything went fine we're connected\r
+ _connected = true;\r
+ //We wait 2s as the arduino board will be reseting\r
+ //Sleep(2000);\r
+ //SDL_Delay(ARDUINO_WAIT_TIME);\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+SerialWindows::~SerialWindows()\r
+{\r
+ //Check if we are connected before trying to disconnect\r
+ if(_connected)\r
+ {\r
+ //We're no longer connected\r
+ _connected = false;\r
+ //Close the serial handler\r
+ CloseHandle(_hSerial);\r
+ }\r
+}\r
+\r
+int SerialWindows::ReadData(void *buffer, unsigned int nbChar)\r
+{\r
+ //Number of bytes we'll have read\r
+ DWORD bytesRead = 0;\r
+ //Number of bytes we'll really ask to read\r
+ unsigned int toRead = 0;\r
+\r
+ //Use the ClearCommError function to get status info on the Serial port\r
+ ClearCommError(_hSerial, &_errors, &_status);\r
+\r
+ //Check if there is something to read\r
+ if(_status.cbInQue > 0)\r
+ {\r
+ //If there is we check if there is enough data to read the required number\r
+ //of characters, if not we'll read only the available characters to prevent\r
+ //locking of the application.\r
+ if(_status.cbInQue > nbChar)\r
+ toRead = nbChar;\r
+ else\r
+ toRead = _status.cbInQue;\r
+\r
+ //Try to read the require number of chars, and return the number of read bytes on success\r
+ if(ReadFile(_hSerial, buffer, toRead, &bytesRead, NULL) && bytesRead != 0)\r
+ return bytesRead;\r
+ }\r
+\r
+ //If nothing has been read, or that an error was detected return -1\r
+ return -1;\r
+}\r
+\r
+\r
+bool SerialWindows::WriteData(void *buffer, unsigned int nbChar)\r
+{\r
+ DWORD bytesSend;\r
+\r
+ //Try to write the buffer on the Serial port\r
+ if(!WriteFile(_hSerial, buffer, nbChar, &bytesSend, 0))\r
+ {\r
+ //In case it don't work get comm error and return false\r
+ ClearCommError(_hSerial, &_errors, &_status);\r
+\r
+ return false;\r
+ }\r
+ else\r
+ {\r
+ ClearCommError(_hSerial, &_errors, &_status);\r
+/* if(!FlushFileBuffers(_hSerial))\r
+ cout << "ERROR while flushing" << endl;*/\r
+/* stringstream s;
+ s << bytesSend << " SENT" << endl;
+ OutputDebugString(s.str().c_str());*/
+ return true;\r
+ }\r
+}\r
--- /dev/null
+#ifndef _SERIALWINDOWS_\r
+#define _SERIALWINDOWS_\r
+\r
+#include "Serial.hpp"\r
+\r
+#include <windows.h>\r
+\r
+class SerialWindows : public Serial\r
+{\r
+ public:\r
+ //Initialize Serial communication with the given COM port\r
+ __declspec(dllexport) SerialWindows(const char *portName);\r
+ //Close the connection\r
+ //NOTA: for some reason you can't connect again before exiting\r
+ //the program and running it again\r
+ __declspec(dllexport) ~SerialWindows();\r
+ //Read data in a buffer, if nbChar is greater than the\r
+ //maximum number of bytes available, it will return only the\r
+ //bytes available. The function return -1 when nothing could\r
+ //be read, the number of bytes actually read.\r
+ __declspec(dllexport) int ReadData(void *buffer, unsigned int nbChar);\r
+ //Writes data from a buffer through the Serial connection\r
+ //return true on success.\r
+ __declspec(dllexport) bool WriteData(void *buffer, unsigned int nbChar);\r
+\r
+\r
+ private:\r
+ //Serial comm handler\r
+ HANDLE _hSerial;\r
+ //Get various information about the connection\r
+ COMSTAT _status;\r
+ //Keep track of last error\r
+ DWORD _errors;\r
+};\r
+#endif\r