Arduino serial library
authorThomas Pietrzak <thomas.pietrzak@gmail.com>
Wed, 15 Feb 2012 13:41:58 +0000 (13:41 +0000)
committerThomas Pietrzak <thomas.pietrzak@gmail.com>
Wed, 15 Feb 2012 13:41:58 +0000 (13:41 +0000)
git-svn-id: svn+ssh://thomaspietrzak.com/var/svn/rep@46 47cf9a05-e0a8-4ed5-9e9b-101a649bc004

ArduinoSerial/ArduinoSerial.sln [new file with mode: 0644]
ArduinoSerial/ArduinoSerial.suo [new file with mode: 0644]
ArduinoSerial/ArduinoSerial/ArduinoSerial.vcxproj [new file with mode: 0644]
ArduinoSerial/ArduinoSerial/ArduinoSerial.vcxproj.filters [new file with mode: 0644]
Serial.cpp [new file with mode: 0644]
Serial.hpp [new file with mode: 0644]
SerialWindows.cpp [new file with mode: 0644]
SerialWindows.hpp [new file with mode: 0644]

diff --git a/ArduinoSerial/ArduinoSerial.sln b/ArduinoSerial/ArduinoSerial.sln
new file mode 100644 (file)
index 0000000..3c947c0
--- /dev/null
@@ -0,0 +1,20 @@
+\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
diff --git a/ArduinoSerial/ArduinoSerial.suo b/ArduinoSerial/ArduinoSerial.suo
new file mode 100644 (file)
index 0000000..71bf454
Binary files /dev/null and b/ArduinoSerial/ArduinoSerial.suo differ
diff --git a/ArduinoSerial/ArduinoSerial/ArduinoSerial.vcxproj b/ArduinoSerial/ArduinoSerial/ArduinoSerial.vcxproj
new file mode 100644 (file)
index 0000000..588b847
--- /dev/null
@@ -0,0 +1,87 @@
+<?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
diff --git a/ArduinoSerial/ArduinoSerial/ArduinoSerial.vcxproj.filters b/ArduinoSerial/ArduinoSerial/ArduinoSerial.vcxproj.filters
new file mode 100644 (file)
index 0000000..c4a1bfe
--- /dev/null
@@ -0,0 +1,33 @@
+<?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
diff --git a/Serial.cpp b/Serial.cpp
new file mode 100644 (file)
index 0000000..6474450
--- /dev/null
@@ -0,0 +1,10 @@
+#include "Serial.hpp"\r
+\r
+Serial::Serial(const char *)\r
+:_connected(false)\r
+{\r
+}\r
+\r
+Serial::~Serial()\r
+{\r
+}\r
diff --git a/Serial.hpp b/Serial.hpp
new file mode 100644 (file)
index 0000000..da69a33
--- /dev/null
@@ -0,0 +1,35 @@
+#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
diff --git a/SerialWindows.cpp b/SerialWindows.cpp
new file mode 100644 (file)
index 0000000..04a27ad
--- /dev/null
@@ -0,0 +1,142 @@
+#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
diff --git a/SerialWindows.hpp b/SerialWindows.hpp
new file mode 100644 (file)
index 0000000..0d2b112
--- /dev/null
@@ -0,0 +1,35 @@
+#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