天天看點

linux終端模拟序列槽,序列槽實作linux系統的終端(用proteus)

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

linux終端模拟序列槽,序列槽實作linux系統的終端(用proteus)

這個是對于PC機的。

但是對于嵌入式來說,沒有顯示器,那怎麼來模拟這個終端了。這裡就要用到嵌入式中最好用到功能,序列槽。我們可以通過序列槽,将要顯示的東西發送給PC,然後PC在顯示出來,這樣不就模拟終端了。

用到的工具:

lsecureCRT 7.2

l虛拟序列槽

lKeil C51

lproteus

第一個工具,功能很強大,這裡用來當序列槽終端,即通過序列槽發資料和接收資料。

首先是proteus建構原理圖

linux終端模拟序列槽,序列槽實作linux系統的終端(用proteus)

序列槽接口的設定如上所示,連接配接到COM4,波特率為9600。

這裡要注意的是,單片機的時鐘頻率要設定為11.0592M。

然後是設定虛拟序列槽

linux終端模拟序列槽,序列槽實作linux系統的終端(用proteus)

添加COM3和COM4一對虛拟序列槽。這樣,将序列槽終端連接配接到COM3,這樣就實作了序列槽終端和proteus的連接配接了。

在secureCRT中設定

linux終端模拟序列槽,序列槽實作linux系統的終端(用proteus)

硬體平台搞定後,就要開始寫程式了。

首先是要定義幾個字元串:

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系統的終端(用proteus)

這是不是就很像linux中的終端了。

輸入指令

linux終端模拟序列槽,序列槽實作linux系統的終端(用proteus)

然後就可以有執行效果了。

這樣,就用序列槽模拟了linux的終端了。

這裡隻要在主函數的while(!flag)這條語句之後,添加對指令處理的函數,這樣就能真正模拟終端了。

可以看出,序列槽是有多麼的好用。用這個方法,就能做出互動的界面來。隻要在secure CRT中輸入指令。然後單片機接收到指令,對指令進行處理,然後将處理後的資訊傳回PC。