用過linux系統都知道,我們可以通過終端輸指令來操作linux系統。

這個是對于PC機的。
但是對于嵌入式來說,沒有顯示器,那怎麼來模拟這個終端了。這裡就要用到嵌入式中最好用到功能,序列槽。我們可以通過序列槽,将要顯示的東西發送給PC,然後PC在顯示出來,這樣不就模拟終端了。
用到的工具:
lsecureCRT 7.2
l虛拟序列槽
lKeil C51
lproteus
第一個工具,功能很強大,這裡用來當序列槽終端,即通過序列槽發資料和接收資料。
首先是proteus建構原理圖
序列槽接口的設定如上所示,連接配接到COM4,波特率為9600。
這裡要注意的是,單片機的時鐘頻率要設定為11.0592M。
然後是設定虛拟序列槽
添加COM3和COM4一對虛拟序列槽。這樣,将序列槽終端連接配接到COM3,這樣就實作了序列槽終端和proteus的連接配接了。
在secureCRT中設定
硬體平台搞定後,就要開始寫程式了。
首先是要定義幾個字元串:
uchar code a[] ="hello world!!!\r\n";
uchar code tishi[] = "[[email protected]:#]:";
uchar code dis[] = "unknown command\r\n";
這裡,第一個字元串是用來最開始顯示的。。
第二個字元串,就是終端前面的提示部分。
第三個字元串,是說明無效指令的。。因為這裡沒有對指令進行處理,把所有接收到的指令都當成是未知指令。
然後就開始寫程式了。
首先是main函數的主要部分:
void main()
{
uart_init();
uart_string(a);
while(1)
{
uart_string(tishi);
while(!flag);
flag = 0;
uart_string(b);
uart_string("\r\n");
uart_string(dis);
}
}
uart_init(),是序列槽初始化,就是配置序列槽。
uart_string(a);這個函數,是将字元串a發送到序列槽。
下面的while循環就是關鍵了。
首先是發送提示的資訊,即終端前面顯示的那部分。這個在前面的數組中已經定義好了。
然後就等待一個while循環。這個循環判斷的是flag。這個flag是接收資料标志位,當接收資料後,會為1,然後往下執行。如果沒有接收到資料,那麼為0.那麼就會一直在循環裡面。這樣,就實作了等待接收指令。
程式中,是利用終端接收資料的。當接收資料後,會置flag為1.
接收到資料後,首先是發送接收到的資料。然後發送\r\n。實作換行。然後在發送未知指令的字元串。
然後就是中斷函數
void uart_interrupt() interrupt 4
{
uchar dat;
if(TI)
TI = 0;
if(RI)
{
RI = 0;
dat = SBUF;
//if(dat == '\n' || dat == '\r')
if(dat == '\r')
{
b[kk] = '\0';
kk = 0;
flag = 1;
uart_char('\r');
uart_char('\n');
}
else
{
b[kk++] = dat;
uart_char(dat);
}
}
}
對接收的資料,進行判斷,如果是接收到了\r,即換行(這裡的\r是測試出來的,因為secureCRT的回車發送的就是\r,不同的工具可能發送的不一樣,有的可能是\n)。那麼說明主機指令發送結束。那就将标志位置1,這樣主函數就能跳出while循環,接着執行。接收的資料是存在一個數組裡面的。如果接收的資料不是\r,那麼說明是指令,就把接收到資料存在數組裡面去。然後在把這個接收到的資料在發送回去。這裡一定要發送回去,不然的話,在serureCRT那邊,你輸入指令,是看不到指令的。隻能看到指令的執行效果。主要的地方是在接收的部分。
資料接收完畢後,在發送一個\r\n。這樣才能使下一次顯示提示是在界面最左邊的位置上的。
程式裝載在proteus的單片機中。執行仿真。
開始界面
這是不是就很像linux中的終端了。
輸入指令
然後就可以有執行效果了。
這樣,就用序列槽模拟了linux的終端了。
這裡隻要在主函數的while(!flag)這條語句之後,添加對指令處理的函數,這樣就能真正模拟終端了。
可以看出,序列槽是有多麼的好用。用這個方法,就能做出互動的界面來。隻要在secure CRT中輸入指令。然後單片機接收到指令,對指令進行處理,然後将處理後的資訊傳回PC。