[メモ] Windows: VC++ シリアル通信のライブラリを使う(Serial library for C++)

## 概要
- [Serial library for C++](http://www.codeproject.com/Articles/992/Serial-library-for-C)を使って、シリアルポート通信
- ライブラリは <font color='red'>LGPL</font>、サンプルプログラムはGPL
- `Serial.lib`は Static Libで生成される => <font color='blue'>DLL</font>にすれば、自分のプログラムは、バイナリ配布可能(だよね??)。(自分のきたないコードを世に出さなくてもよい!?)

## 環境
- Visual Studio 2015u3
- [Serial library for C++](http://www.codeproject.com/Articles/992/Serial-library-for-C)

## 手順

### DLL生成
1. ダウンロード(`Serial_demo.zip`)、解凍(`Serial`フォルダ)
2. `Serial/Serial.sln` をダブルクリック。=> VC起動
3. プロジェクトファイルのアップグレード=>[OK]
![VC-Serial01.png](https://qiita-image-store.s3.amazonaws.com/0/75594/d843eb44-402e-b9f4-46d6-37e5eb649d56.png)
4. なんか聞かれるから、チェックをはずして、[OK]
![VC-Serial02.png](https://qiita-image-store.s3.amazonaws.com/0/75594/17b9b448-c0f3-c087-d0ed-5e0e25e70b55.png)
5. `Serial/Serial.h`を編集

    ```cpp:Serial/Serial.hこんな感じ
// Copyright (C) 1999-2003 Ramon de Klein
//                         (Ramon.de.Klein@ict.nl)
    
    #if DLLEXPORT_SERIAL
#define DllExport   __declspec( dllexport )
#else
#define DllExport
#endif
    
    class DllExport CSerial
{
// Class enumerations
public:
...
```

6. Solutionエクスプローラから、`Serial`で右クリ=>プロパティ
- `Static library(.lib)` から `Dynamic Library(.dll)`に変更
![VC-Serial03.png](https://qiita-image-store.s3.amazonaws.com/0/75594/e0fa6919-0463-21a3-82c5-3b5575063a33.png)

7. C/C++ > プリプロセッサで、`DLLEXPORT_SERIAL`を定義
![VC-Serial04.png](https://qiita-image-store.s3.amazonaws.com/0/75594/a0ad2460-4719-b9a2-5bfd-e6bd9de2d36e.png)

8. Solutionエクスプローラから、`Serial`で右クリ=>ビルド

    ```shell-session:こんな感じ
    $ tree ./_Output/
    ./_Output/
    └── Release
        ├── Serial.dll
        ├── Serial.exp
        ├── Serial.iobj
        ├── Serial.ipdb
        ├── Serial.lib
        └── Serial.pdb
    
    1 directory, 6 files
```


### `HelloWold`から使ってみる
1. Solutionエクスプローラから `HelloWold`**以外**を削除
2. プロパティをひらいて、`Include`(C:\VS2015\Serial\Serial)と`Library`(C:\VS2015\Serial\_Output\Release)のパスを追加
![VC-Serial05.png](https://qiita-image-store.s3.amazonaws.com/0/75594/c821702d-2c54-7f75-93c1-f5f951726a5f.png)
3. リンカーの入力に、Serial.libを追加
![VC-Serial06.png](https://qiita-image-store.s3.amazonaws.com/0/75594/8aa4ad17-18d4-2914-bc6b-41d265ca8625.png)
4. ビルド、実行
(Serial.dllLとか、exeとおなじとこおかないとだめかも)

### ライブラリの使い方

```cpp:こんな感じ。エラーハンドリングはうまくやれよ！
//ヘッダインクルード
#include "Serial.h"

//インスタンス
CSerial serial;

//COMポートオープン
// "\\\\.\\COMxx"だと、COM10以上使える
serial.Open(_T("\\\\.\\COM11"), 0, 0, false);

//シリアルの設定
serial.Setup(CSerial::EBaud38400, CSerial::EData8, CSerial::EParNone, CSerial::EStop1);

//ハンドシェイクの設定
//    EHandshakeUnknown			= -1,	// Unknown
//    EHandshakeOff				=  0,	// No handshaking
//    EHandshakeHardware		=  1,	// Hardware handshaking (RTS/CTS)
//    EHandshakeSoftware		=  2	// Software handshaking (XON/XOFF)
serial.SetupHandshaking(CSerial::EHandshakeOff);

//書き込み
//LONG CSerial::Write (const void* pData, size_t iLen, DWORD* pdwWritten, LPOVERLAPPED lpOverlapped, DWORD dwTimeout);
serial.Write(&send_buf[0], 16, &len_sent);

//読み出し
//LONG CSerial::Read (void* pData, size_t iLen, DWORD* pdwRead, LPOVERLAPPED lpOverlapped, DWORD dwTimeout)
serial.Read(&recv_buf[0], 1, &len_received);


//COMポートクローズ
serial.Close();

```