|
過去にここで投稿していたのですが、しばらく書き込みをしていなかったためログが消えてしましました。
そこで、アドバイスをもらっていたのを参考にもう一度考えていたのですが、まだわからないことが多くあるので、もう一度投稿させてもらいます。
スレッドを使ったRS232Cのプログラムを作っています。
リングバッファを使い、読み込み専用のスレッドで書き込んでいくのですが、スレッドの使い方や書き込みの方法、また、受信イベントの使い方がいまいちわからないので何かアドバイスをお願いします。
途中までのプログラムを載せておきますのでおかしい部分など指摘をお願いします。
<pre>
HANDLE hCom;
BYTE ReadBuf[256], SendBuf[256]; // 受信データ, 送信データ
DWORD Readsize, Transsize; // 受信データサイズ
DWORD Sendsize,dwError; // 送信データサイズ
DCB dcb; // DCB構造体
BOOL Ret; // 関数戻り値
COMSTAT cmst; // COMSTAT構造体
OVERLAPPED Overlapped; // オーバーラップ構造体
COMMTIMEOUTS Timeout; // タイムアウト構造体
int n; // ループ用
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
HANDLE Com_Open(void)
{//ポートオープン
// CString PortName[] = {"COM1","COM2","COM3","COM4"}
hCom = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
SetCommMask(hCom, EV_RXCHAR);//監視するイベントと示すマスク : EV_RXCHAR 1文字受信し、入力バッファに入れたとき
if(hCom == INVALID_HANDLE_VALUE){
printf("★ポートをオープンできませんでした。\n");
return FALSE;
}else{
printf("☆ポートをオープンしました。\n");
// タイマー設定 : 受信待ち無制限、送信待ち100ms + 1文字10ms
Timeout.ReadIntervalTimeout = 0;
Timeout.ReadTotalTimeoutMultiplier = 0;
Timeout.ReadTotalTimeoutConstant = 0;//タイムアウト時間
Timeout.WriteTotalTimeoutMultiplier = 10;
Timeout.WriteTotalTimeoutConstant = 100;
Ret = SetCommTimeouts(hCom, &Timeout);
if(Ret == FALSE){
printf("★タイムアウト失敗\n");
CloseHandle(hCom);
exit(0);
} else printf("☆タイムアウト成功 \n");
//通信設定 19200, 8BIT, 偶数パリティ, STOP1に固定
Ret = GetCommState(hCom, &dcb);
if(Ret == FALSE){
printf("★通信設定失敗しました。\n");
CloseHandle(hCom);
exit(0);
}else printf("☆通信デバイスの設定を制御ブロックに格納しました。\n");
dcb.BaudRate = 19200;
dcb.ByteSize = 8;
dcb.Parity = EVENPARITY;
dcb.StopBits = ONESTOPBIT;
Ret = SetCommState(hCom, &dcb);//通信デバイス構成の初期化
if(Ret == FALSE){
printf("★通信デバイス構成の初期化に失敗しました。\n");
CloseHandle(hCom);
exit(0);
}else printf("☆伝送方法を設定しました。\n");
return(hCom);
}
}
void run(void* lpvoid)
{
//メモリブロックに値0を書き込む////////////////////////////////////////////////////////////
ZeroMemory(&Overlapped, sizeof(OVERLAPPED));
Overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);//CreateEvent:名前付きまたは名前なしのイベントオブジェクトを作成または開きます。
Ret = ReadFile(hCom, ReadBuf, 256, &Readsize, &Overlapped);
if(!Ret){
if(GetLastError() == ERROR_IO_PENDING){//GetLastError:エラーコードを取得
GetOverlappedResult(hCom, &Overlapped, &Transsize, TRUE);//非同期操作の結果を返す
Readsize = Transsize;
}else{
Readsize = 0;
}
printf("%d byte受信しました。\n",Readsize);
}else{
printf("受信に失敗しました。\n");
}
}
int main()
{
Com_Open();
hThread[0] = (HANDLE)_beginthread(run,0,NULL); //スレッド1作成
serial_close();
}
</pre>
|