//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "ReadCommUnit.h"
#include "MainUnit.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Memo1->Clear();
Edit1->Text = "0123456789";
CommOpen->Enabled = true; // メニューをトグルさせる
CommClose->Enabled = false;
Button1->Enabled = false; // [Send] ボタンを無効にする
}
//---------------------------------------------------------------------------
// 終了
//---------------------------------------------------------------------------
void __fastcall TForm1::FileExitClick(TObject *Sender)
{
exit(0);
}
//---------------------------------------------------------------------------
// ポート・オープン
//---------------------------------------------------------------------------
void __fastcall TForm1::CommOpenClick(TObject *Sender)
{
//+--------------------------------+
//| シリアルポートのオープン |
//+--------------------------------+
m_hComm = CreateFile("COM1", // オープンするポート
GENERIC_READ | GENERIC_WRITE, // アクセスモード
0, // 共有モード
NULL, // セキュリティー属性
OPEN_EXISTING, // 作成方法
FILE_ATTRIBUTE_NORMAL, // ファイル属性
NULL); // コピーする属性付きファイルのハンドル
if(m_hComm == INVALID_HANDLE_VALUE){ // 通信ポート接続失敗
Application->MessageBox("Error opening port.\n\nSelect new settings,try again.","Error",MB_OK);
return;
}
//+--------------------------+
//| DCB構造体の設定 |
//+--------------------------+
GetCommState(m_hComm, &m_DCB); // 通信パラメータを取得
m_DCB.BaudRate = 9600; // ボーレート
m_DCB.fParity = true; // パリティーチェック
m_DCB.Parity = NOPARITY; // パリティ方式
m_DCB.ByteSize = 8; // 受信データのバイトあたりのビット数(4〜8)
m_DCB.StopBits = ONESTOPBIT; // ストップビットの数
// m_DCB.fOutxCtsFlow = false; // CTS(ClearToSend)出力フロー制御
// m_DCB.fOutxDsrFlow = false; // DSR(DataSetReady)出力フロー制御
// m_DCB.fDtrControl = DTR_CONTROL_HANDSHAKE; // DTR(DataTerminalReady)フロー制御の種類
// m_DCB.fRtsControl = RTS_CONTROL_HANDSHAKE; // RTS(RequestToSend)フロー制御の種類
// m_DCB.fInX = true; // XON/XOFF入力フロー制御
// m_DCB.fOutX = true; // XON/XOFF出力フロー制御
// m_DCB.fNull = true; // ヌル ストリッピングを有効
// m_DCB.XonChar = 0x11; // 送受信時のXON文字
// m_DCB.XoffChar = 0x13; // 送受信時のXOFF文字
SetCommState(m_hComm, &m_DCB); // 通信パラメータをセット
//+--------------------------+
//| タイムアウトの設定 |
//+--------------------------+
GetCommTimeouts(m_hComm, &m_CommTimeOuts); // タイムアウト情報を取得
m_CommTimeOuts.ReadIntervalTimeout = 0;
m_CommTimeOuts.ReadTotalTimeoutMultiplier = 0; // 0 0
m_CommTimeOuts.ReadTotalTimeoutConstant = 100; // 100 0
m_CommTimeOuts.WriteTotalTimeoutMultiplier = 0; // 0 200
m_CommTimeOuts.WriteTotalTimeoutConstant = 0; // 0 10000
SetCommTimeouts(m_hComm, &m_CommTimeOuts); // タイムアウト値をセット
// --- 監視するイベントのセットを指定する
// SetCommMask(m_hComm, EV_RXCHAR);
//+----------------------------------------------------+
//| 端末をレディ状態に(RTS、DTR信号をオンにする) |
//+----------------------------------------------------+
if (EscapeCommFunction(m_hComm, SETRTS | SETDTR) == true){ // RTS、DTR信号設定成功
}else{ // RTS、DTR信号設定失敗
Application->MessageBox("Error opening port.\n\nSelect new settings,try again.","Error",MB_OK);
return;
}
//+--------------------+
//| 受信スレッド |
//+--------------------+
m_pReadCommThread = new TReadCommThread(true, m_hComm); // 受信スレッドの生成2/2
// 受信スレッドを作動させる
m_pReadCommThread->Resume();
//+--------------+
//| その他 |
//+--------------+
CommOpen->Enabled = false; // メニューをトグルさせる
CommClose->Enabled = true;
Button1->Enabled = true; // [Send] ボタンを有効にする
}
//---------------------------------------------------------------------------
// ポート・クローズ
//---------------------------------------------------------------------------
void __fastcall TForm1::CommCloseClick(TObject *Sender)
{
//+--------------------------------+
//| シリアルポートのクローズ |
//+--------------------------------+
CloseHandle(m_hComm);
//+--------------+
//| その他 |
//+--------------+
CommOpen->Enabled = true; // メニューをトグルさせる
CommClose->Enabled = false;
Button1->Enabled = false; // [Send] ボタンを無効にする
}
//---------------------------------------------------------------------------
// 送信
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char str[MAX_PATH]; // 書き込みデータバッファ
int writeSize; //
DWORD dwErrors; // エラー情報
COMSTAT ComStat; // デバイスの状態
DWORD dwWritten; // ポートへ書き込んだバイト数
int freeBufSize; //
// 1文字ずつ出力
AnsiString OutChar = Edit1->Text;
for (int i=1; i<OutChar.Length()+1; i++ ){
AnsiString OneChar = OutChar[i];
// 文字列出力
strcpy(str, OneChar.c_str());
writeSize = strlen(str);
// 送信バッファに書き込めるまで待機
do{
ClearCommError(m_hComm, &dwErrors, &ComStat);
Application->ProcessMessages();
freeBufSize = MAX_PATH - ComStat.cbOutQue;
}while(freeBufSize <= writeSize );
//データをバッファへ書き込む
WriteFile(m_hComm, str, writeSize, &dwWritten, NULL);
}
}
|