目 录
1、实习题目
Linux下串口和Socket通信及其应用
串口通信(Serial Communication),串口按位(bit)发送和接收字节。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。 串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。
套接口(Socket)通信为目前Linux上最为广泛使用的一种的进程间通信机制,与其他的Linux通信机制不同之处在于除了它可用于单机内的进程间通信以外,还可用于不同机器之间的进程间通信。
简单应用设计为温度仪协议转换软件设计和模拟打印机。对于温度仪协议转换软件一共有三个设备,Server端为PC机,Client端为Linux机(或嵌入式系统机),末端为串口的温度仪。温度仪协议转换软件位于Client端的Linux机(或嵌入式系统机)上,该软件不断通过串口轮询温度仪数据,获得温度仪的数据后主动通过Socket发送到远程的PC机上,PC机上安装数据演示软件,显示温度仪的数据。
2、实习目的
综合运用《软件工程》、《操作系统》、《数据库原理》、《嵌入式系统基础》、
《数据结构》等课程基础理论知识,逐步完成一个串口和Socket通信及其简单应用的设计与开发工作。使学生:
熟悉串口通讯和Socket通信应用程序开发的基本流程;
掌握串口通讯和Socket通信应用程序常用的设计方式;
熟练掌握软件需求分析方法和需求建模工具;
熟练掌握嵌入式系统的分析和设计技术;
熟练掌握Linux下C语言的基本语法和高级特性;
熟练掌握Linux下的相关开发技术。
3、实习内容
序号 |
实习任务 |
主要内容 |
学时 |
1 |
需求分析 |
根据项目需求,描述模型 |
|
2 |
系统分析 |
分析系统,建立模型。 |
|
3 |
系统设计 |
系统架构 |
|
结构设计 |
|
||
功能设计 |
|
||
串口通讯设计、Socket通讯设计,演示软件设计 |
|
||
4 |
系统实现 |
硬件环境实现 |
|
软件环境实现 |
|
||
功能实现 |
|
||
5 |
系统测试 |
单元测试 设计测试用例,对单个类及类的方法进行测试。 |
|
功能测试 设计测试用例,对系统关键功能进行测试。 |
|
||
性能测试 使用测试工具,对系统进行性能测试。 |
|
||
6 |
系统部署 |
描述具体部署过程 |
|
7 |
整理实习报告 |
根据自己完成的情况,整理实习报告 |
|
4、实习步骤
4.1系统需求分析
4.1.1 问题定义
串口通讯,双机用串口线连接,互相收发数据。Socket通讯,远程的两台计算机通过网线互连,Server端和Client端互相收发数据。
简单应用设计为温度仪协议转换软件。
对于温度仪协议转换软件,一共有三个设备,Server端为PC机,Client端为Linux机(或嵌入式系统机),末端为串口的温度仪。温度仪协议转换软件位于Client端的Linux机(或嵌入式系统机)上,该软件不断通过串口轮询温度仪数据,获得温度仪的数据后主动通过Socket发送到Server端的PC机上,PC机上安装数据演示软件,显示温度仪的数据。
4.1.2 可行性研究
对于串口温度仪,类似的设备很多,比如串口的液位仪、打印机等,这些设备都有相应的通讯协议,通过协议就可以完成相应的数据的采集。
对于串行口的应用有很多,例如,它可以连接鼠标、MODEM、串口温度仪、打印机,验钞机等等。
为了确保数据的正确性,在接收过程中可以在检测异步传输的起始信号处加上一些防干扰处理,在接收每个数据加校验数据。
4.1.3 需求分析
串口通信是一种按位进行传输数据的一种通讯方式,这种通讯方式使用的数据线少,在远距离通信中可以节约通信成本。将双机用串口连接,叫串口通信,互相收发数据。对于那些与计算机相距不远的人-机交换设备和串行存储的外部设备如终端、打印机、逻辑分析仪、磁盘、验钞机等,采用串行方式交换数据也很普遍。在实时控制和管理方面,采用多台微机处理机组成分级分布控制系统中,这样简捷,方便,快速。
本次生产实习中,用串口线将两台计算机相连,其中一台计算机运行温度模拟仪,另一台运行温度协议转换程序。通过串口进行命令的发送以及温度数据的读取。
Socket通信是通过TCP/IP协议栈进行传输数据的一种通讯方式,可以实现Server端和Client端的远程通讯,这种通讯方式在社会中应用广泛,成本低,可以实现全球内的远距离通讯。
本次生产实习中,通过以太网连接两台计算机,其中一台上运行client,即温度协议转换程序,另一台运行server演示软件。演示软件显示client 发来的温度数据,并发送命令给client端。
4.1.4 项目开发计划
总体上分两个部分,即PC机和Linux虚拟机。
PC机:PC机上运行温度模拟仪以及服务端演示软件。服务端演示软件需要显示客户端发来的温度数据,发送取状态命令,设置频率。
Linux虚拟机:在虚拟机下运行温度协议转换程序。实现功能:向串口发送命令,读取串口数据,数据格式转换,发送数据到服务端,处理服务端发送的命令。
然后分别完成各个功能函数,再把每个部分的所有的函数集中起来编译连接进行调试,并进行整体测试,最后对两个部分进行联合测试。
4.2 系统设计
4.2.1 系统架构
1、温度协议转换软件:
远程PC机
温度演示软件 |
嵌入式系统机
温度协议软件 |
温度仪 |
Socket |
串口 |
图 4-1 温度协议转换
Socket:远程PC机的IP地址及程序所使用的端口号
串口:通过串口线连接两台计算机(连接温度仪和嵌入式系统机)
2、演示软件:
在一台计算机上运行演示软件,通过以太网连接,接受来自client端(运行温度协议转换软程序的嵌入式系统机)的数据,并向其发送命令。
4.2.2 结构设计
一、协议
串口通信程序采用分层结构,即将程序按层次分为物理层、驱动层、应用层。分层设计有以下优点:
(1)与主机通信的串口程序支持接收和发送并发处理(主动发送和被动查询设备并存),利于提高通信效率及数据处理的实时性。
(2)当PC只有一个串口而以串口通信方式控制的设备模块有多个时,必需对串口扩展,为了简化硬件则需用软件实现模拟的串口,因此系统内部应有支持I/O口模拟串口操作的软件实现。标准串口和模拟串口在物理实现上有区别,但采用统一的对外封装,以提高程序的封装性和模块化程度。
(3)防止由于串口操作而在流程中独占CPU资源,避免漏检状态信息等现象发生。
Socket通信程序,一台PC机作为Server端,运行Socket,监听连接,另一台Linux机作为Client端,将通过TCP与Server端取得连接,连接成功后Server端和Client端就可以互相收发数据。收发数据结束后关闭连接。
二、演示端
演示软件显示客户端发来的温度数据,发送取状态命令,设置频率。
4.2.2.1 上层结构设计
一、协议
(一)、对于温度协议转换软件,协议如下:
与Server端的协议
一)、使用TCP Server发收数据,先发后收,发收的数据都是字符串类型,可以直接在文本框中显示。
二)、协议格式:
(1).取温度数据:
发送:命令码+温度计个数+温度计编号+温度值+...+温度计编号+温度值
命令码:0201;温度计个数:二个字符,例:04;温度计编号,二个字符,例:02;温度值,6个字符,例:802321,002122,前二个字符80代表负数,00代表正数,后二位是小数。
收到:020100表示正常收到并且没有命令;发送0201FF表示数据错误,发送0201XXXX...表示有其他命令。
以下数据都是发送温度数据后收到相应的命令的处理。
(2).取温度计状态:
发送1的数据后收到:1的命令回复码+长度+命令码,即:0201 02 0202 。
读取串口获得温度状态后发送:命令码:0202+温度计个数+温度计1状态+温度计2状态+...+温度计N状态
(3).设置温度频率:
发送1的数据后收到:1的命令回复码+长度+命令码+频率,即:0201 03 0101XX,其中XX为频率 。命令码:0101,频率,二个字符,最大为99秒,例:02。
发送:命令码+结果,其中收到:010100表示设置正常,收到0101FF表示出错。
三)、本次实习温度仪的温度计个数为4个。
与串口温度仪的协议
一)、收发的数据都是bin8格式的压缩BCD,即都是一个个字节构成,每一个字节转换成两个十六进制字符就是相应的数字,可以在文本框中显示,例:02就是一个字节,11也是一个字节,FF也是一个字节;或者是普通bin8格式的数据,比如正负号,00为正,80为负值。
二)、协议格式:
(1).取温度数据:
发送:命令码,二字节:0201 。
收到:命令码+温度计个数+温度计编号+温度值
命令码:0201;温度计个数:一个字节,例:04;温度计编号,一个字节,例:02;温度值,3个字节,第一个字节是正负号,00为正,80为负值,例:002321,802122。
(2).取温度计状态:
发送:命令码,二字节:0202 。
收到:命令码+温度计个数+温度计1状态+温度计2状态+...+温度计N状态
命令码:0202,温度计个数一个字节,温度计状态一个字节,00正常,其他异常。
三)、本次实习温度仪温度计个数为4个。
四)、串口确定参数为9600,N,8,1
(二)、Server端演示软件协议:
一)、使用TCP Server收发数据,先收后发,收发的数据都是字符串类型,可以直接在文本框中显示。
二)、协议格式:
(1).取温度数据:
主动数据,收到:命令码+温度计个数+温度计编号+温度值+...+温度计编号+温度值
命令码:0201;温度计个数:二个字符,例:04;温度计编号,二个字符,例:02;温度值,6个字符,例:802321,002122,前二个字符80代表负数,00代表正数,后二位是小数。
发送:020100表示正常收到并且没有命令;发送0201FF表示数据错误,发送0201XXXX...表示有其他命令。
(2).取温度计状态:
收到1的数据后发送:1的命令回复码+长度+命令码,即:0201 02 0202 。
收到:命令码:0202+温度计个数+温度计1状态+温度计2状态+...+温度计N状态
(3).设置温度频率:
收到1的数据后发送:1的命令回复码+长度+命令码+频率,即:0201 03 0101XX,其中XX为频率 。命令码:0101,频率,二个字符,最大为99秒,例:02。
收到:命令码+结果,其中收到:010100表示设置正常,收到0101FF表示出错。
三)、本次试验确定温度计个数为4个
二、实现原理:
一)、协议转换软件:
图4-2 协议转换软件
二)、演示软件:
见时序图。
4.2.2.2 中层结构设计
1.文件系统:Linux的相关的系统设定,各种Linux环境下的软件的使用与调试。
2.网络服务:Linux这种类UNIX的操作系统其另一个作用域是网络服务器。Linux本身自带几乎所有网络上的用得到的服务,可以充当任何网络服务器,比如DNS、DHCP、ftp、NFS、Proxy等等。而且其特点是,所有这些服务的配置与设定都可以通过文本形式的配置文件进行配置。所以学好Linux下网络服务的配置与使用,完全可以当CIO(首席信息官)了,因为已经具备Linux网络工程师的能力了。
3.软件设计:Linux是开源的操作系统软件,也是较原始的编程环境,其下的C/C++、PHP等都是比Windows下更纯语言。但Linux下高级的开发环境较少。
Linux这三大块知识不相互影响,但有相互依赖和促进的作用。
4.2.2.3 物理层结构设计
对于温度协议转换软件,通过串口线,连接Linux机和温度仪,实现串口通讯。通过网线,连接PC机和Linux机,实现Socket通讯。
图 4-3 物理层结构
4.2.3功能模块设计
一、温度协议转换软件:
一)、全局变量:
int frq(初始化为2秒), 采集温度仪数据的频率,单位秒。
char statFlag, 是否查询温度仪状态,0: 不查询, 1: 查询。
二)、功能函数:
函数名 |
com_send |
功能 |
串口发送数据 |
参数 |
int fd, 串口描述符 char cmd[],数据 int cmdlen数据长度 |
实现方法 |
调用write(fd,cmd,cmdlen) (与一的函数相同) |
函数名 |
com_receive |
功能 |
串口接收数据 |
参数 |
int fd,串口描述符 char buffer[],数据 int retlen数据长度 |
实现方法 |
调用read(fd, buffer, retlen) |
函数名 |
socket |
功能 |
socket连接,连接Server端 |
参数 |
char ip[], IP地址 char port[], 端口号 |
返回值 |
Int类型,socket描述符 |
实现方法 |
|
函数名 |
bin2hexString |
功能 |
二进制数据转换十六进制字符串 |
参数 |
char buffer[],数据 int len数据长度 |
返回 |
char *,buffer[]数据的16进制字符串形式。 |
实现方法 |
|
表 4-1 实现函数
二、Server端演示软件:
具体使用Qt设计,界面见界面部分,协议见结构设计部分。
1、时序图
图 4-4 演示软件时序图
2、类图
图 4-5 类图
4.3 系统实现
4.3.1 系统硬件环境
最低配置:高性能计算机每人一台,两人一组,每台计算机要求有串口和以太网、同时要求有串口连接线和以太网连接线。
最佳配置:装有Linux的嵌入式系统的实验平台每人一台,两人一组,每台嵌入式系统要求有以太网口和串口,同时要求有串口连接线和双机对联网线。高性能计算机每人一台。
4.3.2 系统软件环境
一、温度协议转换软件环境
Linux系统是一项稳定的开源系统,稳定行好,能够调试串口通信,C语言程序编译,运行,分析。
串口,对于安装了Linux的PC机,可以直接调用(/dev/ttyS0)。对于Windows可以用VMWare的添加串口向导完成。在Win32下,整个系统中只有一个串口:COM1;Linux下也只有一个:/dev/ttyS0。分别运行两个系统中的相应软件,选择这个串口,就可以开始调试了。串口的优点是更类似于实际的嵌入式系统。
Socket,对于Windows和Linux都基于TCP/IP协议栈。直接进行Socket编程即可。
二、温度演示软件环境
在PC机上安装Qt软件,设置好变量环境,在Qt下编写温度显示软件。通过Socket与Client进行通信,显示其发来的数据,并发回处理命令。
4.3.3 开发工具
一、协议转换软件
解压压缩文件,安装VMWare虚拟机,在虚拟机中建立共享文件夹,将所用的文件放入WINDOWS与LINUX共享文件夹e:\vm\share中。进入虚拟机,打开LINUX系统,进入共享文件夹c,在WINDOWS下打开文件,进行编译,保存后,在LINUX下运行终端,然后输入命令 cd /mnt/hgfs/share
在输入命令 gcc tt.c –o tt 进行调试,
查看程序问题,错误,警告,并一一解答,直到调试没有错误。
在输入命令 ./tt 运行程序,查看程序运行情况。
二、演示软件
安装Qt软件开发工具,设置环境变量,进行开发。
4.3.4 系统功能模块设计与实现
4.3.4.1 界面
一、温度协议转换软件:
一)、Server端演示软件
图4-6 Server端演示软件
二)、Client端温度协议转换软件
图 4-7 Client端温度协议转换软件
4.3.4.2 其他功能
一、温度协议转换软件
1.轮询温度仪的温度数据
2 .获取温度仪状态
3.用Socket上传温度数据或者温度仪状态数据
二、温度演示软件
1.获取温度仪的状态
2.设置取温度的频率
3.设置端口
4.4 关键技术
关键技术一:通讯代码:
int open_serial( char *ttyname ){
int fd;
struct termios termios_new;
fd = open (ttyname, O_RDWR | O_NOCTTY); //| O_NONBLOCK
if( fd < 0 )
{
printf( "open device[%s] failure!\n", ttyname );
return -1;
}
tcgetattr(fd, &termios_new);
cfsetispeed(&termios_new,B9600);
cfsetospeed(&termios_new,B9600);
tcflush (fd, TCIOFLUSH);
/* 0 on success, -1 on failure */
if( tcsetattr(fd, TCSANOW, &termios_new) == 0 ) /*success*/
return fd;
return -1;
}
int com_send(int fd, char cmd[],int cmdlen){
int ret;
ret = write(fd,cmd,cmdlen);
if(ret!=cmdlen){
printf("com_send data error,write length[%d],cmdlen[%d]",ret,cmdlen);
return -1;
}else
return cmdlen;
}
int com_receive(int fd, char buffer[],int *retlen){
int ret,k=0,ok = 0;
while(1){
k++;
ret = read(fd,buffer,&retlen);
if(ret>0) {
ok = 1;
break;
}
sleep(1);
if(k>100)break;
} ;
if(ok==0){
printf("com_send data error,write length[%d],cmdlen[%d]",ret,retlen);
return -1;
}else
return cmdlen;
}
关键技术二:二级制数据转换十六进制字符串函数bin2hexString
#define MAX_ORDER_LEN 128
unsigned char* bin2hexString ( unsigned char *cmd, int cmdlen )
{
static char retcmd[MAX_ORDER_LEN*2+1];
int i;
memset( retcmd, 0, sizeof(retcmd) );
for( i = 0; i < cmdlen; i++ ) {
sprintf(retcmd + i * 2, "%02x", cmd[i]);
}
return retcmd;
}
4.5系统测试
4.5.1 获取温度数据测试:
client 端:
图 4-8 client端测试
Server端:
图 4-9 server端显示
4.5.2 设置取温度频率测试
server端:
图 4-10 设置取温度频率
4.5.3 设置查询温度计状态测试
server端:
图 4-11 查询温度计状态
4.6系统部署
一、协议转换软件
对于温度协议转换软件,Client端和温度仪端用串口线连接,Client端 和Server端用网线连接,Server端部署温度仪演示软件。
解压压缩文件,安装虚拟机,在虚拟机中建立共享文件夹,将所用的文件放入WINDOWS与LINUX共享文件夹。进入虚拟机,打开LINUX系统,进入共享文件夹,在WINDOWS下打开文件,进行编辑,保存后,在LINUX下运行终端,然后输入命令 cd /mnt/hgfs/share
在输入命令 gcc tt.c –o tt 进行调试,
查看程序问题,错误,警告,并一一解答,直到调试没有错误。
在输入命令 ./tt 运行程序,查看程序运行情况。
二、演示软件
安装Qt演示软件,设置好环境变量。
5、实习参考资料
< >谭浩强. C语言程序设计[M].北京:清华大学出版社,2010.1.史蒂文斯,拉戈 著,尤晋元,张亚英,戚正伟 译,UNIX环境高级编程,机械工业出版社,2006.5http://www.csdn.net http://www.pudn.com