NSDNを見ながらシリアル通信部分を書いてみました。
細かい部分を端折っていますが、一応レスポンスを取得できています。
最初、コマンドに\rを付け忘れていたためにレスポンスが帰って来なくて 1時間くらい悩んでいました。
#define WSIM_PORT _T("COM1:")
#define LVL_COMMAND _T("at@@lvl\r")
HANDLE g_hWSim;
// ポート開く
BOOL OpenWSim()
{
DWORD dwErr;
CloseWSim();
g_hWSim = CreateFile(
WSIM_PORT ,
GENERIC_READ | GENERIC_WRITE ,
0 ,
NULL ,
OPEN_EXISTING ,
0 ,
NULL );
if (INVALID_HANDLE_VALUE == g_hWSim) {
dwErr = GetLastError();
return FALSE;
}
return TRUE;
}
// ポート閉じる
BOOL CloseWSim()
{
if (INVALID_HANDLE_VALUE != g_hWSim) {
CloseHandle(g_hWSim);
g_hWSim = INVALID_HANDLE_VALUE;
}
return TRUE;
}
// コマンドを送る
INT SendCommand(CString strCommand)
{
CHAR cBuffer[256];
DWORD dwNumberOfBytesWritten = 0;
WideCharToMultiByte(CP_ACP, 0, strCommand, strCommand.GetLength(), cBuffer, 256, NULL, FALSE);
WriteFile(g_hWSim, cBuffer, strCommand.GetLength(), &dwNumberOfBytesWritten, NULL);
return dwNumberOfBytesWritten;
}
// レスポンス取得
INT ReceiveResponse(CString *strResponse)
{
INT iLen;
CHAR cBuffer[256];
DWORD dwNumberOfBytesRead = 0;
ZeroMemory(cBuffer, 256);
ReadFile(g_hWSim, cBuffer, 256, &dwNumberOfBytesRead, NULL);
iLen = MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, (LPCSTR)cBuffer, -1, NULL, 0);
if (iLen > 0) {
MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, (LPCSTR)cBuffer, -1, strResponse->GetBuffer(iLen), iLen);
strResponse->ReleaseBuffer();
}
return dwNumberOfBytesRead;
}
// 圏外の判定
BOOL IsOutOfService()
{
BOOL bRet = FALSE;
CString strResponse;
CString str;
if (!OpenWSim()) {
return bRet;
}
SendCommand(LVL_COMMAND);
Sleep(1000);
ReceiveResponse(&strResponse);
// レスポンスが 00から始まっていれば圏外?
CloseWSim();
return bRet;
}
後はレスポンスの文字列を解析して圏外かどうかを判定するだけなのですが、 何故か CString::Midがうまく動いてくれません。
まだまだ先は長そうですね。
0 件のコメント:
コメントを投稿