"景先生毕设|www.jxszl.com

[免费论文]嵌入式程序设计与服务器数据网络编程

2020-05-25 17:52编辑: www.jxszl.com景先生毕设
本篇文章目录导航:[]GPRS通信的电梯远程监控平台构建[第一章]远程监控电梯系统设计探究绪论[第二章]监控系统总体结构设计[第三章]监控数据采集系统[4.1]数据中心应用和设计[4.2-4.4][第五章]远程监控系统功能实现[第六章-参考文献]电梯类远程监控信息系 更多精彩就在: 51免费论文网|www.jxszl.com 
统构建结论与参考文献4.2嵌入式程序设计数据采集程序是本系统软件设计最基本的内容,数据中心的所有数据都需要经由数据采集模块发送和收集.4.2.1微处理器基本配置程序.本系统使用的微处理器具体的型号是德州仪器公司的TM4C123GH6PMI芯片.本系统直接使用前后台程序模式,通过自己编写主控制器芯片的底层配置程序.根据本系统需求,基本的配置是芯片的系统时钟.浮点运算模块.数据传输模块.EEPROM.中断控制器.定时器.通用IO端口等.表4.8是这些芯片内部模块的功能列表,下面将剖析各模块配置的程序.一.系统时钟CLOCK配置程序.voidCLOCK_Init(){SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);//MCLK=80M=200M/2.5}该函数总共配置了4项:SYSCTL_SYSDIV_2_5:系统主时钟频率采用2.5倍分频SYSCTL_USE_PLL:系统时钟设置采用PLLSYSCTL_XTAL_16MHZ:系统时钟频率采用16Mhz晶振SYSCTL_OSC_MAIN:系统使用外部晶振作为时钟源.二.数据传输模块.DMA:voidDMA_Init(){SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);//使能DMA模块时钟uDMAControlBaseSet(DMA_ControlTable);//设置DMA模块控制表地址uDMAEnable();//使能DMA模块进入工作状态}三.浮点运算模块.FPU程序voidFPU_Init(){FPUEnable();//使能浮点运算模块FPUFPULazyStackingEnable();//浮点运算模块FPU工作模式为LazyStacking}四.端口.IO程序voidIO_Init(){SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);//使能GPIOA外设SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);//使能GPIOB外设SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);//使能GPIOC外设SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);//使能GPIOD外设SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE);//使能GPIOE外设}五.中断控制器.NVIC配置程序voidNVIC_Init(){IntPriorityGroupingSet(2);//设置中优先级位数为2,子优先级为1IntMasterEnable();//使能NVIC中断控制器}六.内部定时器.TIMER配置程序voidSystickTimer_Init(){SysTickPeriodSet(SysCtlClockGet()/100);//设置定时器的计数周期为200msSysTickIntEnable();//使能定时器的中断SysTickEnable();//使能定时器}七.内部EEPROM配置程序.uint32_tEEPROM_Init(){uint32_tuiTemp;SysCtlPeripheralEnable(SYSCTL_PERIPH_EEPROM0);//使能内部EEPROM时钟if(EEPROMInit()==EEPROM_INIT_OK)//判断EEPROM是否正常初始化{uiTemp=EEPROMBlockCountGet();//获取EEPROM的块数return(uiTemp);//返回获取的结果}return(0);}这七个对微处理器进行基本功能配置的程序需要在系统上电后先进行调用,调用顺序可按照如表4.9所示:微处理器要进行工作就需要有时钟系统时钟,时钟配置是是否合理直接影响着数据采集模块的工作性能;本系统采用外部晶振给微处理器作为时钟源,频率为16MHz,系统主时钟频率分频采用2.5倍,采用PLL模式.再进行微处理器内部DMA和FPU功能配置.依据实际的应用情况配置中断控制器NVIC.定时器Timer.端口IO,详细配置见该小节前面部分.另外,数据采集模块需要储存比如电子标签.错误代码等信息,需要配置芯片内部EEPROM模块完成这些信息的储存和调用.完成上述微处理器内部部件的配置就能让其正常工作起来.4.2.2串口数据输入输出程序.本系统的数据采集模块的微处理器与GPRSDTU模块之间的数据传输采用串口的方式.串口数据输入输出程序主要指的是对微处理器的UART接口进行配置的程序,发送数据和接收数据.另外,串口数据的接收和发送采用中断的方式来实现功能,还需要编写终端程序.下面将对TM4C123GH6PMI芯片的串口通信程序进行详细的讲解.定义一个Uart_Init()函数,用于配置串口的工作模式和参数:voidUart_Init(){ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);//使能UART0ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);//使能GPIOA端口的UARTTX/RX引脚ROM_GPIOinTypeUART(GPIO_PORTA_BASE,GPIO_PIN_0|GPIO_PIN_0);//配置PA0和PA1为串口通信模式ROM_UARTEnable(UART0_BASE);//使能UART0ROM_UARTConfigSetExpClk(UART0_BASE,ROM_SysCtlClockGet(),9600,UART_CONFIG_WLEN_8|UART_CONFIG_STOP_ONE|UART_CONFIG_PAR_NONE);//配置UATR0端口的波特率为9600,数据位位8位,停止位1位,无校验位ROM_UARTFIFODisable(UART0_BASE);//禁用FIFO功能ROM_GPIOPinConfigure(GPIO_PA0_U0RX);//使能UART0的RX管脚ROM_GPIOPinConfigure(GPIO_PA1_U0TX);//使能UART0的TX管脚HWREG(UART0_BASE+UART_O_CTL)|=UART_CTL_RXE;//开启接收HWREG(UART0_BASE+UART_O_CTL)|=UART_CTL_TXE;//开启发送ROM_UARTIntEnable(UART0_BASE,UART_INT_RX+UART_INT_TX);ROM_IntEnable(INT_UART0);//使能UART0的中断}Uart_Send(uint8_tlength)函数,用于串口发送数据,有一个输入值,是指待发送数据块的数据长度.voidUart_Send(uint8_tlength){unit16_tinter_Status;inter_Status=ROM_UARTIntStatus(Uart1_BASE,true);//获取中断状态ROM_UARTIntClear(UART0_BASE,inter_Status);//清除中断标准位if(inter_Status&UART_INT_TX)//判断是否有发送中断{for(transmit_len=0;transmit_len<=length;transmit_len++){ROM_UARTCharPutNonBlocking(UART1_BASE,transmit_data.data[transmit_len]);//发送数据}UART_trans_delay=TRANSMIT_DELAY;//发送完成延时ROM_TimerLoadSet(TIMER0_BASE,TIMER_A,TheSysClock*1/1000);//设置延时1msROM_TimerEnable(TIMER0_BASE,TIMER_A);//使能定时器A}}Uart_Read(uint8_tlength),本函数作用是接收数据块,有一个接收到数据长度的参数.voidUart_Send(uint8_tlength){unit16_tinter_Status;inter_Status=ROM_UARTIntStatus(Uart1_BASE,true);//获取中断状态ROM_UARTIntClear(UART0_BASE,inter_Status);//清除中断标准位if(inter_Status&UART_INT_RX)//判断是否有接收数据中断{for(receive_len=0;receive_len<=length;receive_len++){receive_data.data[transmit_len]=ROM_UARTCharGetNonBlocking(UART0_BASE);//接收数据}ROM_TimerLoadSet(TIMER0_BASE,TIMER_A,TheSysClock*1/500);//设置延时2msROM_TimerEnable(TIMER0_BASE,TIMER_A);//使能定时器A}}微处理器上电完成基本功能的配置和串口的初始化后,就能够进行串口数据的通信.数据的接收和发送要在对方模块处于空闲的状态,否则会导致数据无法进行传输甚至是数据丢失.一般情况下,微处理器会按照系统设定好的时间间隔自动地去获取电梯的运行状态信息,并通过串口将数据传给GPRSDTU.在数据采集模块正在与DTU进行数据的传输时,电梯发生故障而通过CAN总线通信将故障信息传输过来.在这种情况下,微处理器需要中断与DTU之间的输出传输,转而去接收和处理故障信息.要实现这个功能就要给系统配置多个中断服务程序,将故障信息传输的中断设置为高优先级别,同时从电梯主控板引入发生故障的外部中断信号接到微处理器.为了保证电梯的数据能够实时的被采集到,本系统的串口中断服务程序的优先级设置为2,属于第三优先级,但级别低于电梯发生故障的中断信号.4.3数据帧格式设计数据采集模块将接收到的数据传到GPRSDTU进行无线发送前,需要对发送的数据制定一个统一的格式,也就是所谓的数据帧格式.数据包帧格式的定义如图4.5所示:数据帧的开始由起始标志定义,起始标志是十六进制的0xFE.0x3A.0xFE.电梯编码代表该帧的数据是哪个电梯的数据采集模块要进行数据的传输,该编码同一系统下不可重复.电梯编码占据一个字节长度,最多可以支持0-255号,因此本系统最多支持256个电梯连接入.数据种类分为发送数据和接收数据.发送数据指的是微控制器发送给GPRSDTU的数据帧,接收数据指的是GPRSDTU发送给微控制器的数据包.其定义如表4.10所示:监控系统传输的数据会有很多类型,这就需要专门设定一个字节来进行区分.数据的类型区分,能够让系统辨别出当前传输数据的内容是代表着什么,否则系统将无法识别接收到的数据代表着什么;该数据也就失去了意义,是一个无效的数据.数据类型与代码之间的关系如表4.11所示:每次传输的数据帧内部运载的数据数量可能会不相同,这就需要数据长度表明后面紧接着数据的大小.该字节设置能够在一定程度上提高系统对数据的识别能力和减少对数据丢失的影响.本系统发送的数据帧里数据量最大字节数为64个,用一个字节来表示数据大小完全能够满足.数据就是该数据帧所要传输的数据具体内容.该部分传输的数据会包含区分数据类别编码,主要用于对同一类型的数据进行更加详细的区分.由于受篇幅限制,本文不列出所有的数据字符分别是表示什么意义.下面针对每个数据类型做解释和举例个例:第一种数据类型为0x01,它包括用户信息,产品信息及安装在电梯上的各模块的信息等,比如各电路板的厂家和版本信息,各传感器状态信息,数据采集板工作状态信息,电梯主控板和轿顶板工作信息等.第二种数据类型为0x02,数据内容是电梯运行状态数据,比如时间信息,电梯所处地理位置,轿厢所处楼层位置,电梯载重,电梯运行速度和加速度,轿门关闭状态,电梯内温湿度等.第三种数据类型为0x03,代表着电梯故障报警信息,比如电梯供电故障,过载告警,轿门无法完全关闭,失速故障,欠压过压,欠流过流,RTC时钟故障,逻辑故障,位置异常等.第四种数据类型为0x04,是监控中心工作人员通过计算机软件对电梯进行远程控制指令数据,比如启动/停止电梯运行,播报语音,获取电梯信息,异常复位,修改电梯参数等.在数据之后是校验位,用于检测错误,保证通信中的数据有效性.在校验位之后就是结束标志,使用十六进制的0xFE.0x30.0xFE.合理的数据帧格式的设计可以有效地对数据进行分类,提供整个系统的工作效率.由于GPRSDTU传输的数据是透明的,数据中心对接受到的数据进行解析也要使用该数据帧格式.4.4服务器数据网络编程本节将介绍服务器与各GPRSDTU之间进行数据通信,数据剖析处理.储存等功能的编程.服务器数据网络编程会涉及到网络编程的工具.平台.以及人机交换界面.4.4.1Socket的概述.一个能够正常进行数据传输的网络通信是需要两个端口号的,这个连接的端口号就称之为Socket.Socket就是用于实现网络上的两个程序之间相互连接和双向通信的数据交换[36].它起源于UNIX,是作为BSDUNIX的进程通信机制,描述的是网络的进程通信的三元组.网络通信的两端都会先自行建立一个本地唯一的socket号,客户端能根据服务端的地址建立一个五元组的网络的进程通信.Socket分为数据流套接字(streamsocket).数据报套接字(datagramsocket)和原始数据套接字(rawsocket).1.Streamsocket是以保证通信信息完整为目的提供面向连接,实现网络通信稳定可靠的数据传输.它是TCP传输协议的接口.Streamsocket可以对传输的数据进行流量的可控制,防止发生堵塞现象.因此,传输的数据被应用程序视作字节流,能够进行任意长度数据的发送.2.Datagramsocket是UPD数据报服务的接口.UPD传输的数据是不可靠的,会有丢包和错误问题的发生.数据传输是在无序的.相互独立的数据包进行.3.Rawsocket接口允许用户对底层协议进行直接存取,提供了网络协议调试和测试的接口.Socket其工作流程示意图如图4.6所示:4.4.2数据通信C++Builder编程.我们的开发环境采用C++Builder6.0.该开发环境对客户端和服务器端之间的socket连接和通信操作是使用ClientSocket和ServerSocket两个控件来完成的.在实现客户端与服务器端之间的通信应用中,应用程序的开发是使用TCustomWinSocket及其派生类TClientWinSocket.TServerWinSocket.TServerClientWinSocket操作Socket.Socket分为阻塞式和非阻塞式两种连接方式.如果将客户端Clientype或者服务器端Servertype的属性设置为非阻塞方式,只要有一方要进行读写另一方就会得到相应的通知触发OnRead或者OnWrite事件.OnRead或者OnWrite事件在阻塞式连接中是不会产生的,客服端要先主动去读写数据.在C++Builder6.0环境下,通过ServerSocket控件能完成数据中心服务器的功能.具体的实现方法和步骤如下所示:1.端口的绑定.ServerScoket控件里有Port属性值,通过设置该属性值可实现端口的绑定,采用TCP/IP模式进行数据传输,端口号为5001.2.打开服务器ServerScoket连接,准备接收客户端的请求信息.3.当服务器端ServerScoket接收客户端的请求时,将触发其OnClientConnt事件,客户端的地址和请求信息可在此事件中进行处理.void_fastcallTFrame3::ServerSocket1ClientConnet(TObject*Sender,TCustomWinSocket*Socket){/*……*///添加程序代码}4.对接入的客户端的地址和请求信息进行解析在OnAccpet事件中执行,服务器ServerScoket接收客户端的请求会触发该事件.void_fastcallTFrame3::ServerSocket1Accept(TObject*Sender,TCustomWinSocket*Socket){/*……*///添加程序代码}5.对传送过来的数据进行剖析和处理在OnClientRead事件中完成,当服务器探测有数据从客户端发过来时,将触发该事件.void_fastcallTFrame3::ServerSocket1ClientRead(TObject*Sender,TCustomWinSocket*Socket){/*……*///添加程序代码}6.关闭服务器或者客户端Socket,同样我们可以在其对应响应事件添加相应的处理程序代码.在服务器端和客户端进行数据通信的过程中,可采用我们制定的数据帧格式和报文发送的格式,并由客户端发送或者接受数据.void_fastcallTFrame3::ServerSocket1ClientRecv(TObject*Sender,TCustomWinSocket*Socket){/*……*///添加程序代码}4.4.3电梯运行数据库管理设计.为了提高远程监控系统对电梯的运行状态和运转性能的掌握,需要建立数据库来实时存放电梯运行的参数和各项记录,本系统使用SQLServer2000来建立数据库.这些数据来自于被监控站点的GPRSDTU发送来的数据和数据中心服务器向被监控站点的GPRSDTU发送的数据[37].考虑到实际使用时方便进行维护,传输的数据里给每个事件都给加上时间戳,这样就能让监控人员准确的知道电梯发送故障和报警的具体时间,利于问题的定位,同时需要注意的是被监控站点的时间必须与数据中心的时间是相同的.在电梯运行记录数据库中建立一个记录DTU的SIM卡号.IP地址.状态.上线时刻.对应电梯编号和电梯健康状态的信息表;一个专门用于记录DTU项数据中心服务器发送数据的信息表;一个用于记录数据中心服务器向被监控站点DTU发送的数据的信息表.这样,共有三个表来记录DTU和数据中心服务器之间的信息数据交换.如果用户需要相应的数据记录,只要通过对这三个信息表进行查询就能带到想要的信息,从而清晰地掌握电梯运行状态信息,图4.7是登录后监控DTU信息和连接状态的管理界面的示意图:注:本系统最多支持监控256个电梯,这里电梯编号共六位,后三位是电梯编码,前三位用来代表电梯的用途或者是类型;图中0000001:000代表乘客电梯,001代表电梯的编码.数据库管理的数据还涉及到对使用本系统的使用单位.维护人员和管理员信息,可支持添加.删除用户和修改用户参数(用户参数包括:账号.姓名.工号.所属单位.权限.密码等)等功能.为了数据的安全,我们给所有的数据都加上权限,有访问权限的用户才能对信息进行访问;同时发送指令也要设定权限.本章介绍的系统软件开发需要实现的基本功能,由于篇幅的限制不能详细的展开各功能需要怎么实现和说明,只是稍微讲解其开发的思路和程序的使用方法.
原文链接:http://www.jxszl.com/lwqt/mflw/13727.html