数据收集体系中因为单片机侧重于操控,数据处理才干较弱,对收集的数据进行运算处理比较繁琐,假如经过串口与上位机通讯,使用上位机强壮的数据处理才干和友爱的操控界面对数据进行处理和显现则能够进步规划功率。串口通讯以其简略的硬件衔接,老练的通讯协议,成为上下位机之间通讯的首选。移植了Linux 操作体系的s3c2440 能够在Linux 环境下操作串口,降低了串口操作的难度,能够使开发者会集精力开发大规模的使用程序,而不用在操作底层规划上消耗时刻。
1 硬件衔接
s3c2440 是三星公司出产的依据ARM9 核的处理器,选用3.3 V 电压供电; C8051Fxxx 系列单片机是美国CYGNAL 公司推出的与8051 兼容的高性能高速单片机,选用3.3 V 电压供电。两者供电电压相同,所以进行串行口通讯时不需求进行电平转化。硬件衔接选用最常用的TXD,RXD,GND 三线衔接方法。留意选用穿插衔接方法,即TXDRXD,RXDTXD.
2 Linux 下串口通讯
2.1 Linux 下串口设备描绘
s3c2440 上移植了Linux 2.6.32 操作体系,加载了s3c2440 的串口驱动程序,经过Linux 供给的串口操作函数和文件操作函数把对串口的操作等同于文件操作,降低了串口的操作难度,进步了功率。在程序中设备和文件都是经过文件描绘符来操作的,文件描绘符在Linux 内核中是一个非负整数。Linux 设备文件都存放在“/dev”目录下,串口也不破例,在/dev 中能够找到串口对应的设备文件,本文对应的串口1 的设备文件途径是“/dev /ttySAC1”.
2.2 Linux 下串口通讯程序规划
串口通讯需求设置一些参数,如波特率、数据位、中止位,输入输出方法等。这些参数都存在于Linux供给的termios 结构中,该结构是Linux 体系用于查询和操作各个终端的一个规范接口,界说在头文件< ter-mios. h > 中,如下所示:
STruct termios{tcflag_t c_iflag; /* 输入标志* /tcflag_t c_oflag; /* 输出标志* /tcflag_t c_cflag /* 操控标志* /tcflag_t c_lflag /* 本地标志* /cc_t c_cc[NCCS]; /* 操控特性* /} ;Linux 串口通讯过程可分为以下三步,操作流程如图1 所示。

第一步: 翻开串口调用open( ) 函数翻开串口设备文件,若犯错则回来- 1,成功则回来文件句柄。
#define UART1 /dev /ttySAC1int fd;fd = open( “UART1”,O_RDWR) /* 以可读可写方法翻开串口设备* /
第二步: 设置串口特点函数tcsetattr ( ) 能够设置串口的结构特点,tcgetatt( ) 能够得到串口的结构特点。在termios 结构中,? &=s ?最重要的是c_cflag,用户经过对其进行赋值能够完成串口波特率、数据位、中止位、奇偶校验位等参数的设置。c_cc 数组中的两个变量VMIN 和VTIME 判别是否回来输入,c _cc[VTIME]设定字节输入时刻计时器,c _cc[VMIN]设定满意读取功用的最低接纳字节数。这两个变量的值要设定合理,才干确保串口的通讯成功率。
int set_attr( int fd){struct termios newtio,oldtio;tcgetattr( fd,&oldtio) ;cfsetispeed( &newtio,B9600) ; /* 设置读波特率为9600* /cfsetospeed( &newtio,B9600) ; /* 设置写波特率为9600* /memset( &newtio,0, sizeof( newtio) );newtio. c_cflag = CS8 | CREAD; /* 设置数据位为8 位而且使能接纳* /newtio. c_cflag & = ~ PARENB; /* 不进行奇偶校验* /newtio. c_cflag & = ~ CSTOPB; /* 1 位中止位* /newtio. c_cc[VMIN]= 1; /* 当接纳到一个字节数据就读取* /newtio. c_cc[VTIME]= 0; /* 不使用计时器* /tcflush( fd,TCIOFLUSH) ; /* 刷清输入输出缓冲区* /tcsetattr( fd,TCSANOW,&newtio) /* 使设置的终端特点当即收效* /}
第三步: 串口读写,串口封闭设置完通讯参数后,就能够用规范的文件读写指令read( ) 和write( ) 操作串口了。最终在退出之前,用close( ) 函数封闭串口。
void rd_wr( ){write( fd,wbuf,10) ;usleep( 500000) ; /* 延时50 ms 等候下位机发送数据* /read( fd, rbuf,10) ;printf( “read string is %s ”, rbuf) ;}
3 通讯程序规划
ARM 与单片机的串口通讯程序包含两方面: 一方面是作为上位机的ARM 的串口通讯程序,另一方面是作为下位机的单片机的串口通讯程序。在通讯之前有必要拟定合理的通讯协议以确保通讯的可靠性和成功率。现约好两边通讯协议如下:
( 1) 波特率为9600 bit /s,帧格局为1 – 8 – N – 1( 1 位开始位,8位数据位,无奇偶校验,1位中止位) ;( 2) 因为上位机ARM 的速度远远高于下位机单片机的速度,所以选用上位机自动联络,下位机等候的方法。在数据传送前ARM 先发送联络信号/0xaa,单片机收到后答复一个/0xbb,表明能够发送,不然持续联络;( 3) 单片机端能够有中止和查询方法收发串口数据。本文选用中止方法;( 4) ARM 处理器s3c2440 选用UART1 和单片机通讯,UART0 则作为s3c2440 终端操控台。
3.1 上位机ARM 的通讯程序规划
因为s3c2440 移植了定制和裁剪后的Linux2.6.32内核的操作体系,对串口的操作选用上述的Linux 下串口操作方法,程序流程图如图2 所示。

3.2 下位机单片机的通讯程序规划
选用C8051F021 的定时器T1 作为波特率发生器,晶振选用11.0592 MHz,定时器作业在方法2,计数初值为0xfd,串口作业在串行方法1( 1 – 8 – N – 1) ,选用中止方法收发数据。

4 结束语
跟着近年来嵌入式Linux 在国内的使用规模日益壮大,依据ARM 渠道的嵌入式Linux 设备也将会越来越多地用在数据收会集作为上位机对数据进行处理、显现、存储、发送。本文所介绍计划适用于大多数场合Linux 下ARM 和单片机的串口通讯规划,规划人员只需依据自己的实际需求修正或重新拟定通讯协议即可。别的需求留意的是因为上位机ARM 的速度比单片机快许多,所以一次不能发送过多的数据,不然极有可能使发送缓冲区溢出而呈现数据丢掉的现象,开发人员要依据通讯两边设备的情况挑选适宜的帧长度,以到达最佳的传输状况。