シリアルのfloatを送信する

S

stygops

Guest
こんにちは、
イムpcにシリアル経由で89s8252から浮動小数点数を送信しようとすると、私は、数はi番目のecomputerで送信した通知された見ることができますterm232を使用して、これは完全な..されていません
例:
iとi 98624.8736送信95624.8800を受け取る...

なぜ発生しますか?

私のコードをC言語では

無効な(無効)

= 0アカウントフロート;
unsigned char型の続き;
ビットバッファ[40];

SCON = 0x50を/ * SCON:モード1、8ビットUART、レシーバ*を有効にする/
TMOD | = 0x20; / * TMOD:タイマ1、モード2、8ビットの読み込み* /
Th1細胞= 0xFDで/ * Th1細胞:リロード値の場合は9600 *ボー/
TR1の= 1; / * TR1の:タイマ1を実行* /
TIは= 1; / * TIの者:TIを設定UARTの最初の文字を送信する* /

アカウント= 98624.8736;
はsprintf(バッファ、"%.4 f ¥¥ 0"、アカウント);

間(バッファ[続き]!= 0x00)を

putcharは(バッファ[続き]);
続き ;

一方(1)()



非常に感謝、ごめん悪い英語; p

 
やあ

これはfloat型と4バイトの変数で構¥成された労組は、次に定義する平等なfloat型の数値に等しい(ただし)tosend場合は、letとPCへのバイトの変数を送信します。

よろしく

 
お使いのCコンパイラの浮動小数点IEEE 32ビット形式で、それは、24ビットの分数ており
、 したがって
、 約7桁の10進数の解像度です。

二重の代わりに使用してフロートしてください。これは
、 より多くのビットを持ちます。

 
私は二重の代わりにフロートを使用しようとしたが...エラーのまま...

circuit_seller:あなたの例を確認することができますどのように??

 
何は
、 次の変更されたコードの結果ですか?
コード:無効な(無効)



ダブルアカウント= 0;

unsigned char型の続き;

ビットバッファ[40];SCON = 0x50を/ * SCON:モード1、8ビットUART、レシーバ*を有効にする/

TMOD | = 0x20; / * TMOD:タイマ1、モード2、8ビットの読み込み* /

Th1細胞= 0xFDで/ * Th1細胞:リロード値の場合は9600 *ボー/

TR1の= 1; / * TR1の:タイマ1を実行* /

TIは= 1; / * TIの者:TIを設定UARTの最初の文字を送信する* /アカウント= 98624.8736;

はsprintf(バッファ、"%0.4レる¥¥ N"は、アカウント);



間(バッファ[続き]!= 0x00)を



putcharは(バッファ[続き]);

続き ;

)アカウント= 98624.8736F;

はsprintf(バッファ、"%0.4レる¥¥ N"は、アカウント);



間(バッファ[続き]!= 0x00)を



putcharは(バッファ[続き]);

続き ;

)アカウント= 98624.8736L;

はsprintf(バッファ、"%0.4レる¥¥ N"は、アカウント);



間(バッファ[続き]!= 0x00)を



putcharは(バッファ[続き]);

続き ;

)一方(1)()





 
stygops書き込み:

私は二重の代わりにフロートを使用しようとしたが...
エラーのまま...
 
ハイの
変数へのポインタをfloatの開始アドレスを取得し、charポインタに変換し
、 これらの4バイトを送信する。には、PC側では
、 同じ順序で4 charとそれreassableを取得し、float型に変換は、正常に動作されます。

これは
、 各コンパイラdiff形式で浮動小数点を表¥してくださいfloat値98624.8736 4バイトで表¥される天気を調べるには、PC側では
、 コンパイラウルxcompilerの両方で同じ16進数の値を占めている。Murugan

 
[OK]を、
iは
、 共用体を使用し
、 バイト数ではfloat ..送信
しかし、floatの'5'バイトで表¥現されます!
とiヘキサ番号をiと
、 その数との互換性を受信変換送信した通知...しかし
、 丸い...

 
場合は、16進数の値をウルxcompilerとし
、 値をパソ¥コン2は
、 同じ方法で表¥現されるのコンパイラでも同じですフロートは
、 常に
、 任意のコンパイラでは4バイトによって
、 以下の添付ファイルをチェック表¥される(同一の4バイトの16進数の値)して
、 コンパイラには、PC側でオフには
、 プリプロセッサのヘッダファイルmath.hをチェック丸めている可能¥性があります

murugan
申¥し訳ありませんが、あなたがこの添付ファイルを表¥示するためにログインが必要です

 
こんにちはstygops

コードは私のDSP UARTからPCへの浮動小数点演算結果を転送するために使用しているここです。

労働組合

