[問題]Float的資料用Char的Buffer傳輸

看板C_and_CPP (C/C++)作者 (chin)時間10年前 (2016/02/25 00:31), 編輯推噓15(15034)
留言49則, 11人參與, 最新討論串1/5 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) IAR 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 感測器轉換完的資料用Float的變數儲存 但傳輸的Buffer是定義為Unsigned Char 請問該如何藉由此Buffer傳資料 餵入的資料(Input): Float的資料 預期的正確結果(Expected Output): 能在接收端收到有小數點的資料 錯誤結果(Wrong Output): 程式碼(Code):(請善用置底文網頁, 記得排版) 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.240.157.51 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1456331484.A.118.html

02/25 01:17, , 1F
02/25 01:17, 1F

02/25 01:19, , 2F
Java: How to convert a String of Binary values to
02/25 01:19, 2F

02/25 01:19, , 3F
a Float and vice-versa?
02/25 01:19, 3F

02/25 01:21, , 4F
啊 看錯版了......
02/25 01:21, 4F

02/25 01:30, , 5F
02/25 01:30, 5F

02/25 01:31, , 6F
先用偷吃步試試看 如果不行就找api或照格式自刻
02/25 01:31, 6F

02/25 04:16, , 7F
union char[4] and float ?
02/25 04:16, 7F

02/25 09:40, , 8F
union也不錯,不過我現在是用指標指到float開頭
02/25 09:40, 8F

02/25 10:03, , 9F
union最簡單
02/25 10:03, 9F

02/25 10:12, , 10F
我用敘述的講一次,實作不會再說…
02/25 10:12, 10F

02/25 10:13, , 11F
1.假設你的有效小數要兩位
02/25 10:13, 11F

02/25 10:14, , 12F
2. 先乘100,存入int變數
02/25 10:14, 12F

02/25 10:15, , 13F
3.假設int為32bit,你就要拆成4個byte,存到unsigned char
02/25 10:15, 13F

02/25 10:16, , 14F
4.接收端接收這4個byte後,重組並除100存入float變數
02/25 10:16, 14F

02/25 10:17, , 15F
補充:建議可以加入checksum
02/25 10:17, 15F

02/25 16:35, , 16F
那就直接把float拆成4bytes 不是最快
02/25 16:35, 16F

02/25 16:49, , 17F
樓上不懂可不可以不要出來嘴?
02/25 16:49, 17F

02/25 16:51, , 18F
1.假設他的接收端浮點數不是4byte,你要怎麼處理?
02/25 16:51, 18F

02/25 16:52, , 19F
2.我說的方法可以在在不同變數大小輕易轉換,不用任何lib
02/25 16:52, 19F

02/25 16:55, , 20F
3.不用任何lib的狀況下,我是不會拆浮點數啦
02/25 16:55, 20F

02/25 16:55, , 21F
可以教一下嗎?
02/25 16:55, 21F

02/25 17:54, , 22F
IEEE754轉出來丟過去就好了,接受端一樣解回來
02/25 17:54, 22F

02/25 17:56, , 23F
對阿 就IEEE754 頂多轉8bytes再傳 這麼兇喔 QQ
02/25 17:56, 23F

02/25 17:59, , 24F
而且IEEE754不用什麼lib啊,Bit wise弄一下就好
02/25 17:59, 24F

02/25 18:01, , 25F
我想應該有大一程度應該就會拆浮點數了^^
02/25 18:01, 25F

02/25 18:03, , 26F
資料封裝這些東西都有RFC可以看,可以參考RFC4506
02/25 18:03, 26F

02/25 19:39, , 27F
板上太多高手了 我有看了一下union應該也是一種方法
02/25 19:39, 27F

02/25 19:39, , 28F
但小弟我昨天還有找到一個叫snprintf的函式 它也可以
02/25 19:39, 28F

02/25 19:39, , 29F
將浮點數直接格式化成字串 不知道這樣會不會有什麼缺點
02/25 19:39, 29F

02/25 19:41, , 30F
02/25 19:41, 30F

02/25 19:56, , 31F
sorry, 小弟不才,受教了,沒用過union這個方法
02/25 19:56, 31F

02/25 19:57, , 32F
之前都是為了避免 MUC與電腦的變數大小不同才這樣做
02/25 19:57, 32F

02/25 19:58, , 33F
回 Caesar08 轉字串可以,但比較沒效率,浪費空間還有時間
02/25 19:58, 33F

02/25 20:19, , 34F
qscgy4,但他的buffer是unsigned char,有更好的方法嗎?
02/25 20:19, 34F

02/25 20:21, , 35F
假設你要傳字串傳一個float長度會不固定,或是固定很長
02/25 20:21, 35F

02/25 20:22, , 36F
另外value->char,再char->value 很沒效率
02/25 20:22, 36F

02/25 20:24, , 37F
我都是照我上面講的做法做,變成int後分別右移8,16,24,32
02/25 20:24, 37F

02/25 20:25, , 38F
存入要傳輸的unsinged char,最後做checksum丟出去
02/25 20:25, 38F

02/25 20:26, , 39F
另外更正一樣是MCU...打錯了= =
02/25 20:26, 39F

02/25 22:07, , 40F
推 qscgy4: 樓上不懂可不可以不要出來嘴? 這wwww
02/25 22:07, 40F

02/25 22:08, , 41F
union跟指標陣列都可以拆,原本想說你推很辛苦不想吐槽你
02/25 22:08, 41F

02/25 22:08, , 42F
結果超兇der
02/25 22:08, 42F

02/26 03:51, , 43F
用union的話會不會有byte order的問題?雖然我沒確認過會
02/26 03:51, 43F

02/26 03:51, , 44F
不會在這發生,但多留意一下為妙
02/26 03:51, 44F

02/26 08:42, , 45F
不懂可不可以不要出來嘴?
02/26 08:42, 45F

02/26 12:03, , 46F
原PO也沒說Buffer是序列還是並列,不知道大家在吵什麼
02/26 12:03, 46F

02/26 12:06, , 47F
如果是8個腳位的並列Buffer,那實作方式還是有差別的
02/26 12:06, 47F

02/26 12:12, , 48F
以感測器的規格跟Sample為準吧,原廠應該都有資料
02/26 12:12, 48F

02/26 12:15, , 49F
沒有原廠的資料來問,誰會知道感測器原廠的晶片怎寫的
02/26 12:15, 49F
文章代碼(AID): #1MpThS4O (C_and_CPP)
文章代碼(AID): #1MpThS4O (C_and_CPP)