こんにちは.C++を始めたばかりの者です.
現在,RS485通信で16進数を扱っています.
unsigned char は0~255までを扱える,ということでプログラムに導入しているのですが,
値が明らかに0~127で頭打ちしてしまい,行き詰っています.
以下にソースを載せますのご意見いただけると助かります.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>
int main(void) {
HANDLE hComm; /*シリアルポートのハンドル*/
int i=0;
unsigned char sBuf[1];
unsigned char str[10000]; /*i=10000までの値を取得*/
unsigned long nn;
DCB dcb; /*DCB:プログラム側で通信パラメータを決める*/
COMMTIMEOUTS cto; /*cto = CommTimeOuts*/
hComm = CreateFile("COM3",
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
0,
0);
if( hComm == INVALID_HANDLE_VALUE ) {
printf("Open Error!\n");
exit(1);
}
GetCommState( hComm, &dcb ); /*シリアルポートの状態を取得*/
dcb.BaudRate = 38400; /*通信速度*/
SetCommState( hComm, &dcb ); /*シリアルポートの状態を設定*/
GetCommTimeouts( hComm, &cto);
cto.ReadIntervalTimeout = 0;
cto.ReadTotalTimeoutMultiplier = 0;
cto.ReadTotalTimeoutConstant = 0;
cto.WriteTotalTimeoutMultiplier = 0;
cto.WriteTotalTimeoutConstant = 0;
SetCommTimeouts( hComm, &cto);
FILE* outputfile; /*FILEポインタ*/
outputfile = fopen("56bit.txt","w"); /*56bit.txt を書き込み(ファイルがなければ自動で作成)*/
if(outputfile == NULL){ /*オープン処理&エラー対応*/
printf("cannot open\n");
exit(1);
}
while(1){
ReadFile( hComm, sBuf, 1, &nn, 0 );
str = sBuf[0];
printf("%02x %03d\n",str,str); /*16進数表記 & チェック用に元の値を表記*/
fprintf(outputfile,"%02x %03d\n",str,str); /*56bit.txtに書き込み*/
i++;
}
fclose(outputfile);
CloseHandle(hComm);
return 0;
}
unsigned char がうまく効きません.
Re: unsigned char がうまく効きません.
補足です.
例えば
"%02x %03d",str,str
の部分の出力結果ですが,
7F 127
↑は想定通りなのですが,
06 006
↑は本来「86」をやり取りしているときに発生します.
例えば
"%02x %03d",str,str
の部分の出力結果ですが,
7F 127
↑は想定通りなのですが,
06 006
↑は本来「86」をやり取りしているときに発生します.
Re: unsigned char がうまく効きません.
みけCATさん
返答ありがとうございます.
設定を確認したのですが,8ビットの設定でした.
また,信号読み取りのフリーソフトを使ったところ,そちらの読み取りでは成功していました.
ひとまずこのプログラム上では7ビットまでしか受け付けない,という状況だということがわかったのはとても大きいです.
ありがとうございます.
返答ありがとうございます.
設定を確認したのですが,8ビットの設定でした.
また,信号読み取りのフリーソフトを使ったところ,そちらの読み取りでは成功していました.
ひとまずこのプログラム上では7ビットまでしか受け付けない,という状況だということがわかったのはとても大きいです.
ありがとうございます.
Re: unsigned char がうまく効きません.
dcbへのポインタをGetCommState関数に渡す前に、
dcb.DCBlengthにsizeof(DCB)を代入しておいた方がいいかもしれません。
dcb.DCBlengthにsizeof(DCB)を代入しておいた方がいいかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: unsigned char がうまく効きません.
>SetCommState( hComm, &dcb ); /*シリアルポートの状態を設定*/
ボーレートの設定しか変更してないようですが
その他の要素を放置してても大丈夫なものなのでしょうか? パリティとかストップビットとか.
(GetCommState()で得た「現在の設定値」が,通信相手の通信設定と合致してる保障があるのでしょうか?)
ボーレートの設定しか変更してないようですが
その他の要素を放置してても大丈夫なものなのでしょうか? パリティとかストップビットとか.
(GetCommState()で得た「現在の設定値」が,通信相手の通信設定と合致してる保障があるのでしょうか?)
Re: unsigned char がうまく効きません.
報告ですが,unsignedchar を charに戻して試したところ,
[理想] 86(16進数)
[char出力] ffffff86
[unsigned char 出力] 06
となり,char出力に0xffを付加すればなんとかなると思ったのですが,
[char出力 &0xff] 06
となりました.
型が変わるとき
表示が変わるとき
に起こると推測できますが原因がわかりません.
みけCATさん,usaoさん
試してみましたが変化はありませんでした.
プログラム上の細かい通信設定があることを知りませんでした.ありがとうございます.
[理想] 86(16進数)
[char出力] ffffff86
[unsigned char 出力] 06
となり,char出力に0xffを付加すればなんとかなると思ったのですが,
[char出力 &0xff] 06
となりました.
型が変わるとき
表示が変わるとき
に起こると推測できますが原因がわかりません.
みけCATさん,usaoさん
試してみましたが変化はありませんでした.
プログラム上の細かい通信設定があることを知りませんでした.ありがとうございます.