unsigned char がうまく効きません.

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Hituji
記事: 9
登録日時: 11年前

unsigned char がうまく効きません.

#1

投稿記事 by Hituji » 11年前

こんにちは.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;
}

Hituji
記事: 9
登録日時: 11年前

Re: unsigned char がうまく効きません.

#2

投稿記事 by Hituji » 11年前

補足です.
例えば
"%02x %03d",str,str
の部分の出力結果ですが,

7F 127
↑は想定通りなのですが,

06 006
↑は本来「86」をやり取りしているときに発生します.

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: unsigned char がうまく効きません.

#3

投稿記事 by みけCAT » 11年前

シリアルポートが7ビットのデータを扱う設定になっていないですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Hituji
記事: 9
登録日時: 11年前

Re: unsigned char がうまく効きません.

#4

投稿記事 by Hituji » 11年前

みけCATさん
 
 返答ありがとうございます.
 設定を確認したのですが,8ビットの設定でした.

 また,信号読み取りのフリーソフトを使ったところ,そちらの読み取りでは成功していました.

 ひとまずこのプログラム上では7ビットまでしか受け付けない,という状況だということがわかったのはとても大きいです.
 ありがとうございます.

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: unsigned char がうまく効きません.

#5

投稿記事 by みけCAT » 11年前

dcbへのポインタをGetCommState関数に渡す前に、
dcb.DCBlengthにsizeof(DCB)を代入しておいた方がいいかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: unsigned char がうまく効きません.

#6

投稿記事 by usao » 11年前

>SetCommState( hComm, &dcb ); /*シリアルポートの状態を設定*/

ボーレートの設定しか変更してないようですが
その他の要素を放置してても大丈夫なものなのでしょうか? パリティとかストップビットとか.
(GetCommState()で得た「現在の設定値」が,通信相手の通信設定と合致してる保障があるのでしょうか?)

Hituji
記事: 9
登録日時: 11年前

Re: unsigned char がうまく効きません.

#7

投稿記事 by Hituji » 11年前

報告ですが,unsignedchar を charに戻して試したところ,
[理想] 86(16進数)
[char出力] ffffff86
[unsigned char 出力] 06

となり,char出力に0xffを付加すればなんとかなると思ったのですが,
[char出力 &0xff] 06

となりました.
型が変わるとき
表示が変わるとき
に起こると推測できますが原因がわかりません.



みけCATさん,usaoさん
  試してみましたが変化はありませんでした.
  プログラム上の細かい通信設定があることを知りませんでした.ありがとうございます.
  

閉鎖

“C言語何でも質問掲示板” へ戻る