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

看板C_and_CPP作者 (chuegou)時間8年前 (2016/06/06 17:06), 8年前編輯推噓2(2026)
留言28則, 4人參與, 最新討論串5/5 (看更多)
: 我目前也是類似要送資料到嵌入式晶片裡, : 本來是用RS232送 是char 8bits合成一個float : union DataSpace : { : unsigned char Quarter[4]; : float Full; : }Float_Data; : 後面是用 Float_Data.Quarter[k]= (char) 接收到的值 : 不過現在想改成用藍芽 不過發送的好像是ASCII 電腦 藍芽 嵌入式 3 -------> --------> '3' 0x03 0x33 所以現在的情況是像這樣嗎? 我怎麼覺得是藍芽模組的問題... 感覺他把你所有訊息都 +'0' 傳出去 我不確定你是想傳 0x03 還是 0x40400000 (char)3 (float)3 我假設是前者 : 所以像是本來送1 : 改成藍芽發送接收到的就會變成像是 Quarter[0]的 value是"1" decimal是49 : 可是這樣出來的full就會變成錯誤的 雖然decimal還是49 : 不過因為是float 所以value就變了 : ======================================= : 大概像是之前是一個float分成4個char的儲存位置存 : 送3進去Float_Data.Full收到的就是3 : 不過現在因為直接送的是char 送進去只是存到Float_Data.Quarter[0]="3"的字串 : Float_Data.Full出來的就不會是要的float 3這個值 : 本來想說單獨抓Float_Data.Quarter[0]出來轉換之類 : 試過什麼float直接強制轉換 或是atof等等的好像也都沒用 : 不知道這種問題要怎麼處理 謝謝 如果確定是藍芽把你 +'0' 那接收端收進來就先 -'0' 實際上你也有做啊 mm = (float)Float_Data.Quarter[0] - 48; 不過因為這個"屍塊"是要拿去"組合"成float 屍塊沒有任何的數字意義 他只是float的一部分 你不能幫他轉型 要維持原本的樣子 char mm; mm = Float_Data.Quarter[0] - 48; 收集四個屍塊在陣列裡擺好 float格式的資料就組好了~ 站內信失敗XD 發到版上了 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.230.107.225 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1465204017.A.D29.html ※ 編輯: chuegou (36.230.107.225), 06/06/2016 17:09:07

06/06 17:31, , 1F
目前是去找一些手機app 像bluetooth terminal 來用
06/06 17:31, 1F

06/06 17:32, , 2F
用手機傳 這個感覺是傳ASCII碼的 所以才又做處理
06/06 17:32, 2F

06/06 17:33, , 3F
本來用RS232傳是直接傳float數值 可是HC-06是傳char
06/06 17:33, 3F

06/06 17:33, , 4F
float可以傳小數 一長串數字 不過char 1個就只能存1個
06/06 17:33, 4F

06/06 17:34, , 5F
所以現在才在想怎麼弄 謝謝你的回答
06/06 17:34, 5F

06/06 17:35, , 6F
最後還是希望能轉回float 不是char或str
06/06 17:35, 6F
把float拆成char[4] 傳4個char就是你要的效果了阿 ※ 編輯: chuegou (36.230.107.225), 06/06/2016 17:40:53

06/06 17:49, , 7F
是這樣沒錯 只是有時候像只傳 2 就只有1個char
06/06 17:49, 7F

06/06 17:50, , 8F
或是要傳12345 12.34之類的 就超過4個char了
06/06 17:50, 8F

06/06 17:50, , 9F
直接用float傳沒這問題 用char傳就不知道空的或多的怎麼
06/06 17:50, 9F

06/06 17:53, , 10F
我想你誤會用char傳的意思了
06/06 17:53, 10F
對... wx你有點誤會這個union的用法 union DataSpace { unsigned char Quarter[4]; float Full; }Float_Data; 你要傳3 Float_Data.Full = (float)3; 然後把 Float_Data.Quarter[0] Float_Data.Quarter[1] Float_Data.Quarter[2] Float_Data.Quarter[3] 傳到接收端 接收端再把4個組合起來 這4個資料看起來會是 0x40 0x40 0x00 0x00 組合起來是 0x40400000 以float格式來說 就是3.00000 就是你要傳的3 所以不管你數字是多少都是固定大小喔 ※ 編輯: chuegou (36.230.107.225), 06/06/2016 18:11:16

06/06 18:45, , 11F
慘...我現在覺得我還沒完全理解原PO的問題(苦笑)
06/06 18:45, 11F

06/06 19:20, , 12F
因為目前是要傳的值存在Quarter[0] Quarter[1]...[2][3]
06/06 19:20, 12F

06/06 19:21, , 13F
只是例如傳3的話 他就只存在Quarter[0] 後面就沒東西
06/06 19:21, 13F

06/06 19:25, , 14F
像我在手機輸入3(ASCII) 從藍芽傳到HC-06 再傳到晶片
06/06 19:25, 14F

06/06 19:26, , 15F
因為HC-06一次傳只傳1個char 8bits 所以只會存在[0]
06/06 19:26, 15F

06/06 19:27, , 16F
設中斷flag接收到4個char中斷一次的話 只收到一個就還不
06/06 19:27, 16F

06/06 19:27, , 17F
會中斷 所以會還沒辦法收到值
06/06 19:27, 17F

06/06 19:29, , 18F
目前大概先暫時放下這邊了...之後弄懂怎麼用再繼續 謝謝
06/06 19:29, 18F

06/06 19:31, , 19F
這幾天都在弄這個 一開始不知道藍芽的傳輸資料型態
06/06 19:31, 19F
理解了 現在問題是發送端沒辦法做到float拆成char[4] 他不會辨識char以外的格式 對吧? ※ 編輯: chuegou (36.230.107.225), 06/06/2016 19:35:32

06/06 19:32, , 20F
一直抓不到資料 還要去找baudrate設定
06/06 19:32, 20F

06/06 19:33, , 21F
然後突然抓的到資料 可是是錯的 才發現是ASCII 用char傳
06/06 19:33, 21F

06/06 19:33, , 22F
以後不懂的東西還是不要這樣趕工好了...
06/06 19:33, 22F

06/06 19:37, , 23F
發送端目前試是只能送char而已 本來用RS232的話可以
06/06 19:37, 23F

06/06 19:49, , 24F
要找到懂C又懂dsPIC 還懂藍芽傳輸+通訊協定 串列式傳輸
06/06 19:49, 24F

06/06 19:49, , 25F
等等的 好像也不太容易阿XD
06/06 19:49, 25F

06/08 01:26, , 26F
系列文有一篇指標是普遍的拆法 不然就自己寫IEE754轉換
06/08 01:26, 26F

06/08 01:28, , 27F
所以wxtab的問題是3沒辦法拆成40 40 00 00這樣嗎?
06/08 01:28, 27F

06/08 17:30, , 28F
雖然可能因為是我用的app關係 只是去google找一些來用
06/08 17:30, 28F
文章代碼(AID): #1NLJqnqf (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1NLJqnqf (C_and_CPP)