嵌入式实验报告
- 格式:doc
- 大小:522.00 KB
- 文档页数:14
嵌入式实验四实验报告实验四:嵌入式编程设计
实验设计目的:
1. 学习使用嵌入式开发工具进行编程设计;
2. 学习使用C语言编写嵌入式程序;
3. 学习使用GPIO模块进行输入输出;
4. 学习使用中断处理函数。
实验器材:
1. 嵌入式开发板;
2. USB数据线;
3. 电脑;
4. LED灯;
5. 电阻;
6. 蜂鸣器;
7. 其他必要的电路元件。
实验步骤:
1. 连接开发板和计算机,安装开发板驱动程序;
2. 打开嵌入式开发工具,创建一个新的工程;
3. 在工程中添加一个C文件,编写程序;
4. 编写程序实现以下功能:
- 使用GPIO模块控制LED灯的亮、灭;
- 使用GPIO模块读取按键状态;
- 使用GPIO模块控制蜂鸣器的开、关;
- 使用Timer模块计时;
- 使用中断处理函数处理外部中断;
- 其他必要的功能;
5. 编译程序,下载到开发板;
6. 运行程序,测试功能是否正常。
实验结果与分析:
实验结果应当是LED灯、蜂鸣器、按键正常工作,可以通过按键控制LED灯的亮、灭、蜂鸣器的开、关。
实验总结:
通过本次实验,我学会了使用嵌入式开发工具进行编程设计,掌握了使用C语言编写
嵌入式程序的方法。
通过实验,我深入理解了嵌入式系统的原理和实现方法,对嵌入
式系统的应用有了更加深入的了解。
在今后的学习和工作中,我将能够更好地运用嵌
入式技术解决实际问题。
一、实验背景嵌入式系统在现代工业、消费电子、智能家居等领域扮演着越来越重要的角色。
为了让学生深入了解嵌入式系统的设计原理和开发过程,提高学生的实践能力和创新精神,我们开设了嵌入式实训课程。
本次实验报告将针对实训课程中的部分实验进行总结和分析。
二、实验目的1. 掌握嵌入式系统的基本原理和开发流程。
2. 熟悉嵌入式开发工具和环境。
3. 熟练使用C语言进行嵌入式编程。
4. 学会调试和优化嵌入式程序。
三、实验内容本次实训课程共安排了五个实验,以下是每个实验的具体内容和实验步骤:实验一:使用NeoPixel库控制RGB LED灯带1. 实验目的:学习使用NeoPixel库控制RGB LED灯带,实现循环显示不同颜色。
2. 实验步骤:(1)搭建实验平台,连接NeoPixel LED灯带。
(2)编写程序,初始化NeoPixel库,设置LED灯带模式。
(3)通过循环,控制LED灯带显示不同的颜色。
实验二:使用tm1637库控制数码管显示器1. 实验目的:学习使用tm1637库控制数码管显示器,显示数字、十六进制数、温度值以及字符串,并实现字符串滚动显示和倒计时功能。
2. 实验步骤:(1)搭建实验平台,连接tm1637数码管显示器。
(2)编写程序,初始化tm1637库,设置显示模式。
(3)编写函数,实现数字、十六进制数、温度值的显示。
(4)编写函数,实现字符串滚动显示和倒计时功能。
实验三:使用ds18x20库和onewire库读取DS18B20温度传感器的数据1. 实验目的:学习使用ds18x20库和onewire库读取DS18B20温度传感器的数据,并输出温度值。
2. 实验步骤:(1)搭建实验平台,连接DS18B20温度传感器。
(2)编写程序,初始化ds18x20库和onewire库。
(3)编写函数,读取温度传感器的数据,并输出温度值。
实验四:使用ESP32开发板连接手机热点,并实现LED1作为连接指示灯1. 实验目的:学习使用ESP32开发板连接手机热点,并通过LED1指示灯显示连接状态。
嵌入式系统实验报告学院:计算机科学与工程姓名:___________学号:_______________专业:_______________指导老师:______________完成日期:______________实验一:流水灯案例、8位数码管动态扫描案例一、实验目的1.1 进一步熟悉Keil C51集成开发环境调试功能的使用;1.2 学会自己编写程序,进行编译和仿真测试;1.3 利用开发板下载hex 文件后验证功能。
二、实验原理2.1 :实验原理图030B 〜I ।卜RSI I ™Hi 」 口 UICDR Hr hJJK RR 18q U I. 海水灯电浒周LhE U_EEM^Li > > 第 X > k >n - » =白 L a £0EBS2.2:工作原理2.2.1:流水灯电路中有LO,1,L2,L3,4,L5,L6,L7共八个发光二极管,当引脚LED_ SEL输入为1,对于A、B、C、D、E、F、G、H引脚,只要输入为1,则点亮相连接的发光二极管。
A〜H引脚连接STM32F108VB芯片的PE8〜PE15,程序初始化时,对其进行初始设置。
引脚LED_SEL为1时,发光二极管才工作,否则右边的数码管工作。
注意,LED SEL 连接于PB3,该引脚具有复用功能,在默认状态下,该引脚的I0不可用,需对AFIO_ MAPR寄存器进行设置,设置其为10可用。
2.2.2: 8位数码管数码管中的A~G、DP段分别连接到电路图中的A~G、H线上,当某段上有一-定的电压差值时,便会点亮该段。
当£3输入为1,也就是LED_ 5£1输入为0时,根据SELO〜SEL2的值确定选中的数码管,即位选,再根据A~H引脚的高低电平,点亮对应段,即段选。
三、实验结果3.1:流水灯对于给出的流水灯案例,下载HEX文件后,在开发板上可观察到L0-L7从左至右依次点亮,间隔300ms。
嵌入式实训报告范文 (2)嵌入式实训报告范文 (2)精选2篇(一)嵌入式实训报告一、实训背景嵌入式系统是一种以具体任务为中心,集成了硬件与软件的计算机系统。
由于其体积小、功耗低、功能强大等特点,嵌入式系统被广泛应用于各个领域,如家电、汽车、医疗等。
通过参与嵌入式实训,我希望能够掌握嵌入式开发的基本原理和方法,提高自己的实践能力。
二、实训目标1.掌握嵌入式系统的基本知识和开发工具的使用;2.了解嵌入式系统的硬件架构和软件设计流程;3.能够根据需求设计并实现简单的嵌入式系统。
三、实训内容1.学习嵌入式系统基础知识:通过课堂教学和自主学习,了解了嵌入式系统的概念、特点及应用领域。
深入学习了ARM架构和C语言的基本知识,并进行了相应的实践操作。
2.学习嵌入式开发工具的使用:学习了Keil MDK和IAR Embedded Workbench等常用的嵌入式开发工具的安装和配置方法。
通过实操操作,掌握了调试、编译、下载等基本功能的使用。
3.学习嵌入式系统设计流程:了解了嵌入式软件开发的常用流程,包括需求分析、系统设计、编码实现、调试测试、系统验证等。
通过案例分析和实践操作,对嵌入式系统设计流程有了更深入的了解。
4.设计并实现简单的嵌入式系统:根据实训要求,我选择了一个简单的嵌入式系统项目,通过分析需求、设计系统架构、编写软件代码、调试测试等环节,最终成功完成了项目。
四、实训总结及收获通过参与嵌入式实训,我不仅掌握了嵌入式系统的基本知识和开发工具的使用,还锻炼了自己的实践能力。
我深刻认识到嵌入式系统开发需要全面的知识储备和较高的技术水平,同时也需要良好的分析、设计和沟通能力。
通过实训,我对嵌入式系统开发流程有了更深入的理解,对嵌入式系统的设计和开发也有了更高的认识和要求。
在未来的学习和工作中,我会继续深入学习嵌入式系统开发相关知识,并不断提高自己的实践能力。
嵌入式系统是未来的发展方向,通过不断探索和实践,我相信我能够在这个领域取得更好的成果。
嵌入式实训报告范文嵌入式实训报告范文精选2篇(一)嵌入式实训报告一、实训目的和背景嵌入式实训的目的是通过设计和实现一个嵌入式系统,培养学生的嵌入式系统开发才能和团队协作才能。
本次实训的背景是为了满足社会对嵌入式系统开发人才的需求,进步学生的实际动手才能。
二、实训内容1. 硬件平台的选择和搭建:选择了一款ARM开发板作为硬件平台,并搭建了相应的开发环境。
2. 系统设计和分析:根据实训要求,我们团队设计了一个智能门锁系统,包括用户认证、门锁控制和远程监控功能。
3. 软件开发:使用C语言和嵌入式开发工具进展软件开发,实现了用户认证、门锁控制和远程监控等功能。
4. 硬件连接和调试:将开发板和相关传感器、执行器等硬件设备进展连接和调试,确保系统可以正常运行。
5. 功能测试和调优:对系统进展全面测试,发现并修复了一些问题,并对系统进展了性能优化。
三、实训心得和体会通过本次实训,我深入认识到嵌入式系统开发的复杂性和挑战性。
在实训过程中,我们团队遇到了许多问题,比方硬件和软件的兼容性、性能优化等方面。
但是通过团队的努力和合作,我们成功解决了这些问题,并完成了一个功能完善的嵌入式系统。
此外,我还学到了许多软件开发和硬件调试的技巧,进步了自己的实际动手才能。
在团队协作方面,我们团队成员之间互相配合,共同解决问题,形成了良好的协作机制。
总结起来,本次嵌入式实训让我受益匪浅,学会了许多实际应用的技能和知识,并进步了自身的综合才能。
四、实训成果展示在实训完毕后,我们团队成功完成了一个智能门锁系统,具备用户认证、门锁控制和远程监控等功能。
系统的稳定性和可靠性得到了验证,并且在实际使用中得到了积极的反应。
附图:〔展示系统界面、硬件设备连接示意图等〕五、实训改良意见尽管本次实训获得了良好的成果,但仍有一些方面需要改良。
首先,实训的时间安排可以更合理一些,以便更充分地利用时间进展理论操作。
其次,可以增加一些真实场景的案例分析和解决方案的设计,以提升学生的实际应用才能。
嵌入式实习报告(共5篇)第一篇:嵌入式实习报告一、嵌入式系统开发与应用概述在今日,嵌入式ARM 技术已经成为了一门比较热门的学科,无论是在电子类的什么领域,你都可以看到嵌入式ARM 的影子。
如果你还停留在单片机级别的学习,那么实际上你已经落下时代脚步了,ARM 嵌入式技术正以几何的倍数高速发展,它几乎渗透到了几乎你所想到的领域。
本章节就是将你领入ARM 的学习大门,开始嵌入式开发之旅。
以嵌入式计算机为技术核心的嵌入式系统是继网络技术之后,又一个IT领域新的技术发展方向。
由于嵌入式系统具有体积小、性能强、功耗低、可靠性高以及面向行业具体应用等突出特征,目前已经广泛地应用于军事国防、消费电子、信息家电、网络通信、工业控制等各个领域。
嵌入式的广泛应用可以说是无所不在。
嵌入式微处理器技术的基础是通用计算机技术。
现在许多嵌入式处理器也是从早期的PC 机的应用发展演化过来的,如早期PC 诸如TRS-80、Apple II 和所用的Z80 和6502 处理器,至今仍为低端的嵌入式应用。
在应用中,嵌入式微处理器具有体积小、重量轻、成本低、可靠性高的优点。
嵌入式处理器目前主要有Am186/88、386EX、SC-400、Power PC、68000、MIPS、ARM 等系列。
在早期实际的嵌入式应用中,芯片选择时往往以某一种微处理器内核为核心,在芯片内部集成必要的ROM/EPROM/Flash/EEPROM、SRAM、接口总线及总线控制逻辑、定时/计数器、WatchDog、I/O、串行口、脉宽调制输出、A/D、D/A 等各种必要的功能和外设。
二、实习设备硬件:Embest EduKit-IV实验平台、ULINK2仿真器套件、PC机软件:μVision IDE for ARM集成开发环境、Windows 98/2000/NT/XP三、实习目的1.初步掌握液晶屏的使用及其电路设计方法;掌握S3C2410X处理器的LCD控制器的使用;掌握通过任务调用的方法把液晶显示函数添加到uC/OS-II中;通过实验掌握液晶显示文本及图形的方法与程序设计。
嵌入式实习报告7篇嵌入式实习报告篇1蓝牙技术概述蓝牙(Bluetooth)是目前比较流行的一种短距离无线通讯技术,其主要目的就是要在全世界范围内建立一个短距离的无线通信标准。
设计者的初衷是用隐形的连接线代替线缆。
它取代目前多种电缆连接方案,通过统一的短程无线链路,在各信息设备之间可以穿过墙壁或公文包,实现方便快捷、灵活安全、低成本小功耗的话音和数据通信。
“蓝牙”技术的目的是使特定的移动电话、便携式电脑以及各种便携式通信设备的主机之间在近距离内实现无缝的资源共享。
一、实践目的了解处理器的发展掌握WinCE嵌入式系统开发方法和开发流程。
掌握WinCE嵌入式C#编程方法。
掌握WinCE嵌入式络通信技术。
掌握Bluetooth编码技术二、实践要求1. 了解WinCE操作系统的裁剪及定制;2. 设计蓝牙广播系统(包括服务器端和客户端);3.设计蓝牙文件传输系统(包括服务器端和客户端);4. 应用程序安装和部署。
三、实践内容(1)了解Wince平台了解处理器的发展,什么是嵌入系统,嵌入式系统的应用,以及窗体与控件的概念,掌握WinCE嵌入式C#编程方法,对实验平台有一定的认识,更进一步的认识蓝牙。
了解编写应用程序的流程,理解了Windows 窗体,学会了使用基本控件如标签、文本、按钮、列表框和组合框,掌握窗体的常用属性和方法。
(2)蓝牙搜索、浏览与发送,蓝牙设备列表,配对设备清空,删除。
四、原理介绍1.嵌入式系统:嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。
一般由硬件设备、嵌入式操作系统、嵌入式应用软件组成。
具有专用性、高效简洁性、高可靠和低能耗性、自身特殊性的特点。
嵌入式实习报告篇2此次设计我们采用以LM3S2100为微控制器,并通过硬件和软件两方面设计,结合6位LED数码管,放大整形电路,来实现频率计在嵌入式系统中的开发与应用。
第1篇一、实验目的1. 理解嵌入式系统挂载的基本原理和流程。
2. 掌握使用Linux内核进行挂载操作的方法。
3. 学习开发简单的文件系统,实现挂载功能。
4. 增强实践能力,提高嵌入式系统开发水平。
二、实验环境1. 操作系统:Ubuntu 18.042. 编程语言:C/C++3. 开发工具:gcc、make、vim4. 实验平台:Linux虚拟机三、实验内容1. 理解挂载的概念及作用2. Linux内核挂载机制3. 文件系统开发4. 挂载系统设计与实现四、实验步骤1. 理解挂载的概念及作用挂载是指将文件系统加载到操作系统的文件系统中,使得用户可以访问该文件系统中的文件和目录。
挂载是嵌入式系统中常用的功能,例如,在Android系统中,需要挂载外部存储设备(如SD卡)才能访问其中的文件。
2. Linux内核挂载机制Linux内核通过VFS(虚拟文件系统)来实现文件系统的挂载。
VFS为所有文件系统提供了一个统一的接口,使得用户可以在不知道具体文件系统类型的情况下,访问文件和目录。
挂载过程大致如下:(1)用户或应用程序请求挂载文件系统;(2)内核调用挂载函数,查找对应的文件系统模块;(3)加载文件系统模块;(4)调用文件系统的挂载函数,将文件系统挂载到指定的挂载点;(5)用户或应用程序可以通过挂载点访问文件系统中的文件和目录。
3. 文件系统开发本实验中,我们将开发一个简单的文件系统,实现挂载功能。
以下是文件系统的主要功能:(1)支持创建、删除、读取、写入文件和目录;(2)支持文件和目录的权限设置;(3)支持文件系统的挂载和卸载。
文件系统开发步骤如下:(1)定义文件系统结构体,包括文件系统信息、超级块、inode表、数据块等;(2)实现文件系统初始化函数,创建超级块、inode表、数据块等;(3)实现文件和目录的创建、删除、读取、写入等操作;(4)实现文件系统的挂载和卸载功能。
4. 挂载系统设计与实现挂载系统主要包括以下模块:(1)挂载模块:负责加载文件系统模块,调用文件系统的挂载函数;(2)卸载模块:负责卸载文件系统模块,调用文件系统的卸载函数;(3)文件系统模块:负责实现文件系统的各种操作。
一、实验目的1. 熟悉嵌入式系统开发的基本流程和常用工具;2. 掌握嵌入式系统硬件资源的使用方法;3. 熟悉嵌入式系统软件开发的基本方法;4. 提高嵌入式系统设计能力。
二、实验内容1. 硬件平台:基于STM32F103系列单片机的开发板;2. 软件平台:Keil uVision5集成开发环境;3. 实验任务:设计一个简单的嵌入式系统,实现按键输入和LED灯控制功能。
三、实验原理1. 硬件原理:STM32F103系列单片机是一款高性能、低功耗的ARM Cortex-M3内核微控制器,具有丰富的片上外设资源,如GPIO、定时器、ADC等。
在本实验中,主要使用GPIO进行按键输入和LED灯控制。
2. 软件原理:嵌入式系统软件开发主要包括底层驱动程序、中间件和应用层。
底层驱动程序负责硬件资源的管理和配置;中间件提供系统服务,如通信、定时器等;应用层实现用户功能。
在本实验中,主要使用C语言编写程序,实现按键输入和LED灯控制功能。
四、实验步骤1. 硬件连接:将开发板上的按键和LED灯分别连接到单片机的GPIO端口;2. 软件编写:(1)创建项目:在Keil uVision5中创建一个新的项目,选择STM32F103系列单片机作为目标设备;(2)添加源文件:添加一个C语言源文件,用于编写主程序;(3)配置GPIO:在源文件中编写GPIO初始化代码,配置按键和LED灯的GPIO端口为输入和输出模式;(4)编写按键输入程序:编写按键扫描函数,用于检测按键状态,并根据按键状态控制LED灯;(5)编译程序:编译项目,生成目标文件;(6)下载程序:将编译好的程序下载到开发板;3. 实验验证:在开发板上运行程序,观察按键输入和LED灯控制功能是否正常。
五、实验结果与分析1. 实验结果:按键按下时,LED灯点亮;按键松开时,LED灯熄灭;2. 实验分析:通过编写程序,实现了按键输入和LED灯控制功能,验证了嵌入式系统开发的基本流程和常用工具。
嵌入式实习报告嵌入式实习报告(精选5篇)在生活中,报告的用途越来越大,我们在写报告的时候要注意逻辑的合理性。
相信许多人会觉得报告很难写吧,以下是店铺精心整理的嵌入式实习报告(精选5篇),希望对大家有所帮助。
嵌入式实习报告篇1一、实习时间20xx年4月12日-20xx年4月26日二、指导教师姓名陈xx三、实习地点长沙市牛耳服务外包实训基地四、实习目的与内容对于嵌入式项目进行学习培训,掌握嵌入式的主要项目及相关技术五、实习收获与体会一转眼半个月的实习生活过去了,现在我已经回到学校,回想起半个月的实习生活,自己学到了很多,懂得了很多。
真的说不出是什么感觉,伴着时间,就像是在和自己的影子赛跑,不可能从真实的两面去看清它,只是经意不经意的感受着有种东西在过去,也许更适合的只有那句话:时不待我,怎可驻足。
原以为实习对于我来说会是很长,但实际却不同。
想象收获的东西,真的很多,看看我的工作笔记,一篇又一篇,记别人的事情比自己的还多,也许实习,并不像我想象中的那样轻松惬意,而是充满了挑战和艰辛。
我给自己敲响了警钟:“不要半途而废,做事情切忌三分热度。
”我信心十足的回答到:“我一定会坚持到底!”天下英雄皆我辈,一入江湖立马催。
” 从学校到社会的大环境的转变,身边接触的人也完全换了角色,老师变成老板,同学变成同事,相处之道完全不同。
在这巨大的转变中,我们可能彷徨,迷茫,无法马上适应新的环境,但在同学、同事的帮助和自己摸索的情况下,我还是完成了这次实习。
但我发现,以我们的经验,不学到一定的深度和广度是难以在实际工作中应付自如的。
因此反映出学习的还不够,缺点疏漏。
需在加以刻苦钻研及学习,不断开拓视野,增强自己的实践操作技能,我们也许看不惯企业之间残酷的竞争,无法忍受同事之间漠不关心的眼神和言语。
很多时候觉得自己没有受到领导重用,所干的只是一些无关重要的杂活,自己的提议或工作不能得到老板的肯定。
做不出成绩时,会有来自各方面的压力,老板的眼色同事的嘲讽。
中国地质大学(北京) 实验报告课程名称:嵌入式系统实验名称:嵌入式 Linux Socket编程姓名:程维安学号: 1010122231班级: 10101222指导教师:曾卫华评分:实验时间:二零一六年四月实验题目:嵌入式Linux Socket编程一、实验目的通过实验熟悉Linux环境,掌握Linux串口和网络应用程序开发。
学会串口的设置,串口数据收发处理,阻塞型I/O和非阻塞型I/O,SOCKET套接字,多线程编程基础,Server和Client端程序设计。
二、实验内容和步骤1.4.4.3交叉编译工具的PATH已经生效,在任意目录下能够执行arm-linux-gcc –v;2.nfs网络文件系统的配置:○1打开nfs1175.exe;○2配置板子ip,使其和电脑ip在同一个网段(使用命令ifconfig eth0 115.25.74.176 netmask 255.255.255.0);○3挂载:在板子上运行 #mount -t nfs -o nolock 115.25.74.175:/d/share_vm /mnt/nfs ○4使用 cd /mnt/nfs 进入nfs共享目录,ls 显示共享目录下的文件;3.仔细阅读提供的代码server.c和client.c Target为服务器,Ubuntu为客户端;4.交叉编译server.c、本地编译client.c(因为用到多线程编程,在编译语句后面加上-lpthread);5.在板子上运行server可执行文件:#cd /mnt/nfs#ls -l server 看看前面的字串里面有没有“x”,如没有则表明没有可执行的权限,需要用命令加入server的执行权限:#chmod 777 server,运行server 代码 #./server;6.在ubuntu上运行client程序:#./client 115.25.74.176;7.观察服务器端和客户端的提示信息。
三、程序流程框图和源码1.流式套接字工作过程,如图1所示图1 流式套接字工作过程2.工作过程以太网○1用户从串口输入信息,将串口信息转发至以太网,在ubuntu 上编写client 端程序,将收到的网络数据打印出来;○2用户从ubuntu 中client 端输入信息,client 将位信息发送至以太网,嵌入式linux 收到以太网信息从串口输出该信息。
3.源码更改过的源码见附录。
四、 实验结果1.挂载成功后串口显示,如图2所示图2 挂载截图2.编译之后得到的目标代码,如图3所示图3 目标代码编译成功3.客户端与服务器连接,如图4,图5,图6所示图4 等待连接中图5 ubuntu中显示连接成功图6 串口中显示连接成功4.结果验证,如图7所示在串口中输入姓名(yangsen)和班级(10101021),在ubuntu中显示相应的结果;在ubuntu中输入姓名(yangsen)和班级(10101021),在串口中显示相应的结果。
图7 验证通讯结果五、实验体会本学期的所有实验都是在PC和AT91RM9200目标板上进行。
在实验中,我们先建立硬件实验平台,再建立主机软件开发环境,接着为实验进行各项配置,最后完成了各个实验中的多种功能。
值得重视的是,前期的硬件、软件准备必须完整无误地实现,这是后续实验能顺利进行的前提。
本实验中,前面已经给出了串口程序和socket编程的程序,但是需要我们来修改和完善原有的代码,在其基础上实现新的功能。
经过了一学期的学习,我发现学习嵌入式linux开发的关键在于实践。
刚开始接触嵌入式linux的时候,感觉非常麻烦。
经过一段时间的学习,我理解了开源的重要性以及发现了linux 操作系统的强大。
我已经较为熟练的掌握了linux的入门知识,完成了建立实验软件开发平台,搭建实验编译软件环境,在PC上编辑、编译一个应用程序,并且在嵌入式系统上运行和调试。
课堂的7个实验都成功地完成。
通过这学期的实验,我了解了一套完整的嵌入式系统简单的开发的全过程。
这对于以后嵌入式的学习和应用有非常大的帮助!感谢曾老师的辛勤指导!附录:1.server.c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/ioctl.h>#include <fcntl.h>#include <unistd.h>#include <termios.h>#include <stdlib.h>#include <errno.h>#include <time.h>#include <sys/time.h>#include <linux/rtc.h>#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <unistd.h>#include <netinet/in.h>#include <arpa/inet.h>#include <pthread.h>#define SERVER_PORT 20000 //define the defualt connect port id #define LENGTH_OF_LISTEN_QUEUE 10 //length of listen queue in server #define BUFFER_SIZE 256#define WELCOME_MESSAGE "welcome to connect the server."#define COM0 0#define BLOCK_MODE 1#define NONBLK_MODE 0int fd;static struct termios g_newtio,g_oldtio;static int speed_arr[] ={B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300,B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200, B300,};static int name_arr[] ={115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200, 300,115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200, 300,};int Init_COM(int Comm,int Baudrate,int Parity,int Stopbit,int Flagblock){int ret,i;char dev_buf[16];if(Comm > 3){printf("Com%d not exist\n",Comm);return -1;}memset(dev_buf,0x00,sizeof(dev_buf));sprintf(dev_buf,"/dev/ttyS%d",Comm);if(Flagblock){ret = open(dev_buf, O_RDWR | O_NOCTTY ); // 以默认阻塞方式打开;}else{ret = open(dev_buf, O_RDWR | O_NOCTTY | O_NONBLOCK); //以非阻塞方式打开;}if(ret < 0){printf("Open ttyS%d failed\n",Comm);return -1;}if( tcgetattr(ret, &g_oldtio) < 0 ){printf("Get Com Parameter Error.\n");return -1;}for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++){if(Baudrate == name_arr[i]){cfsetispeed(&g_newtio,speed_arr[i]);cfsetospeed(&g_newtio,speed_arr[i]);break;}}if(i>=sizeof(speed_arr) / sizeof(int)){printf("Unsupported Speed!\n");return -1;}switch (Parity){ // 设置奇偶校验位数case 'n':case 'N':g_newtio.c_cflag &= ~PARODD; //very important; zwhg_newtio.c_cflag &= ~PARENB; /* Clear parity enable */ break;case 'o':case 'O':g_newtio.c_cflag |= PARENB; /* Enable parity */ g_newtio.c_cflag |= PARODD; /* 设置为奇效验*/ break;case 'e':case 'E':g_newtio.c_cflag |= PARENB; /* Enable parity */g_newtio.c_cflag &= ~PARODD; /* 转换为偶效验*/ break;default:printf("Unsupported Parity\n");return -1;}/*stop bit */switch(Stopbit){case 1:g_newtio.c_cflag &= ~CSTOPB;break;case 2:g_newtio.c_cflag |= CSTOPB;break;default:printf("Unsupported Stopbit!\n");return -1;}g_newtio.c_iflag = 0; //输入无校验g_newtio.c_oflag = 0; //输出不处理g_newtio.c_lflag = 0; //RAW模式g_newtio.c_cc[VTIME] = 1; /* unit: 1/10 second. */g_newtio.c_cc[VMIN] = 1; /* minimal characters for reading */g_newtio.c_iflag &= ~INPCK; /* Disable parity checking */ g_newtio.c_cflag &= ~CRTSCTS; //NO flow controlg_newtio.c_cflag &= ~CSIZE;g_newtio.c_cflag |= CS8; //databit=8g_newtio.c_cflag |= CLOCAL; //本地连接g_newtio.c_cflag |= CREAD; //允许接收数据if( tcsetattr(ret, TCSANOW, &g_newtio) != 0 ) /*success*/{printf("Set Com Parameter Error!\n");return -1;}tcflush (ret, TCIOFLUSH); //清空输入输出队列return ret;}void RestoreComConfiguration(int fd,struct termios *ptios){if( tcsetattr(fd, TCSANOW, ptios) != 0 ) /*success*/{printf("Restore Com Parameter Error!\n");}}void pthread1(void *arg);void pthread2(void *arg);int main(int argc, char** argv){int ret;pthread_t id1,id2;fd = Init_COM(COM0,115200,'N',1,BLOCK_MODE);if(fd >= 0){write(fd,"Hello...\n",9);usleep(5000);RestoreComConfiguration(fd,&g_oldtio);}int servfd,clifd;struct sockaddr_in servaddr,cliaddr;if((servfd = socket(AF_INET,SOCK_STREAM, 0 )) < 0){printf("create socket error!\n");exit(1);}bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(SERVER_PORT);servaddr.sin_addr.s_addr = htons(INADDR_ANY);if(bind(servfd,(struct sockaddr *) &servaddr, sizeof(servaddr)) < 0) {printf( "bind to port %d failure!\n" ,SERVER_PORT);exit(1);}if(listen(servfd,LENGTH_OF_LISTEN_QUEUE) < 0){printf( "call listen failure!\n" );exit(1);}while(1){char buf[BUFFER_SIZE];long timestamp;socklen_t length = sizeof(cliaddr);printf("wait for connect...\n");clifd = accept(servfd,( struct sockaddr *) &cliaddr, &length);if (clifd < 0){printf( " error comes when call accept!\n " );exit(1);//break ;}strcpy(buf,WELCOME_MESSAGE);printf("from clientIP:%s,Port:%d\n" ,inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));timestamp = time(NULL);strcat(buf, "\ntimestamp in server:" );strcat(buf,ctime(×tamp));send(clifd,buf,BUFFER_SIZE, 0);ret=pthread_create(&id1,NULL,(void *)pthread1, &clifd); if(ret!=0)perror("pthread cread1");ret=pthread_create(&id2,NULL,(void *)pthread2, &clifd);if(ret!=0)perror("pthread cread2");pthread_join(id1,NULL);pthread_join(id2,NULL);}close(servfd);return 0;}void pthread1(void *arg1){int length;int clifd=*(int *)arg1;char buf[BUFFER_SIZE];printf("pthread1 is wroking\n");while( 1 ){length = recv(clifd, buf,BUFFER_SIZE, 0);if(length < 0){printf("error comes when recieve data from server !");exit(1);}write(fd,"\nclient:",8);write(fd,buf,length);tcflush(fd,TCIFLUSH);write(fd,"\n",1);//close(clifd);} // exitclose(fd);}void pthread2(void *arg2){ int length;int clifd=*(int *)arg2;char buf[8];printf("pthread2 is wroking\n");while(1){length=read(fd,buf,8);send(clifd,buf,length, 0);tcflush(fd,TCIFLUSH);}close(fd);}2.client源码#include <stdio.h>#include <sys/socket.h>#include <unistd.h>#include <sys/types.h>#include <netinet/in.h>#include <stdlib.h>#include <strings.h>#include <pthread.h>#define SERVER_PORT 20000 // define the defualt connect port id#define CLIENT_PORT ((20001+rand())%65536) // define the defualt client port as a random port #define BUFFER_SIZE 256void usage(char* name){printf( "usage: %s IpAddr\n " ,name);}void pthread1(void *arg);//void pthread2(void *arg);//int main(int argc, char** argv){ pthread_t id1,id2; //int ret;//int servfd,clifd,length = 0;char data[8];//struct sockaddr_in servaddr,cliaddr;socklen_t socklen = sizeof (servaddr);char buf[BUFFER_SIZE];if(argc < 2 ){usage(argv[0]);exit( 1 );}if((clifd = socket(AF_INET,SOCK_STREAM,0)) < 0 ) //tcp{printf( " create socket error!\n " );exit( 1 );}srand(time(NULL)); // initialize random generatorbzero( & cliaddr, sizeof (cliaddr));cliaddr.sin_family = AF_INET;cliaddr.sin_port = htons(CLIENT_PORT);cliaddr.sin_addr.s_addr = htons(INADDR_ANY);if(bind(clifd,(struct sockaddr* )&cliaddr,sizeof(cliaddr)) < 0 ){printf( "bind to port %d failure!\n " ,CLIENT_PORT);exit( 1 );}//绑定的目的是让其端口是随机的,否则端口是自增1 //一般情况下client端不用绑定bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;inet_aton(argv[1], &servaddr.sin_addr);servaddr.sin_port = htons(SERVER_PORT);if(connect(clifd,( struct sockaddr *)&servaddr, socklen) < 0){printf( "can't connect to %s!\n", argv[1]);exit(1);}length = recv(clifd, buf,BUFFER_SIZE, 0);if(length < 0){printf("error comes when recieve data from server %s!", argv[1]);exit(1);}printf("from server %s:\n%s", argv[1],buf);ret=pthread_create(&id1,NULL,(void *)pthread1, &clifd);if(ret!=0)perror("pthread cread1");ret=pthread_create(&id2,NULL,(void *)pthread2,&clifd);if(ret!=0)perror("pthread cread2");pthread_join(id1,NULL);pthread_join(id2,NULL);while(1){ // printf("please input a 8-bit data:");}close(clifd);return 0;}void pthread1(void *arg1){int clifd=*(int *)arg1;int length;char data[8];printf("pthread1 is working\n");while(1){scanf("%s",data);send(clifd,data,8, 0);}}void pthread2(void *arg2){int len;char data[8];int clifd=*(int *)arg2;printf("pthread2 is working\n");while(1){ len=recv(clifd,data,8, 0);if(len>=0){printf("server : %s\n",data);}}}。