2015年9月6日日曜日

【なでしこ】なでしこプログラミングコンテスト2015→結果発表

「なでしこ10周年記念コンテストの結果発表」


と、いうことで結果が発表されたんですが、残念ながらかすりもせず(^^;。
ま、いつものことながら突貫で作ったので当然と言えば当然。大賞を
取られた方、おめでとうございます。

で、何を応募したかと言うと→これ

「実用」ってことで、DLL(プラグイン)を作って、なでしこの命令セットが
弱い部分である「バイナリでのバッファ、ファイル、通信操作」をまとめて
みたんだけど、まあ組み込みでもやってない限りあまり実用的ではなかった
かなあ。

以前、組み込み用基板のシリアルポートテストをしようと思って
なでしこでアプリを書き始めた際、

・バッファの確保のし方が良くわからない
・確保したバッファにファイルからロードするには…
・バッファの内容をファイルに書き出すには…
・そもそもバッファの内容をシリアルで送信するときに、なでしこの
 命令ではうまくバイナリファイルを送信出来ない

などなど問題があったのがきっかけ。TCP/UDPあたりはオマケだけど
組み込み系でやりたい一応のことは出来すハズ。ホントはフレーム
処理なんかも入れたら良かったのかもなあ。

なでしこやその他のスクリプト言語もそうだけど、大体は文字列処理
とかに重きが置かれていて、それ故HTTPなどの文字列型プロトコル
とは相性がいいけど、バイナリデータ/ファイルを扱うのは結構大変
なんだよね(連続的なメモリ空間をデータ用に確保して、そのデータ
を固定長/可変長のフレームとして扱うのが難しい)

今回用意したプラグインに含まれる命令はこちら↓

■バイナリ操作・通信用プラグイン(nako_comm.dll Ver 1.0.0) 2015/06/28

【名前  】UNOパパ
【メール 】unoahpapaあgmail.com
【職業  】会社員
【使用 Ver】なでしこ Ver1.539
【使い方 】
  同梱のnako_comm.dllをなでしこの\plug-insフォルダにコピーしてください。

【ポイント】
    組み込みなどのボードを使用する場合、PC側からの操作はシリアルであったり
    TCP・UDP/IP通信であったりしますが、その通信内容はバイナリデータ通信
    です。今回準備した命令群を使用すれば、バイナリファイル・データ操作や
    シリアル、IP通信などがひと通り行えます。
 
    これらを使用して、なでしこの使用可能分野が広がれば幸いです。

【概要  】
    なでしこではバイナリデータを扱うための命令が揃ってない様でしたので
    プラグインとして用意してみました。基本的にはC言語でできることを
    幾つかなでしこの命令として作りこんでます。以下の操作を実施できます。

 ◇ハンドル
    ・ハンドルタイプ取得
    ・ハンドル解放

  ◇バイト操作
    ・バイト初期化
    ・バイト代入
    ・バイトエンディアン変換
    ・バイト数値取得

  ◇ビット操作
    ・ビットチェック
    ・ビットセット
    ・ビットクリア
    ・ビットXOR
    ・ビット右シフト
    ・ビット左シフト

  ◇バッファ操作
    ・バッファ初期化
    ・バッファクリア
    ・バッファコピー
    ・バッファ追加コピー
    ・バッファ読込
    ・バッファダンプ
    ・バッファ書込
    ・バッファバイト読込
    ・バッファバイト書込
    ・バッファ比較
    ・バッファサイズ取得
    ・メモリ使用サイズ取得

  ◇バイナリファイル操作
    ・Bファイルオープン
    ・Bファイル読込
    ・Bファイル書込
    ・Bファイルシーク
    ・Bファイル位置取得

  ◇ソケット通信
    ・ソケットハンドル取得
    ・ソケットオープン
    ・ソケット接続待ち
    ・ソケットデータ送信
    ・ソケットデータ受信
    ・ソケット受信確認

  ◇シリアル通信
    ・シリアルオープン
    ・シリアルデータ送信
    ・シリアルデータ受信
    ・シリアルデータサイズ取得

○ハンドルについて
 バイト、バッファ、ファイル、ソケット、シリアルポートなどは初期化
  (オープン)した場合にハンドルを返す様になってます。例えばバッファ
  はその実体はプラグイン中でmalloc()したポインタを管理しており、
  その管理構造体のINDEX(整数)を返していると思ってください。

  ハンドルは全部で1024個確保することが可能で、使用後は必ず解放する
  必要があります(「ハンドル解放」命令を使用)。このプラグインで
  確保できるメモリなどは、すべてグローバルに置かれていて、なでしこの
  命令のスコープから見ても常にグローバルです。したがって、なでしこの
  関数内でコールした場合でも、必ず解放しなければ、関数終了後もプラグイン
  中に実体が残っていることに注意してください。

○バイト/ビット操作について
 バイト操作は1、2、4バイトの大きさのデータを取り扱います。バッファと
  してこれらの大きさのメモリ領域を確保しても同じですが、その場合は
  ビット操作等が行えません。ビット操作は、「バイト初期化」で得られた
  バイトハンドルに対してのみ行なえます。

  バイト初期化した2byte, 4byteのデータはリトルエンディアンでメモリ
  上に配置されます。ビッグエンディアンにしたい場合には、
  「バイトエンディアン変換」命令でバイトオーダーを変更出来ます。
  再度この命令をコールするとリトルエンディアンに戻ります。

  「バッファバイト読込」「バッファバイト書込」を使用すれば、バッファの
  任意の位置からバイトデータを切り出したり、書き込んだりすることが
  可能です。

  バイト初期化で指定したバイト数は「メモリ使用サイズ取得」命令で取得
  することが出来ます。この命令はバッファに対していも有効です。

○バッファについて
 「バッファ初期化」命令でサイズを指定してハンドルを取得することが
  出来ます。内部ではmalloc()してます。初期化直後はメモリはAll 0で
  クリアされます。別の値でクリアした場合は「バッファクリア」命令を
  実施してください。

  「バッファ読込」命令を指定すると、バッファの内容を文字列で取得
  出来ます。「00 00 00 00 00 00...」の様に16進数を半角スペースで
  区切った形式で出力されます。「バッファダンプ」命令も同様ですが
  こちらの場合は16個ごとに改行が挿入されます。

  この形式の文字列を「バッファ書込」命令を使用して、バッファにバイナリ
  データとして書き込むことも出来ます。但し、いずれの場合も取り扱える
  バイナリデータサイズは1024 byteとなっています。

○ファイルについて
 なでしこのファイル操作命令は文字列がメインで、バイナリデータを
  バッファに取り込んでごにゅごにょ…のやり方が不明だったので、
  命令群を追加しました。

  ファイルの読み書きに使うデータはバッファハンドルを使ってバイナリ
  データをやりとりします。バイナリデータ、と書いてますが、テキスト
  もバイナリデータの一種ですので、テキストファイルでもオープン出来
  ます(改行コードやタブコードもそもままバッファに読み込まれます)

○ソケット通信について
 ソケットはいわゆるBSDのsocket()系の関数を使用しています。TCP/UDP
  の通信が可能です。UDPについてはマルチキャストとブロードキャストには
  対応してません。また使用できるアドレスはIPv4アドレスのみとなります。
  (IPv6には現在非対応)。

  通信する場合は実際はselect()を別スレッドで回して…としても良かった
  のですが、内部でスレッドは作らない方針としましたので、
  「ソケット受信確認」命令でデータの受信、及びTCPサーバ時の接続を
  待つ(チェックする)ことが出来ます。この命令はチェックだけして
  すぐに抜けてくる一方、TCPサーバ時の「ソケット接続待ち」命令、
  及びTCP/UDP時の「ソケットデータ受信」はブロック命令です(受信が
  あるまでそのプロセスは待ち状態になります)。「ソケット受信確認」で
  受信があった場合はそれぞれのブロック命令を実施するのが良いでしょう。

 送信、受信のデータ格納には上記のバッファハンドルを使用します。

○シリアル通信
 普通のシリアル通信ですが、なでしこのnakors232c.dllは昔バイナリデータの
  送受信が上手く行かなかった記憶があったので追加しました(今は上手く行く
  のかもしれません)。

  データ受信の際は「シリアルデータサイズ取得」命令でWindowsのシリアル
  ドライバが持っているバッファ(これはこのDLLのバッファとは別物)に
  溜まっているデータサイズを確認出来ます。これが1以上の場合に
  「シリアルデータ受信」命令で受信するようにすると良いでしょう。

  こちらもソケット通信同様、送信、受信のデータ格納には上記のバッファ
  ハンドルを使用します。

○命令詳細

[int:]→整数
[str:]→文字列

---------------------------------------------------------------------------------------------------
【名前】バイト初期化
【書式】[int:数値]を [int:サイズ]で バイト初期化
【戻値】[int:バイトハンドル]
【説明】
    指定した数値をサイズ分のバイトデータとしてハンドルを
    確保する。値はリトルエンディアンでメモリ上に書き込まれる。
 
    サイズには1,2,4のいずれかを指定する。
 
    成功した場合には0以上のハンドル値が、失敗した場合は-1が
    返される。
---------------------------------------------------------------------------------------------------
【名前】バイト代入
【書式】[int:バイトハンドル]へ [int:数値]を [int:サイズ]で バイト代入
【戻値】[int:結果]
【説明】
    指定した数値をサイズ分のバイトデータとしてハンドルに代入する。
 
    サイズには1,2,4のいずれかを指定する。

    成功した場合0が、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】バイトエンディアン変換
【書式】[int:バイトハンドル]を バイトエンディアン変換
【戻値】[int:結果]
【説明】
    指定のハンドルが保持している値のエンディアンを変換する。
 
    成功した場合は0が、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】バイト数値取得
【書式】[int:バイトハンドル]の バイト数値取得
【戻値】[int:数値]
【説明】
    ハンドルの現在の値を取得する。数値で取得する場合は現在メモリ上に
    あるバイト列をリトルエンディアンとみなして取得する。
 
    成功した場合は数値が、失敗した場合は0が返される。(数値が0の
    場合も0が返される)。
---------------------------------------------------------------------------------------------------
【名前】ビットチェック
【書式】[int:バイトハンドルA]を [int:バイトハンドルB]で ビットチェック
【戻値】[int:結果]
【説明】
    バイトハンドルAの中にバイトハンドルBのビットパターンが
    含まれているかどうかをチェックする。

    含まれている場合は1、含まれていない場合は0が返される。
    エラーがあった場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】ビットセット
【書式】[int:バイトハンドルA]へ [int:バイトハンドルB]を ビットセット
【戻値】[int:結果]
【説明】
    バイトハンドルAに対して、バイトハンドルBのビットパターンを
    セットする。AとBの論理和をとった結果がAに代入される。

    成功した場合は0、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】ビットクリア
【書式】[int:バイトハンドルA]を [int:バイトハンドルB]で ビットクリア
【戻値】[int:結果]
【説明】
    バイトハンドルAに対して、バイトハンドルBのビットパターンを
    クリアする。AとBのビットを反転した値の論理積の結果がAに代入
    される。

    成功した場合は0、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】ビットXOR
【書式】[int:バイトハンドルA]を [int:バイトハンドルB]で ビットXOR
【戻値】[int:結果]
【説明】
    バイトハンドルAと、バイトハンドルBのビットパターンの
    排他的論理和をとった結果がAに代入される。

    成功した場合は0、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】ビット右シフト
【書式】[int:バイトハンドル]を [int:ビット数]だけ ビット右シフト
【戻値】[int:結果]
【説明】
    バイトハンドル中の値をビット数だけ右にビットシフトして、元の
    バイトハンドルに反映する。

    バイトハンドルはメモリ上のバイト配列をリトルエンディアンと
    してシフト操作を実施する。

    成功した場合は0、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】ビット左シフト
【書式】[int:バイトハンドル]を [int:ビット数]だけ ビット左シフト
【戻値】[int:結果]
【説明】
    バイトハンドル中の値をビット数だけ左にビットシフトして、元の
    バイトハンドルに反映する。

    バイトハンドルはメモリ上のバイト配列をリトルエンディアンと
    してシフト操作を実施する。

    成功した場合は0、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】バッファ初期化
【書式】[int:サイズ]で バッファ初期化
【戻値】[int:バッファハンドル]
【説明】
    メモリを動的に確保して、そのハンドルを返す。成功した場合、
    0以上のハンドル値が、失敗した場合には-1が返される。

    なお、メモリは動的に確保されているので、使用後はかならず
    ハンドル解放を実施すること。

    初期化後はすべての領域が0で初期化され、使用サイズ=サイズ
    となる。
---------------------------------------------------------------------------------------------------
【名前】バッファクリア
【書式】[int:バッファハンドル]を [int:クリア値]で バッファクリア
【戻値】[int:結果]
【説明】
    バッファ初期化命令で取得したハンドルの領域をクリア値を用いて
    クリアする。クリア値には0から255($00~$FF)までの1byte値を
    指定する。

    成功した場合は0が、無効なハンドル、クリア値を指定した場合は
    -1が返される。
---------------------------------------------------------------------------------------------------
【名前】バッファコピー
【書式】[int:元バッファハンドル]の [int:オフセット]から [int:サイズ]を [int:先バッファハンドル]へ バッファコピー
【戻値】[int:サイズ]
【説明】
    元ハンドルのオフセット位置からサイズ分のデータを、先ハンドル
    (の先頭)へコピーする。コピーした場合、先ハンドルの使用サイズは
    本命令でコピー出来たサイズとなる。
 
    成功した場合はコピーサイズが、無効なハンドルを指定した場合
    には-1が返される。
---------------------------------------------------------------------------------------------------
【名前】バッファ追加コピー
【書式】[int:元バッファハンドル]から [int:先バッファハンドル]へ [int:サイズ]を バッファコピー
【戻値】[int:サイズ]
【説明】
    元ハンドルから、先ハンドルに、サイズ分のデータを追加コピーする。
    追加されたデータは先ハンドルの使用サイズの最後に追加される。

    成功した場合はコピーサイズが、無効なハンドルを指定した場合
    には-1が返される。
---------------------------------------------------------------------------------------------------
【名前】バッファ読込
【書式】[int:バッファハンドル]の [int:オフセット]から [int:サイズ]を バッファ読込
【戻値】[str:HEX文字列]
【説明】
    バッファハンドルのオフセット位置からサイズ分のデータを文字列に
    変換して返す。文字列は「01 23 45 67 89 AB CD EF 」の様にHEX値を
    半角スペースで区切った形式で返される。
 
    出力出来る最大サイズは1024バイト分である。
---------------------------------------------------------------------------------------------------
【名前】バッファダンプ
【書式】[int:バッファハンドル]の [int:オフセット]から [int:サイズ]を バッファダンプ
【戻値】[str:HEX文字列]
【説明】
    動作は「バッファ読込」命令と同じだが、本命令ではバイナリデータ
    文字列のHEX値16個ごとに改行を挿入して返す。

    出力出来る最大サイズは1024バイト分である。
---------------------------------------------------------------------------------------------------
【名前】バッファ書込
【書式】[int:バッファハンドル]の [int:オフセット]へ [str:HEX文字列]を バッファ書込
【戻値】[int:結果]
【説明】
    バッファハンドルのオフセット位置に、HEX文字列を数値に変換した
    値を書き込む。
 
    入力出来る最大サイズは1024バイト分である。
 
    成功した場合は0が、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】バッファバイト読込
【書式】[int:元バッファハンドル]の [int:オフセット]から [int:サイズ]を [int:先バイトハンドル]へ バッファバイト読込
【戻値】[int:結果]
【説明】
    コピー元となるバッファハンドルのオフセット位置からサイズ分を、
    読み込み、バイトハンドルにコピーする。サイズには1,2,4のいずれかを指定する。
    エンディアンはバッファハンドル中のデータのそれが保存される(コピー過程で
    エンディアン変換することはない)。

    成功した場合は0が、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】バッファバイト書込
【書式】[int:先バッファハンドル]の [int:オフセット]へ [int:元バイトハンドル]を バッファバイト書込
【戻値】[int:結果]
【説明】
    コピー先のバッファハンドルのオフセット位置へ、バイトハンドルからデータを
    コピーする。コピーサイズはバイトハンドルの大きさに依存する。読込の場合
    同様、この過程でエンディアンが変換されることはない。
 
    成功した場合は0が、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】バッファ比較
【書式】[int:バッファハンドル]と [int:バッファハンドル]を バッファ比較
【戻値】[int:結果]
【説明】
    2つのバッファハンドルを比較する。バッファのサイズが違う
    場合には小さい方のサイズに合わせて比較が行われる。

    内容が同じだった場合には1が、違った場合には0が返される。
---------------------------------------------------------------------------------------------------
【名前】バッファサイズ取得
【書式】[int:バッファハンドル]の バッファサイズ取得
【戻値】[int:サイズ]
【説明】
    バッファハンドルとして確保されているメモリサイズを取得する。
 
    成功した場合は1以上のサイズが、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】メモリ使用サイズ取得
【書式】[int:ハンドル]の バッファ使用サイズ取得
【戻値】[int:サイズ]
【説明】
    バイトハンドル、もしくはバッファハンドルのメモリ中での使用サイズ
    を取得する。
 
    バッファに対して「コピー」「バイト書込」を実施した場合、また
    ファイル読込やソケット・シリアル受信を行った場合も、バッファの
    使用サイズはその時バッファに書き込んだサイズとなる。このバッファに
    対して「追加コピー」を実施した場合は使用サイズが増加し、クリア
    した時点で使用サイズ=サイズとなる。
 
    バイトハンドルの場合は1,2,4のいずれかが使用サイズとなる。

    成功した場合は1以上のサイズが、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】Bファイルオープン
【書式】[str:ファイル名]を [int:モード]で Bファイルオープン
【戻値】[int:ファイルハンドル]
【説明】
    ファイル名で指定されたファイルを、モードで指定された方法で
    オープンする。モードには0,1,2,3の何れかを指定し、意味は
    以下のとおり。

    読込:0
    書込:1
    読書:2
    追記:3

    既にファイルが存在している場合、書込モードでオープンすると内容が
    初期化されるので注意すること。

    成功すると0以上のハンドルが返される。失敗した場合には-1が
    返される。
---------------------------------------------------------------------------------------------------
【名前】Bファイル読込
【書式】[int:ファイルハンドル]から [int:サイズ]を [int:先バッファハンドル]へ Bファイル読込
【戻値】[int:サイズ]
【説明】
    オープンされているファイルハンドルから、サイズ分を読み込んで
    バッファに書き込む。読み込めるサイズはコピー先のバッファサイズに
    依存し、バッファサイズ以上のデータは読み込まない。読み込めたサイズは
    戻り値として返される。

    読み込み開始位置は現在の開始位置で、読み込む毎にオフセット
    がプラスされる。

    成功した場合は読み込めたサイズが、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】Bファイル書込
【書式】[int:ファイルハンドル]へ [int:元バッファハンドル]から [int:サイズ]を Bファイル書込
【戻値】[int:サイズ]
【説明】
    書込モード・読み書きモード・追記モードでオープンされている
    ファイルハンドルに対して、バッファからサイズ分のデータを
    書込む。
 
    成功した場合は書き込めたサイズが、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】Bファイルフラッシュ
【書式】[int:ファイルハンドル]を Bファイルフラッシュ
【戻値】[int:結果]
【説明】
    ファイル書込を行っている場合、Windowsのバッファに格納されている
    分はcloseしないとファイルに反映されない。これを強制的にファイルに
    追い出す(フラッシュ)する。

    成功した場合は0、失敗した場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】Bファイルシーク
【書式】[int:ファイルハンドル]の [int:オフセット]へ Bファイルシーク
【戻値】[int:オフセット]
【説明】
    対象ファールのファイル読み書き位置を、先頭からのオフセット位置に
    変更する。

    成功した場合には実際に移動出来た分のオフセット値が、失敗した場合
    には-1が返される。
---------------------------------------------------------------------------------------------------
【名前】Bファイル位置取得
【書式】[int:ファイルハンドル]の Bファイル位置取得
【戻値】[int:位置]
【説明】
    対象ファイルの現在のファイル読み書き位置を返す。
 
    成功した場合には現在の読み書き位置が、失敗した場合には-1が返される。
---------------------------------------------------------------------------------------------------
【名前】ソケットハンドル取得
【書式】[str:IPアドレス]の [int:ポート]で ソケットハンドル取得
【戻値】[int:ソケットハンドル]
【説明】
    「192.168.0.1」の様なIPアドレスと、通信用に使用するポートを
    指定してハンドルを取得する。この命令ではハンドルを取得した
    だけで、ソケット自体はオープンされていない。通信するためには
    引き続き「ソケットオープン」命令を使用すること。
 
    成功した場合には0以上のハンドル値が、失敗した場合には-1が
    返される。
---------------------------------------------------------------------------------------------------
【名前】ソケットオープン
【書式】[int:ソケットハンドル]を [str:相手IPアドレス]へ [int:タイプ]で ソケットオープン
【戻値】[int:結果]
【説明】
    「ソケットハンドル取得」で取得済のハンドルを使用して、以下の
    タイプの通信用のソケットをオープンする。

     0:TCPサーバ
    ※1:TCPクライアント
    ※2:UDP送信
     3:UDP受信

    ※のついたTCPクライアントとUDP送信タイプの場合には、相手IP
    アドレスの指定が必要である。それ以外の場合には相手IPアドレス
    は「」を指定する。
 
    TCPクライアントを指定した場合には、オープンする延長でサーバに
    接続する。
 
    成功した場合には0が、失敗した場合には-1が返される。
---------------------------------------------------------------------------------------------------
【名前】ソケット接続待ち
【書式】[int:ソケットハンドル]で ソケット接続待ち
【戻値】[int:通信用ソケットハンドル]
【説明】
    TCPサーバ用にオープンしたソケットを使って、クライアントが
    サーバに接続してくるのを待つ。接続があった場合には新たな
    通信用ソケットハンドルが返され、以降通信にはそのハンドルを
    使用する。

    接続待ちしている間はプロセスがブロックされる。
 
    成功した場合には0が、失敗した場合には-1が返される。
---------------------------------------------------------------------------------------------------
【名前】ソケットデータ送信
【書式】[int:ソケットハンドル]で [int:バッファハンドル]から [int:サイズ] ソケットデータ送信
【戻値】[int:サイズ]
【説明】
    TCPで接続している(されている)かUDP送信モードでオープン
    しているソケットを使用して、バッファからサイズ分のデータを
    送信する。

    成功した場合には実際に送信出来たサイズが、失敗した場合には
    -1が返される。
---------------------------------------------------------------------------------------------------
【名前】ソケットデータ受信
【書式】[int:ソケットハンドル]で [int:バッファハンドル]へ ソケットデータ受信
【戻値】[int:サイズ]
【説明】
    TCPで接続している(されている)かUDP受信モードでオープン
    しているソケットを使用して、相手側から送信されたデータを受信する。
    データがある場合にはそのデータを指定バッファにコピーする。
 
    受信に成功した場合には受信バイト数を返す。失敗した場合には
    -1を返す。
---------------------------------------------------------------------------------------------------
【名前】ソケット受信確認
【書式】[int:ソケットハンドル]の ソケット受信確認
【戻値】[int:結果]
【説明】
    指定ソケットにデータが届いているかどうかを確認する。データ受信
    関数はブロッキングするので、本関数で受信を確認してから受信すれば
    よい。

    データを受信している場合は1が、ない場合は0が返される。エラーの
    場合は-1が返される。
---------------------------------------------------------------------------------------------------
【名前】相手IPアドレス取得
【書式】[int:ソケットハンドル]の 相手IPアドレス取得
【戻値】[str:相手IPアドレス]
【説明】
    TCPサーバ側に接続があり、新たにハンドルは生成された場合、
    もしくはUDPで受信した場合に、相手のIPアドレスをを文字列で取得する。
---------------------------------------------------------------------------------------------------
【名前】シリアルオープン
【書式】シリアルオープン([int:ポート]、[int:ボーレート]、[int:パリティ]、[int:ストップビット])
【戻値】[int:シリアルハンドル]
【説明】
    本関数は引数が多いので、なでしこ形式ではなく関数形式でコールする。

    パリティ-は
    0:なし
    1:奇数
    2:偶数

    のいずれかを指定する。ストップビット

    0: 1   bit
    1: 1.5 bit
    2: 2   bit

    のいずれかを指定する。

    成功した場合は0以上のハンドル値が返される。失敗した場合は-1が返される。        
---------------------------------------------------------------------------------------------------
【名前】シリアルデータ送信
【書式】[int:シリアルハンドル]で [int:バッファ]から [int:サイズ]を シリアルデータ送信
【戻値】[int:サイズ]
【説明】
    バッファからサイズ分のデータを、シリアルハンドルを使用して送信
    する。
 
    成功した場合は実際に送信出来たサイズが、失敗した場合には-1が返される。
---------------------------------------------------------------------------------------------------
【名前】シリアルデータ受信
【書式】[int:シリアルハンドル]で [int:バッファ]から [int:サイズ]を シリアルデータ受信
【戻値】[int:サイズ]
【説明】
    データがたまっているシリアルポートから、指定のサイズのデータを
    バッファ(ハンドル)へコピーする。
 
    成功した場合はコピー出来たサイズが返される。失敗した場合は-1が
    返される。
---------------------------------------------------------------------------------------------------
【名前】シリアルデータサイズ取得
【書式】[int:シリアルハンドル]の シリアルデータサイズ取得
【戻値】[int:サイズ]
【説明】
    対象のハンドルが対応するシリアルポートで受信して、Windowsのドライバ
    部分に保持されていて読み出し可能なデータサイズを取得する。
 
    成功した場合には読み出し可能なバイト数が、失敗した場合は-1が
    返される。
---------------------------------------------------------------------------------------------------
【名前】ハンドルタイプ取得
【書式】[int:ハンドル]の ハンドルタイプ取得
【戻値】[int:ハンドルタイプ]
【説明】
    指定ハンドルの種別を取得する。戻り値は以下のとおり。

    -1:エラー(使われてない、など)
    1:バイトハンドル
    2:バッファハンドル
    4:ファイルハンドル
    8:ソケットハンドル
    16:シリアルハンドル
---------------------------------------------------------------------------------------------------
【名前】ハンドル解放
【書式】[int:ハンドル]の ハンドル解放
【戻値】(なし)
【説明】
    ハンドルを解放する。ハンドルを解放することで、バッファハンドルの
    メモリ解放や、ファイルハンドルのクローズ処理などが実施される。
---------------------------------------------------------------------------------------------------