charは[4];
Bのショート[2];
float型f;
)データ3、結果2、Result3;Result2.f = GetValue(&データ2 [0]);
TempValue1 = Result2.b [0]&0xFFを;
TempValue2 =(Result2.b [0]&0xFF00で)""8;
TempValue3 = Result2.b [1]&0xFFを;
TempValue4 =(Result2.b [1]&0xFF00で)""8;
間((ScibRegs.SCICTL2.all&0xc0から)!= 0xc0から);
ScibRegs.SCITXBUF = TempValue1;
間((ScibRegs.SCICTL2.all&0xc0から)!= 0xc0から);
ScibRegs.SCITXBUF = TempValue2;
間((ScibRegs.SCICTL2.all&0xc0から)!= 0xc0から);
ScibRegs.SCITXBUF = TempValue3;
間((ScibRegs.SCICTL2.all&0xc0から)!= 0xc0から);
ScibRegs.SCITXBUF = TempValue4;

PC側でも場合は
、 受信したバイト配列に、float型のポインタを取得する必要があります。

よろしく

 
muruga86書き込み:

フロートは、常に4バイトで、任意のコンパイラで表¥現されます
 
おかげで
、 情報については、我々はほとんどが長さが4バイトprecissionの6つの数字を表¥示していますfloat型の値を使用するエコー。各コンパイラのプロセスが異なる値をfloat.hにセットに基づいてフロートのファイルが含まれます。ほとんどのC本を伝えることで10-38に1038年は山車の有効範囲。あなたがどのような奇妙な範囲を使用していると考えがありますか?まあ、その答えは、IEEE表¥現ではある。IEEE形式の浮動小数点の指数以来、127の正のバイアスを最小の正の値をfloat変数に格納することができますが2から127、約1.175 Xの10-38が格納されます。正の最大値は2128年、約3.4 × 1038です。可能¥な最小値は2から1023までは、約2.23 Xの10から308です二重変数同様です。は
、 二重変数で開催されることが正の最大値は21024で、約1.8 × 10308です。もう1つある気まぐれです。floatのIEEE形式を取得後にする時は実際には
、 逆の順序で格納されてメモリ内に格納しています。中には
、 フォームにDCBA格納されているメモリに格納する場合
、 我々をABCDのように4バイトIEEEフォームを呼び出すことです。私たちの例でこのことを理解しましょう。質問には、浮動小数点数と仮定5.375です。そのIEEE表¥現は0100 0000 1010 1100 0000 0000 0000 0000 0000 0000。16進法では
、 この40のAC 00 00 00表¥明した。中には00のAC 40として格納されるメモリ内に格納します。どうやってこれを確認するのですか?他にどのようしかし
、 プログラムを介して。ここでは...

main()の

フロート= 5.375;
文字* p;
int私;

p =(文字*)&;
(= 0;用I"= 3;私 )
printfの("%02x"、(unsigned char型)p [私]);


サイトからextracte
【URL】www.funducode.com/freec/Datatypes/datatypes1.htm [/ URL】

 
IEEE 754のバイト数またはバイトの記憶域の順序については説明しません。は
、 実装次第だ。
リトルエンディアンのマシンのPentiumなどを使用する00 00のAC 40。このようなPowerPCの40のAC 00 00 00を使用するとビッグエンディアンのマシンです。

C標準は
、 特定の浮動小数点形式を必要としません。ありがたいことに、最も近代的なCPUやコンパイラのIEEE 754を使用します。

しかし
、 これは元の質問から逸脱しているようだ。彼は、バイナリはASCII文字列が送信されました。

 
私は再びtrideしている。

コードイムを使用して:

無効な(無効)

unsigned char型の続き= 0;
組合アカウント(
フロートテンキー;
unsigned char型num2 [3];
);
組合アカウントニュメロ;

SCON = 0x50を/ * SCON:モード1、8ビットUART、レシーバ*を有効にする/
TMOD | = 0x20; / * TMOD:タイマ1、モード2、8ビットの読み込み* /
Th1細胞= 0xFDで/ * Th1細胞:リロード値の場合は9600 *ボー/
TR1の= 1; / * TR1の:タイマ1を実行* /
TIは= 1; / * TIの者:TIを設定UARTの最初の文字を送信する* /

numero.num = 98624.8736;
間(続き"4)

putcharは(numero.num2 [続き]);
続き ;

一方(1)()
)5番目のバイトは
、 イムおそらくゴミ..が受信
ので、今私は4バイトを送信する場合
、 任意のバイトがゼロである場合、このcomunication停止の問題を解決しています。
しかし
、 数98624.8736 98624.875に丸められます!(i)本C51.pdfファイルの場合、Keil社のヘルプを使用して計算する

おかげで多くの...:p

 
やあ

のコードを私は使用して投稿して、あなたの成功になります。

よろしく

 

Welcome to EDABoard.com

Sponsor

Back
Top