ブログ - COMポートネタ

COMポートネタ

カテゴリ : 
その他
2011-5-6 17:21
最大は256までらしいが、255で正常に稼働せず。
まぁWindowsで256個もCOMポートを開くことはないが、Vistaが入ったPCで知らぬ間に使えるCOMポートが無くなっていたので、ちょっと調べてみたらとんでもない事に。どうやらBluetoothでペアリングを繰り返しているうちに、自動的に削除されていると思っていた仮想COMポートが、幽霊のように残っていた事が判明。
デバイスマネージャは通常接続されていない装置はリストに列挙されないが、環境変数"devmgr_show_nonpresent_devices"を追加し"1"を設定した後、デバイスマネージャで「非表示のデバイスの表示」にチェックを入れると、今まで見えなかったゴミもろとも表示される。

あとは片っ端から二度と使われることのないデバイスを一つ一つ手動で削除するだけだが、必要な物まで削除してしまわないように。
なお、Windows 7以降ならBluetoothデバイスのペアリングで追加されたCOMポートは、そのBluetoothデバイスを削除すれば一緒に無くなる模様。

ついでと言っては何だが、ちょっとだけプログラムネタ。
自前でCOMポートを扱うプログラムを作ろうとすると、設定項目とAPIのボリュームで結構大変。大そうな事をする訳でも無いのにプログラムの行数だけは増えてゆくもの。なんていうネタがあったので、至極単純なシリアルターミナルを数十行で作ってみた。
イベントやブロッキング・タイムアウトなんぞ一切無視して、全てポーリングで処理して無限ループするだけの代物。まるでマイコンのプログラムの様だw
#include <signal.h>
#include <windows.h>
#include <conio.h>

int term = 1;

void signal_handler (int signo) {
(void)signo;
signal (SIGINT, signal_handler);
term = 0;
}

void main (void) {
int i;
char c = 0;
HANDLE h = CreateFile ("\\\\.\\COM3", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
DCB dcb = { BaudRate:115200, ByteSize: 8, Parity: NOPARITY, StopBits: ONESTOPBIT, };
COMMTIMEOUTS timeouts = {0,0,0,0,0};
COMSTAT stat;
DWORD l;
UCHAR buf[500];

if (h != INVALID_HANDLE_VALUE) {
signal (SIGINT, signal_handler);
if (SetCommState (h, &dcb)) {
if (SetCommTimeouts (h, &timeouts)) {
while (term) {
if (kbhit ()) {
c = getch ();
WriteFile (h, &c, 1, &l, NULL);
}
if (ClearCommError (h, NULL, &stat)) {
if (stat.cbInQue > sizeof (buf)) stat.cbInQue = sizeof (buf);
if (ReadFile (h, &buf, stat.cbInQue, &l, 0) != 0) for (i = 0; i < l; i++) putchar (buf[i]);
}
Sleep (5);
}
}
}
CloseHandle (h);
}
}
COMポートやボーレート等は適宜変更して、GCC Developer Liteのコンパイラオプションを開き、設定リストから「x86 (Console)」を選んでコンパイルすればWindowsのコマンドプロンプトで動くexeファイルの完成。終了するにはCtrl+Cを押してね。
まかり間違うとOSの負荷だけ上がってPCが熱暴走しかねないが、こんなおバカな代物でも時には使い道があるやも知れないので、備忘録として載っけておく。ってかTera TermやSimple Termでいいじゃん。

トラックバック

トラックバックpingアドレス http://www.besttechnology.co.jp/modules/d3blog/tb.php/82