unsigned char がうまく効きません.
Posted: 2014年7月22日(火) 16:36
こんにちは.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;
}
現在,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;
}