2007-10-01

受信信号強度の取得 その2

昨日の続きで W-SIMから信号強度を取得してみます。
 
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 件のコメント: