8051 RS232數值傳送問題 (C語言) |
答題得分者是:ScottWang
|
kevin888
一般會員 發表:4 回覆:8 積分:2 註冊:2011-09-27 發送簡訊給我 |
小弟8051想透過rs232在電腦上看到數值的變化!!
char *a1[4] = { '0','x','A','1' }; char *b1 = "0xB1"; char *c1 = "C1"; void trdata(unsigned char sbufdata) { SBUF=sbufdata; while(TI!=1); TI=0; } void main(void) { set232(0xf3); //set rs232 4800,n,8,1 while(1) { trdata(0xAA); //正常 trdata(*a1); //失敗 trdata(*b1); //失敗 trdata(*c1); //失敗 trdata(a1); //失敗 trdata(b1); //失敗 trdata(c1); //失敗 trdata(0xFF); //正常 } } 經過rs232軟體在PC上監看, 可以順利看到傳送出來的數值為: AA ?? ?? ?? ?? ?? ?? FF 但是中間我想傳送指標陣列a1 b1 c1(字串), 在PC上看到的都不是我想得到的數值!! 問題: 1. 8051經由rs232傳送一定要16進制的數值嗎?? 2. trdata傳送的數值, 一定要(0xXX) 才可以將XX傳送出去, why?? 3. 難道不能宣告指標陣列, 之後將我想要的數值經由rs232傳送出去嗎?? 該怎麼做呢?? 感謝大家的回答囉!!!!!!!! |
kib72377
高階會員 發表:1 回覆:217 積分:238 註冊:2004-11-12 發送簡訊給我 |
問題在指標,
你的trdata沒支援, 只能傳"值",不能傳"址". SBUF=sbufdata; sbuf是1 byte的暫存器,你是不可能塞一個字串進去的, 請自己加迴圈和判斷式,1 byte接1 byte的塞. 軟硬體的限制,是沒有捷徑的. 難道你把它當成PC上的VB或C的用法? |
kevin888
一般會員 發表:4 回覆:8 積分:2 註冊:2011-09-27 發送簡訊給我 |
|
ScottWang
版主 發表:32 回覆:486 積分:688 註冊:2009-04-27 發送簡訊給我 |
RS232是用ASCII Code來傳送資料,所以你想玩RS232,就要按照它的遊戲規則來玩.
在寫程式時,我習慣用些小程式來做debug. 1. 你先算出指標陣列內的內容. 2. 8051先不與PC連線. 3. 8051 Txd,Rxd短路. (RS232之2,3腳短路) 4. 利用Port加上LED和電阻做信號的Debug. 5. 把你要送到RS232的指標內容,透過Txd,Rxd的回授,再把這些內容一段一段由Debug的LED顯示出來. 6. 當你知道收到的指標內容以後,再把其內容對照ASCII Code表,逐字轉換成ASCII Code. 7. 所以你要把需要傳送的字串,寫成一段轉換小程式. 8. 8051透過RS232,把已經由字串轉換成ASCII Code的資料,傳送給PC 9. PC把收到的ASCII Code,再轉換成字串. 做字串傳送測試時,可以先傳送一個字,有問題時,再去找出問題點,若成功了再增加字數. ASCII Code Good Luck.
------
高壓直流電源供應器,高壓模組,測試LED專用AC LED定電流源,全範圍可調電壓電流, 中低壓直流電源供應器,電壓放大器,電流放大器,帶通濾波器,高精度參考電壓, 標準電壓,恆流源(定電流源),恆壓源(定電壓源),大電流電源供應器. 接受訂製,設計生產各種特殊規格,高精度產品,學校實驗室,研究單位實驗設備, 另可接受其它電子專案設計,HV Power,Vmax=20KV,Imax=2000A. http://hvpower.myweb.hinet.net/ |
DavidLo
高階會員 發表:17 回覆:225 積分:168 註冊:2004-07-21 發送簡訊給我 |
這個試試
void trdataP(unsigned char *sbufdata) { SBUF=sbufdata; 改成 SBUF = *sbufdata; while(TI!=1); TI=0; } void trdata(unsigned char sbufdata) { SBUF=sbufdata; while(TI!=1); TI=0; } 宣告 char a1[]={ '0', '1', '2', '3', } char b1=0xAA; 發送程式 for(i=0i;i<4;i ) trdata(a1[i]); trdata(b1); PC端顯示(BCD) 30,31,32,33,AA |
kevin888
一般會員 發表:4 回覆:8 積分:2 註冊:2011-09-27 發送簡訊給我 |
void trdata(unsigned char sbufdata)
{ SBUF=sbufdata; while(TI!=1); TI=0; } 宣告 char *a1[]={ '0', '1', '2', '3', } char *b1=0xAA; 發送程式 for(i=0i;i<4;i ) trdata(a1[i]); trdata(b1); PC端顯示(BCD) 30,31,32,33,AA 我現在trdata()裡的sbufdata沒有宣告為指標, 因為會錯誤!! 但我把a1 b1 都宣告為指標才會正確像你所說的!! 發送程式後在PC上用rs232測試軟體 會看到30,31,32,33,AA , 接著我該怎麼做呢?? 如果我在trdata()要傳送的數值會一直變化,假如是(F0) (F1) (F2) ... (FF) ?? |
DavidLo
高階會員 發表:17 回覆:225 積分:168 註冊:2004-07-21 發送簡訊給我 |
變數宣告
char a1[4]={ '0', '1', '2', '3', } char b1=0xAA; 發送程式 for(i=0i;i<4;i ) trdata(a1[i]); trdata(b1); for(i=0;i<128;i ) { a1[0]=i; trdata(a1[0]); } b1='A'; // 0x41 trdata(b1); PC端顯示(BCD) 30,31,32,33,AA,00,01,02, .... ,7F,41 |
kevin888
一般會員 發表:4 回覆:8 積分:2 註冊:2011-09-27 發送簡訊給我 |
|
DavidLo
高階會員 發表:17 回覆:225 積分:168 註冊:2004-07-21 發送簡訊給我 |
|
kevin888
一般會員 發表:4 回覆:8 積分:2 註冊:2011-09-27 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
kevin888
一般會員 發表:4 回覆:8 積分:2 註冊:2011-09-27 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |