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

8051 RS232數值傳送問題 (C語言)

答題得分者是:ScottWang
kevin888
一般會員


發表:4
回覆:8
積分:2
註冊:2011-09-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-10-02 11:48:16 IP:120.126.xxx.xxx 訂閱
小弟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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-10-02 18:07:54 IP:219.69.xxx.xxx 未訂閱
 問題在指標,
你的trdata沒支援,
只能傳"值",不能傳"址".


SBUF=sbufdata;
sbuf是1 byte的暫存器,你是不可能塞一個字串進去的,
請自己加迴圈和判斷式,1 byte接1 byte的塞.
軟硬體的限制,是沒有捷徑的.
難道你把它當成PC上的VB或C的用法?
編輯記錄
kib72377 重新編輯於 2011-10-02 18:42:38, 註解 無‧
kib72377 重新編輯於 2011-10-02 18:44:53, 註解 無‧
kib72377 重新編輯於 2011-10-02 18:46:47, 註解 無‧
kevin888
一般會員


發表:4
回覆:8
積分:2
註冊:2011-09-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-10-02 18:13:24 IP:120.126.xxx.xxx 訂閱
void trdata(unsigned char *sbufdata)    
{
SBUF=sbufdata;
while(TI!=1);
TI=0;
}

我有試著把trdata() 裡的sbufdata定義為指標,
一樣不行!!!
ScottWang
版主


發表:32
回覆:486
積分:688
註冊:2009-04-27

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-10-02 22:56:10 IP:59.115.xxx.xxx 訂閱
 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-10-03 09:09:39 IP:111.240.xxx.xxx 訂閱
這個試試
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-10-03 11:29:56 IP:120.126.xxx.xxx 訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-10-03 11:52:01 IP:111.240.xxx.xxx 訂閱
變數宣告
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

編輯記錄
DavidLo 重新編輯於 2011-10-02 21:52:47, 註解 無‧
DavidLo 重新編輯於 2011-10-03 00:55:39, 註解 無‧
kevin888
一般會員


發表:4
回覆:8
積分:2
註冊:2011-09-27

發送簡訊給我
#8 引用回覆 回覆 發表時間:2011-10-03 14:39:32 IP:120.126.xxx.xxx 訂閱
我在trdata()要傳送的數值會一直變化, 但不規律!! 

int value = x (0~99)
如果是兩位數, 要怎麼把這兩位數放進char裡面傳送呢??
現在傳送的char a1{'0','1','2','3'}都是字元, 怎麼傳變數??
DavidLo
高階會員


發表:17
回覆:225
積分:168
註冊:2004-07-21

發送簡訊給我
#9 引用回覆 回覆 發表時間:2011-10-03 14:57:21 IP:111.240.xxx.xxx 訂閱
不就是 trdata(x);
kevin888
一般會員


發表:4
回覆:8
積分:2
註冊:2011-09-27

發送簡訊給我
#10 引用回覆 回覆 發表時間:2011-10-03 16:38:26 IP:120.126.xxx.xxx 訂閱
沒這麼簡單.....
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#11 引用回覆 回覆 發表時間:2011-10-03 16:44:57 IP:114.32.xxx.xxx 訂閱
這樣回答的方式好嗎^^?
前輩們已經提供你方式,試的結果沒PO出來只留下這句話....




===================引 用 kevin888 文 章===================
沒這麼簡單.....
kevin888
一般會員


發表:4
回覆:8
積分:2
註冊:2011-09-27

發送簡訊給我
#12 引用回覆 回覆 發表時間:2011-10-03 20:53:04 IP:120.126.xxx.xxx 訂閱
抱歉抱歉@@
系統時間:2024-04-18 13:50:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!