アプリ版:「スタンプのみでお礼する」機能のリリースについて

排他的論理和 BCC(水平パリティ《偶数》)の算出
VC++6.0 MFCダイアログベースでプログラミングの勉強をしています。

RS232Cを使って、相手側の機器から送られてきた、
受信データが正しいか水平パリティチェックを行いたいと思っています。
  
下記のように作り、 bcc[0] ^= pszBuf; この部分で受信した
データの排他的論理和の計算をしているのですが、これでは中身ではなくアドレスを
計算しているようでした・・・。
どのように直したら良いでしょうか?


charBuf[32]; // 読み出しデータバッファ
int i; // BCCチェックループ回数
char bcc[1] = {0}; // BCC計算結果

// 受信
ReadFile(m_hComm, // ファイルハンドル
(LPCVOID*)Buf, // バッファアドレス
(DWORD)dwCount, // サイズ
&dwRead, // 実際のサイズを格納する変数
NULL); // OVERLAPPED構造体

// 該当範囲の排他的論理和XORを取る
pszBuf++; // 最初の[STX]は計算除外なのでインクリメント
for(i = 0; i < 9; i++) { // 9回計算する。
bcc[0] ^= pszBuf;
pszBuf++;
}

受信するデータは JIS/ASCIIコード です。
受信する形式は  [STX] X X Y Y Y Y Y Y [ETX] [BCC] です。
BCCの計算は  X ^ X ^ Y ^ Y ^ Y ^ Y ^ Y ^ Y ^ [ETX] = [BCC]

A 回答 (4件)

★アドバイス


・『ReadFile』関数のキャストは必要ありません。
・『Buf』はポインタではないので『buf++』は出来ません。
・『dwCount』には『32』がセットされていますか?
・『dwCount』と『dwRead』は DWORD 型ですよね。
・下にサンプルを載せますので、これを参考にソースを見直して下さい。

サンプル:
TCHAR bcc[ 1 ] = { 0 };
TCHAR Buf[ 32 ];
DWORD dwRead;
INT i;

if ( ReadFile(m_hComm,Buf,sizeof(Buf),&dwRead,NULL) ){
 LPTSTR lpBuf = Buf + 1; // 最初の[STX]は計算除外なのでインクリメント
 
 for ( i = 0 ; i < 9 ; i++ ){ // 9回計算する。
  bcc[ 0 ] ^= *lpBuf++;
 }
}

最後に:
・ソースを載せるのならば省略しない方がいいでしょう。
・以上。おわり。

この回答への補足

Oh-さん返事遅くなりました。

無事期待通りの結果をえることが出来ました。
本当にありがとうございました。

win32 console applicationでも試しにやってみましたが
うまくいきました。


#include <stdio.h>
#include <afx.h>
int main()
{

TCHAR bcc[ 1 ] = { 0 };
TCHAR Buf[ 32 ] = "00000000000";//受信データの代わり

int i;

LPTSTR lpBuf = Buf + 1; // 最初の[STX]は計算除外なのでインクリメント
//bcc[0] = 0^0^0^0^0^0^0^0^0 =0x30
for ( i = 0 ; i < 9 ; i++ ){ // 9回計算する。
bcc[ 0 ] ^= *lpBuf++;

}
printf("bcc = %x\n",bcc[0]);
return 0;
}

補足日時:2007/02/28 09:50
    • good
    • 0

LPCVOID自体がVOID*なので


(LPCVOID*)Buf

(VOID**)Buf
になっちゃいますよ
    • good
    • 0
この回答へのお礼

php504さんありがとうございます。

最初 (LPCVOID)Buf とした所、
2 番目の引数を 'char' から 'void *' に変換できません。
とエラーが出たので、安易に*を付けてしまいました。

下記コードを使うことにしました。

if ( ReadFile(m_hComm,Buf,sizeof(Buf),&dwRead,NULL) ){

お礼日時:2007/02/28 09:56

コードを見て疑問に思ったこと:


その「pszBuf」ってのは, どこでどのように定義されてるの? ReadFile で受信するときにはバッファアドレスとして Buf を使ってるんだけど, それと pszBuf とはどのような関係なの?

この回答への補足

Tacosanさん回答ありがとうございます。

せっかく読んでいただいたのに失礼なことをしてしまい申し訳ございません。
誤記です。 pszBuf = Buf バッファなんで余計なpszなくても良いかと思って削除したのですが、中途半端でした。
以下が修正版です。

char Buf[32]; // 読み出しデータバッファ
int i; // BCCチェックループ回数
char bcc[1] = {0}; // BCC計算結果

// 受信
ReadFile(m_hComm,  // ファイルハンドル
(LPCVOID*)Buf, // バッファアドレス
(DWORD)dwCount, // サイズ
&dwRead, // 実際のサイズを格納する変数
NULL); // OVERLAPPED構造体

// 該当範囲の排他的論理和XORを取る
Buf++; // 最初の[STX]は計算除外なのでインクリメント
for(i = 0; i < 9; i++) { // 9回計算する。
bcc[0] ^= Buf;
Buf++;
}

補足日時:2007/02/27 17:47
    • good
    • 0

★『pszBuf』はポインタですよね。


・それならば『bcc[0] ^= *pszBuf;』としないとアドレスを計算することになります。
・『*』文字でポインタの内容を参照できます。
・以上。おわり。

この回答への補足

Oh-さん回答ありがとうございます。
最初の段階でアドレスを計算しているのに気がついたので、
実は bcc[0] ^= *pszBuf はやってみたのですが、
error C2100: 間接指定演算子 (*) の使い方が不正です。
とエラー表示が出てしまいました。

補足日時:2007/02/27 17:04
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A