串口实现linux系统的终端(用proteus)
0赞用过linux系统都知道,我们可以通过终端输命令来操作linux系统。
这个是对于PC机的。
但是对于嵌入式来说,没有显示器,那怎么来模拟这个终端了。这里就要用到嵌入式中最好用到功能,串口。我们可以通过串口,将要显示的东西发送给PC,然后PC在显示出来,这样不就模拟终端了。
用到的工具,secureCRT 7.2,虚拟串口,C51,proteus。
第一个工具,功能很强大,这里用来当串口终端,即通过串口发数据和接收数据。
首先是proteus构建原理图
串口接口的设置如上所示,连接到COM4,波特率为9600.
这里要注意的是,单片机的时钟频率要设置为11.0592M.
然后是设置虚拟串口
添加COM3和COM4一对虚拟串口。这样,将串口终端连接到COM3,这样就实现了串口终端盒proteus的连接了。
在secureCRT中设置
硬件平台搞定后,就要开始写程序了。
首先是要定义几个字符串:
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的单片机中。执行仿真。
开始界面
这是不是就很像linux中的终端了。
输入命令
然后就可以有执行效果了。
这样,就用串口模拟了linux的终端了。
这里只要在主函数的while(!flag) 这条语句之后,添加对命令处理的函数,这样就能真正模拟终端了。
可以看出,串口是有多么的好用。用这个方法,就能做出交互的界面来。只要在serure中输入命令。然后单片机接收到命令,对命令进行处理,然后将处理后的信息发回PC。