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

將8051的值傳入電腦的問題

答題得分者是:bernie_w39
s9261127
一般會員


發表:7
回覆:13
積分:4
註冊:2007-09-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-11-27 16:10:55 IP:140.112.xxx.xxx 訂閱
我想把一數值由8051傳入電腦上
可是我想先由電腦傳入一字元給8051
而當8051收到訊息時才會把值傳出來
請問有甚麼方法可以做到這樣
謝謝
taishyang
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-11-27 17:34:19 IP:122.124.xxx.xxx 訂閱
你8051與PC的溝通介面是什麽? RS232 USB?
在實作中目前遇到的問題是什麽?


s9261127
一般會員


發表:7
回覆:13
積分:4
註冊:2007-09-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-11-27 18:32:38 IP:140.112.xxx.xxx 訂閱
ok  
我是用RS232傳輸
我現在是做一個encoder的解碼
可是我一邊計數一邊將數值利用RS232傳入電腦
可是我發現他會lose count 因此想問大家有沒有解決的辦法

附上我的code

void main(void)
{
EncPos = 0;
initailuart(9600);
while(1)
{
OldEncPos = EncPos;
newa=P0_0;
newb=P0_1;

if( olda==1) /*1xxx*/
{
if(oldb==1) /*11xx*/
{
if(newb==1) /*11x1*/
{
if(newa==1) /*1111*/
{
P1_0 =1;
P1_1 =1;
}

else /*1101*/
{
EncPos = EncPos 1;
P1_1 = 0;
P1_0 =1; /* */
}

}
else /*11x0*/
{
if(newa==1) /*1110*/
{
EncPos = EncPos - 1;
P1_0 = 0;
P1_1 =1; /*-*/
}
else /*1100*/
{
P1_0 =1;
P1_1 =1;
}

}
}
else /*10xx*/
{
if(newa==1) /*101x*/
{
if(newb==1) /*1011*/
{
EncPos = EncPos 1;
P1_1 = 0;
P1_0 =1; /* */
}
else /*1010*/
{
P1_0 =1;
P1_1 =1;
}

}
else /*100x*/
{
if(newb==1) /*1001*/
{
P1_0 =1;
P1_1 =1;
}
else /*1000*/
{
EncPos = EncPos - 1;
P1_0 = 0;
P1_1 =1; /*-*/
}

}

}
}







else /*0xxx*/
{
if(oldb==1) /*01xx*/
{
if(newb==1) /*01x1*/
{
if(newa==1) /*0111*/
{
EncPos = EncPos - 1;
P1_0 = 0;
P1_1 =1; /*-*/

}
else /*0101*/
{
P1_0 =1;
P1_1 =1;

}
}
else /*01x0*/
{
if(newa==1) /*0110*/
{
P1_0 =1;
P1_1 =1;
}

else /*0100*/
{
EncPos = EncPos 1;
P1_1 = 0;
P1_0 =1; /* */
}
}
}
else /*00xx*/
{
if(newa==1) /*001x*/
{
if(newb==1) /*0011*/
{
P1_0 =1;
P1_1 =1;
}

else /*0010*/
{
EncPos = EncPos 1;
P1_1 = 0;
P1_0 =1; /* */
}
}
else /*000x*/
{
if(newb==1) /*0001*/
{
EncPos = EncPos - 1;
P1_0 = 0;
P1_1 =1; /*-*/
}
else /*0000*/
{
P1_0 =1;
P1_1 =1;
}

}

}

}
olda=newa;
oldb=newb;

if( OldEncPos == EncPos )
{

a=(EncPos/1000) 0X30;
b=((EncPos00)/100) 0X30;
c=((EncPos/10)) 0X30;
d=(EncPos) 0X30;

f=0X5c;

outint(a);
delayX1mus (25);
outint(b);
delayX1mus (25);
outint(c);
delayX1mus (25);
outint(d);
delayX1mus (25);
outint(f);
delayX1mus (25);
}

}
}
編輯記錄
s9261127 重新編輯於 2007-11-27 19:37:35, 註解 無‧
s9261127
一般會員


發表:7
回覆:13
積分:4
註冊:2007-09-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-11-27 18:35:02 IP:140.112.xxx.xxx 訂閱
然後我想到的方法就是讓電腦傳出一字元後
再將數值傳出
可能就不會造成lose count
taishyang
站務副站長


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-11-27 18:44:37 IP:122.124.xxx.xxx 訂閱
1.程式碼排版一下,不然應該沒有人有想看的興趣 ^_^

2. a.PC端送出字元,device端每次都會收到嗎?
b.device送出的資料,PC端每筆都收的到嗎?
先確認a與b沒問題再繼續查之後的問題
s9261127
一般會員


發表:7
回覆:13
積分:4
註冊:2007-09-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-11-27 19:38:47 IP:140.112.xxx.xxx 訂閱
嗯嗯
a,b都可以了
bernie_w39
資深會員


發表:3
回覆:199
積分:280
註冊:2007-10-07

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-11-27 21:57:34 IP:59.121.xxx.xxx 訂閱
你會有這個懷疑, 就表示你覺得 lose count 的原因來自於傳輸時, 對吧?

其實把程式調整一下, 就可以避開這個問題.

首先是把 count 的值準備好. 然後當傳送的 buffer 空了之後, 就傳送下一個字出去.
所有的字都傳完了之後, 再把 count 的值轉換為 a, b, c, d... 準備下一次傳送.
s9261127
一般會員


發表:7
回覆:13
積分:4
註冊:2007-09-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-11-28 20:14:00 IP:140.112.xxx.xxx 訂閱
因為我要邊計數邊傳輸
所以會造成 lose count
不知道程式要如何改才好

我的count隨時會改變
bernie_w39
資深會員


發表:3
回覆:199
積分:280
註冊:2007-10-07

發送簡訊給我
#9 引用回覆 回覆 發表時間:2007-11-28 21:18:24 IP:59.121.xxx.xxx 訂閱
用一段 pseudo code 來說明好了.

定一個變數 sendIndex, 初始值給 5, 在你程式的主迴圈中, 加入一段

[code cpp]
if (TX_buffer_is_empty())
{
switch (sendIndex)
{
case 0:
outint(a);
break;

case 1:
outint(b);
break;

case 2:
outint(c);
break;

case 3:
outint(d);
break;

case 4:
outint(f);
break;

case 5:
a=(EncPos/1000) 0X30;
b=((EncPos00)/100) 0X30;
c=((EncPos/10)) 0X30;
d=(EncPos) 0X30;

f=0X5c;
sendIndex = -1;
break;
}

sendIndex ;
[/code]

這樣每當 TX buffer 空了的時候, 就會傳送下一個字, 一組全部送完之後,
就會將目前的 counter 值轉為 abcdf, 作為下一次傳送.
系統時間:2024-05-07 20:50:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!