Communication Bridge 1.03→1.04

 RFID班から再び相談を受ける。なにやらリクエストパケットを送ったら、1回目は成功するが2回目は失敗しているらしい。で、プログラムの実行結果を見ると確かに変だ。シリアルポートを監視してパケットを見てみたが、Communication Bridgeが間違ったパケットを送っている。
 
 そこはソケットをリスニングして、シリアルに中継を行う部分なのだが、以下のように書いていた。


void CServerSocket::OnReceive(int nErrorCode)
{
CString strBuffer;
int resvSize;
static TCHAR HexArray[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
resvSize=Receive(m_resvBuffer.GetData(),MAX_BUFFERLEN);
if(resvSize>0){
// 正常にパケットを受信
// バイナリ配列のサイズを調整
m_resvBuffer.SetSize(resvSize);
if(theApp.m_pComWindow && theApp.m_boolDisplayInput){
// Dump Viewerに出力
theApp.m_pDumpDocument->m_DumpData.Append(m_resvBuffer);
theApp.m_pDumpDocument->UpdateAllViews(NULL);
}
if(theApp.m_EnableBridge){
// TCPクライアント側からCOMへの転送を行う
theApp.m_pmscomm->SetOutput(COleVariant(m_resvBuffer));
}
}
CSocket::OnReceive(nErrorCode);
}

 
 1回目は正常にブリッジしているのだが、2回目がおかしい。ちなみに1回目は10文字のパケット、2回目は20文字のパケットを飛ばしている。何回かトレースしてみてようやく気づいた。
 
 1回目Recieve関数で、10文字のパケットを受け取るので、resvSizeに10が格納される。
 次にm_resvBuffer.SetSize(resvSize)で、m_resvBufferの領域が10の長さに切り詰められる。
 
 …で、2回目のRecieve関数で20文字のパケットを受け取るが、10文字の領域に20文字入らないので、10文字が切り取られてシリアルにブリッジされる。
 
 というわけで、Communication Bridgeを1.04にバージョンアップしました。