線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:5540
推到 Plurk!
推到 Facebook!

ASCII code 轉成16進制傳給8051

尚未結案
seeing
初階會員


發表:49
回覆:131
積分:41
註冊:2002-11-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-02 19:00:33 IP:140.134.xxx.xxx 未訂閱
請教各位先進: 一般電腦在傳輸資料時是以ASCII code來傳輸的,那我如果將資料直接由PC透過RS232傳到8051,那麼接收到的資料也將是ASCII code。如果我希望電腦在傳輸時,不是以ASCII code來傳輸,而是以2進制或16進制來傳輸,請問有什麼方法可以轉換嗎? 我的輸入資料是二進制,共8bit(例:01010101) 我之前的作法是這樣的:電腦以ASCII code來傳輸,只會傳輸30H("0")或31H("1"),之後在51裡面寫一個轉換程式,將 30H對應到"0",31H對應到"1"。雖然這樣做是可以成功的轉換出來,但我發現太麻煩了,因此想請教大家,是否有什麼方法可以在PC端的時候就先將原來的字串(01010101)轉成16進制,使8051可以不需要經過轉換就輸出 01010101 來? 謝謝大家
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-02 20:42:09 IP:61.221.xxx.xxx 未訂閱
引言: 請教各位先進: 一般電腦在傳輸資料時是以ASCII code來傳輸的,那我如果將資料直接由PC透過RS232傳到8051,那麼接收到的資料也將是ASCII code。如果我希望電腦在傳輸時,不是以ASCII code來傳輸,而是以2進制或16進制來傳輸,請問有什麼方法可以轉換嗎? 我的輸入資料是二進制,共8bit(例:01010101) 我之前的作法是這樣的:電腦以ASCII code來傳輸,只會傳輸30H("0")或31H("1"),之後在51裡面寫一個轉換程式,將 30H對應到"0",31H對應到"1"。雖然這樣做是可以成功的轉換出來,但我發現太麻煩了,因此想請教大家,是否有什麼方法可以在PC端的時候就先將原來的字串(01010101)轉成16進制,使8051可以不需要經過轉換就輸出 01010101 來? 謝謝大家
seeing 你好:
(1)小弟我覺得你的問題有點怪耶!!以下是我個人的想法,不妨參考看看!!
(2)假設你的 8051 要控制 8 個 LED 是否亮或不亮,那麼每次只需要傳送 1 個
   BYTE 的資料就可以達到目的
(3)例如你在 PC 端經由 RS232 傳送 0x55 (總共有 8 個 bits,二進位為
   01010101,十六進位即為 55) 給 8051,那你的 8051 那邊只需要檢測每個
   bit 的值,就可以知道要讓哪些 LED 亮或不亮,也許程式碼會像以下這個樣
   子
   #define BYTE_BIT0 0x01
   #define BYTE_BIT1 0x02
   #define BYTE_BIT2 0x04
   #define BYTE_BIT3 0x08
   #define BYTE_BIT4 0x10
   #define BYTE_BIT5 0x20
   #define BYTE_BIT6 0x40
   #define BYTE_BIT7 0x80       BYTE bReceive; // 假設這個是從 PC 端接收到的資料
   if(bReceive & BYTE_BIT0)
   {
      // 讓第一個 LED 亮
   }
   else
   {
      // 否則讓第一個 LED 不亮
   }
   if(bReceive & BYTE_BIT1)
   {
      // 讓第二個 LED 亮
   }
   else
   {
      // 否則讓第二個 LED 不亮
   }
   ...........................
   ...........................
   if(bReceive & BYTE_BIT7)
   {
      // 讓第八個 LED 亮
   }
   else
   {
      // 否則讓第八個 LED 不亮
   }
(4)所以,只需要每次傳送 1 個 BYTE,應該就可以達到目的;你之前的做法,
   原本只需要傳 1 個 BYTE 的資料,變成要傳送 8 次 (8 個 BYTE),這也是
   讓小弟我覺得比較奇怪的地方!!
(5)當然,以上的方式,只是小弟我假設的功能的猜測,因為你並沒有把真的要
   達到的目的給寫出來!!還是你有更特殊的需求嗎?<><>
( szBin="01010101">
-- Enjoy Researching & Developing -- 發表人 - RaynorPao 於 2004/08/02 22:59:34
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
seeing
初階會員


發表:49
回覆:131
積分:41
註冊:2002-11-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-02 22:36:22 IP:61.30.xxx.xxx 未訂閱
版主您好:     sorry,可能我敘述的不清楚吧..........     我有一個 Edit , 我希望能在裡面輸入二進位的值(共8個數字),再傳給8051,作法如下(使用SPComm):      Comm1->WriteCommData(Edit1->Text.c_str(),Edit1->Text.Length());     但是8051顯示的燈號卻不是相同的,而是輸出 ASCII code ,因此我才會想說是否有什麼方法可以讓PC將ASCII code轉成16進制的。        的確,照您所說的,必須傳送8次才能傳完,因此若能將輸入的字串(例:01010101)直接轉成16進制後(55H),那麼8051那邊將可以把收到的資料直接輸出,而不需做任何轉換                            謝謝您,版主 ~~第一次接觸硬體傳輸,尚有許多問題,請多多指教~~
seeing
初階會員


發表:49
回覆:131
積分:41
註冊:2002-11-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-03 08:39:13 IP:140.134.xxx.xxx 未訂閱
版主您好: 感謝您的回覆!!您的作法確實可以將二進制轉成16進制,但我要如何將轉出來的數值傳出去?(使用SPComm) Comm1->WriteCommData(bHex,2); 結果會發生錯誤 => cannot convert 'int' to 'char *' 感謝您的回覆!!
seeing
初階會員


發表:49
回覆:131
積分:41
註冊:2002-11-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-03 12:56:00 IP:140.134.xxx.xxx 未訂閱
版主您好:     感謝您的回覆!!已經可以正確的傳送資料了,而且也接收正確了,謝謝您!! 不知道能不能請問一下版主,這一行是什麼意思呢?
系統時間:2024-04-30 2:24:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!