概要
- Serial library for C++を使って、シリアルポート通信
- ライブラリは LGPL、サンプルプログラムはGPL
-
Serial.lib
は Static Libで生成される => DLLにすれば、自分のプログラムは、バイナリ配布可能(だよね??)。(自分のきたないコードを世に出さなくてもよい!?)
環境
- Visual Studio 2015u3
- Serial library for C++
手順
DLL生成
-
ダウンロード(
Serial_demo.zip
)、解凍(Serial
フォルダ) -
Serial/Serial.sln
をダブルクリック。=> VC起動 -
Serial/Serial.h
を編集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
から使ってみる
- Solutionエクスプローラから
HelloWold
以外を削除 - プロパティをひらいて、
Include
(C:\VS2015\Serial\Serial)とLibrary
(C:\VS2015\Serial_Output\Release)のパスを追加
- リンカーの入力に、Serial.libを追加
- ビルド、実行
(Serial.dllLとか、exeとおなじとこおかないとだめかも)
ライブラリの使い方
こんな感じ。エラーハンドリングはうまくやれよ!
//ヘッダインクルード
#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();