weiqi7777

串口实现linux系统的终端(用proteus)

0
阅读(4204)

用过linux系统都知道,我们可以通过终端输命令来操作linux系统。

clip_image002

这个是对于PC机的。

但是对于嵌入式来说,没有显示器,那怎么来模拟这个终端了。这里就要用到嵌入式中最好用到功能,串口。我们可以通过串口,将要显示的东西发送给PC,然后PC在显示出来,这样不就模拟终端了。

用到的工具,secureCRT 7.2,虚拟串口,C51,proteus。

第一个工具,功能很强大,这里用来当串口终端,即通过串口发数据和接收数据。

首先是proteus构建原理图

clip_image004

串口接口的设置如上所示,连接到COM4,波特率为9600.

这里要注意的是,单片机的时钟频率要设置为11.0592M.

然后是设置虚拟串口

clip_image006

添加COM3和COM4一对虚拟串口。这样,将串口终端连接到COM3,这样就实现了串口终端盒proteus的连接了。

在secureCRT中设置

clip_image008

硬件平台搞定后,就要开始写程序了。

首先是要定义几个字符串:

uchar code a[] ="hello world!!!\r\n";

uchar code tishi[] = "[weiqi7777@localmain:#]:";

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的单片机中。执行仿真。

开始界面

clip_image010

这是不是就很像linux中的终端了。

输入命令

clip_image012

然后就可以有执行效果了。

这样,就用串口模拟了linux的终端了。

这里只要在主函数的while(!flag) 这条语句之后,添加对命令处理的函数,这样就能真正模拟终端了。

可以看出,串口是有多么的好用。用这个方法,就能做出交互的界面来。只要在serure中输入命令。然后单片机接收到命令,对命令进行处理,然后将处理后的信息发回PC。