硬件综合训练中期总结

小学期一门课名为硬件综合训练,一直到了第二周才开课,一开始我还以为又是什么水到不行的课,交个报告就完事。当我见到那物联网教学科研平台时,就改变了我的看法。六个传感器,一个LINUX网关,传感器通过ZIGBEE网络发送数据,网关接收并用图形化界面显示出来。而我们要做的,就是在此基础上模拟一些功能,使其能用在智能家居上。就比如有个温湿度传感器,我们可以利用这个传感器对家庭的温湿度进行监控,一旦发现家里温度过高,就可以控制空调自动开启。这是一个计算机科学与技术专业的软件狗第一次接触到硬件的过程。(据说,全国高校本专业只有本校开设了这门课。。。)

闲话就说到这里,今天距离第一次课刚好一周,距离我拿到实验平台共计四天的时间,对平台也熟悉的差不多了,经过一次次折腾,大致了解了Zigbee网络的工作方式,以及代码写法,明天就可以开始真正的开发智能家居的应用。

7月7号下午:

这不就是一个已经可以使用的平台了吗,我们不用在对硬件进行编码了吧,我只要把传感器采集到的数据通过串口读取到我的电脑上不就完了。(ps:平台网关和Zigbee协调器模块是通过串口进行通信的)网关是up-cup6410型号,传感器均来自于北京博创兴盛科技有限公司。百度搜了C语言读串口的代码,其实这个还真不好搜,费了好大劲才找到,可能是我关键字不太对吧,也可能是我对c语言理解不够深刻,搜到了说直接用CreateFile把串口当成文件来读的。可是细数我两年的编程经历,读文件还只用过FILE类。。。这个部分贴个代码,方便跟我一样的初学者。

<span style="font-family:KaiTi_GB2312;font-size:18px;">HANDLE test = CreateFile(_T("COM3"), GENERIC_READ, 0, NULL, OPEN_EXISTING, NULL, NULL);   //打开串口
	if (test == INVALID_HANDLE_VALUE)    //打开失败
	{
		cout << "open filed\n";
		system("pause");
		exit(-1);
	}
	DCB *dcb = new DCB();    //设置串口状态所用的控制块
	GetCommState(test, dcb);
	dcb->BaudRate = 115200;   //波特率
	dcb->ByteSize = 8;        //字长
	dcb->Parity = 0;          //奇偶校验方式
	dcb->fOutxCtsFlow = false;   //无硬件流中断
	SetCommState(test, dcb);     //设置串口状态
	DWORD readSize;
	DWORD fileSize = 1;
	char *buffer = new char[fileSize];
	char *data = new char[17];
	ReadFile(test, buffer, fileSize, &readSize, NULL);    //从串口读数,test是串口的句柄,buffer数据缓冲区,filesize要读取的大小,readsize实际读取大小</span>

读完串口后数据即存放在buffer中。

找代码找的心力交瘁,然后开始进行测试,代码运行好久,控制台并没有输出,难道是波特率出错了(PS:后来才知道波特率不对也会有输出,只不过是乱码),然后我就用几个常用的波特率重新测试,可是依然没有输出。然后,我想到了那个帮助光盘,可是我电脑光驱位早被我拆了装了SSD,只能等同学回来了。后经同学提醒,要先往传感器里写程序,然后根据教程来做实验。

PS:后来才知道,这里我犯了两个错误,第一,filesize设置太大,串口发送速率太小,所以导致要读满整个buffer要很长时间。第二,ReadFile()的返回值判断错误。调用成功,返回非零,不成功返回零!!!我整个搞反了,所以导致我无论怎样都不会有输出。

7月8日:

终于拿到了文档,实验平台配套工具里面有一个叫做仿真器的东西,就是往传感器上写程序用的,按照教程里说的安装驱动方式提示找不到,打开所在目录发现驱动只适用于xp系统,没办法,要调试程序还得在虚拟机里装个xp系统。

装完系统,半个上午就过去了,再上一节课,一个上午就过去了,真正做事情的时间还是在下午。打开教程,浏览一下目录,先看一下开发环境。原来还需要一个叫IAR的IDE才能开发程序。还好有虚拟机,不用在我本机上折腾了。配好开发环境,跟着教程写完了我的第一个嵌入式程序,就是控制板子上的LED灯的,根据教程一步步烧到板子上,很开心。虽然对实际要做的没什么帮助,但是毕竟第一步跨了出去。看到目录共计二三十个实验,我挑选了三个实验来做,一个基础实验,一个传感器模块实验,一个无线通讯实验。几个实验没什么好说的,跟着教程做。

这三个实验均用到了xp系统的超级终端读串口数据,当我做完这几个实验,猛然想到,既然超级终端可以读出串口数据,那么我写的程序一定也能读出来。回到win10系统,修改一下buffer大小,这里修改是因为此时发送的数据少,并不是我意识到了数据采集和传输速率的差异。拿过来测试,还是不行,然后我就发现了返回值的问题,改了返回值之后,果然,是可以输出的。然后我好像突然想起了什么,心中一惊。这么说来,昨天这个程序也是可以读取数据的,只不过我把返回值弄错了。卧槽,传感器上的程序已经被我改了,这意味着现在的几个传感器已经不能组成一个网络了。卧槽,这真是作孽呀,别急,一定有办法的,一定会有原来程序的代码,明天再找。

7月9日

早早的起床,在光盘里找到了另一份教程的文档,卧槽,竟然有三十多页,密密麻麻的全是字和代码。不急,慢慢看,下面有界面,怎么跟之前看到的不一样呀。先不管了,就当这个是吧,找到源代码,烧进班子里面,每个都烧一份,插在实验平台上,我多希望它能工作呀,可是显示屏上还是空白。一定是哪里出了问题,继续看。下面有一行,把核心板以coordinator方式进行编译,温湿度传感器以router方式编译,其他传感器以Enddevice方式编译,还要找到SampleApp_Init()函数,把当前传感器类型的注释打开,不是当前传感器的类型全注释掉,重新烧进去,依然不行。看着文档,我实在不知道哪里出错了。算了,放弃吧,重新写一个网关出来,反正温湿度的无线数据传输已经会做了,把其他几个传感器加上应该也不难。

其他传感器前面也有实验,把代码复制到无线数据传输这来,原来核心板向串口发送数据是通过Uart_Send_Strirng()来发送的,在每一块前面加上对传感器类型的判断,恩,应该差不多吧。然后把程序写进传感器里。打开所有开关,串口插上,并没有数据。

算了,心累,明天继续。

7月10日

忘记昨天晚上做了什么梦,反正就是梦醒之后我非常清晰的认识到,昨天找的那个代码百分之百就是在课堂上看到的程序的源代码。一定是哪里有问题,肯定是昨天犯冲。把传感插上,程序重新写一遍,确认没有任何错误,连接好所有线,打开开关,依然没有任何东西出现,我有点慌,回去重新看看代码,还是没错,再回头看看屏幕,回头看看屏幕,卧槽,竟然出现了协调器结点,虽然只是一个孤零零的结点,至少出现了,这证明我的想法是对的。并不知道为什么,把所有结点重启一遍,屏幕上又是空白了,,,难道,是我昨天等的时间不够久??这也是太操蛋了,整个硬件实验把实验箱拿回来在宿舍做这种事情真操蛋。终于好了,五个传感器结点出现在了屏幕上,鉴于有毒气体的传感器用不上,以后的实验就把它抛弃掉好了。

测试串口,这么多天,又回到了原点,通过串口从传感器采集信息。插上串口,才想起来串口的一些属性不知道怎么设置,看看文档,里面没有说。。。不管了,跟无线实验那次用同样的属性好了,设置好波特率,奇偶校验等,打开程序,全是乱码。这怎么回事,它怎么发送数据的,打开源代码,搜索Uart_Send_Strirng(),竟然无结果。那这个是怎么发送数据的,看文档,原来是用的Hal库,向串口发送数据的函数变成了HalUARTWrite(),这样的话,波特率设置在哪,搜索一切跟波特率有关的名词,没有任何结果。百度搜索Hal库的初始化,也没有找到有用的信息。只能祭出大招,暴力循环,把几个常用的波特率测试一遍,终于找到了一个不是乱码的,波特率是115200,竟然是这么大的波特率,也是没想到。一切都通畅了,剩下的就是对数据进行解析,去除无用的数据,只留下我能用的到的数据。经过层层筛选,选出来传感器结点上线,下线,温湿度传感器周期性采集信息,其他传感器中断方式发送信息这么几条数据。代码比较简单,没什么好说的。

实验还有一个要求,搭建一个网站,接收传感器数据,然后手机端从网站获取数据。想了很久,想到了之前用过的html+nodejs+mongodb的一个网站模板,利用post请求发送数据,数据存放在数据库中,然后前端从数据库获取数据显示出来。既然这样,C语言写HttpPost请求并不是那么方便,于是转换成了C#,毕竟以前写过,熟悉。顺便贴下代码

<span style="font-family:KaiTi_GB2312;font-size:18px;">public static void httpPost(string name, string addr, string parentAddr, string state, string data)
        {
            Encoding dataencode = Encoding.UTF8;
            string url = "http://localhost:3000/insert";
            HttpWebRequest request = HttpWebRequest.Create(url) as HttpWebRequest;
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            string parastr = "name=" + name + "&addr=" + addr + "&parentAddr=" + parentAddr + "&state=" + state + "&data=" + data;
            byte[] bytearr = dataencode.GetBytes(parastr);
            request.ContentLength = bytearr.Length;
            Stream newStream = request.GetRequestStream();
            newStream.Write(bytearr, 0, bytearr.Length);
            newStream.Close();
        }</span>

毕竟只是发送数据,不用接收网站返回的数据,所以就不用httpwebresponse了。启动网站,还要修改一下后台接收post的处理程序。第一次用mongodb,自然离不开百度,新建一个表,把之前的表全部替换成现在的表,果然没问题了,我真机智。

7月11日

修改了一下昨天对于网页操作的瑕疵,然后剩下的就是安卓获取网页数据并且进行处理了。并没有什么难度,上午还上了一上午的课,就没有了动力。我这个人就是奇怪,对于自己不会做的事情积极性特别高,但是如果一件事情看上去就知道肯定可以做出来的话,就完全进入了懒散状态,什么都不想干。

但是这毕竟还是作业呀,明天再写吧。

7月12日

安卓端开发。从本机或者网页与安卓端通信,好多种方式,不知道选哪个,好纠结。更纠结的是如果答辩老师问我为什么选了这种方式我怎么回答,反正我现在能想到回答方式就是:方案有好多种呀,我只是从中随便选择了一种,不能一直纠结选哪种方案不是。

好吧,我选的是安卓APP访问网页,获取数据,而不是从本机往安卓发数据。至于为什么呢,一个原因就是前段时间刚写完课表,一些东西还能用的上,就这么简单。

但是我也不知道做什么死,偏偏没有用上一次的网页请求代码,好像是当时我觉得上一次的http请求只有POST和GET两种方式,而我要访问的网页只是一个静态网页,并没有POST和GET表单能提交的地方,所以就不能用POST/GET,然而百度搜到的全是POST/GET方式的http请求。然后我就在想,我这种请求方式应该是什么呢,然后我就去用HttpWatch看了一下,妈呀,竟然是GET。(只能说我水平不行,对http了解不透彻,可是有那么多东西要学习,我又怎能在两年的时间里做到样样都了解呢,大部分还是一边做一边百度的。我一直在强调自己只有两年的编程经验,是从我敲第一个helloworld开始算起的,做到现在这样不知道算不算好,但是我自己是知道,我能做到更好的,只是内心依旧存在贪嗔痴。)

知道了是GET方式,我还是没有用上次的代码,不知道自己怎么想的,这次的HTTP请求代码是这样的

HttpClient httpClient = new DefaultHttpClient();
		HttpGet httpGet = new HttpGet("http://192.168.1.50:3000");
		try
		{
			HttpResponse httpResponse = httpClient.execute(httpGet);
			if(httpResponse.getStatusLine().getStatusCode() == 200)
			{
				result = EntityUtils.toString(httpResponse.getEntity());
				//seeString(result);
				Message msg = new Message();
				msg.what = 0;
				msg.obj = result;
				handler.sendMessage(msg);
			}
		}
		catch(Exception e)
		{

		}

大概是觉得明明这么几行就可以解决的事情没必要多加几个包吧。第一次写的时候我是直接把http请求写入了Activity的onCreate方法里,然后调试,一直抛出异常,百度了才知道,原来Android4.0之后http请求必须新开线程执行,否则就会异常,而且Manifest.xml里还要加上<uses-permission android:name="android.permission.INTERNET" />。这才想起来上次那个本来就是异步http请求包,怪不得之前没有遇到这个问题。继续往下,因为要做实时监控的系统,所以就要每隔一段时间获取一下数据,我就又开了一个线程来控制这个逻辑,这个线程的作用就是每隔一段时间创建一个线程去发出http请求获取数据。

继续调试,发现每获取一次数据之后,去更新UI的内容的时候又会抛出异常,百度搜了异常,才发现Android是不允许线程更改UI的,如果要更改UI的话只能用其他的方法,这里能搜到好几种,我选用了其中一种handler的方法。

具体工作方式也没有了解的很细致,我只说一下我遇到的问题,使用了Handler方法之后依然是抛异常退出,使我百思不得其解。最后才想到是线程嵌套层数太多了,我是用的线程的线程去更改的UI,这是不可行的,于是,我就在控制逻辑的线程里直接写了http请求,然后可以工作。

完美的一天。

时间: 2024-10-18 00:53:53

硬件综合训练中期总结的相关文章

2016年VR&amp;AR有市场吗?

新霸哥发现了近期虚拟现实(VR)和增强现实(AR)非常火,已经成为了科技产业中最具前景的技术之一.其实说起这两项技术的应用,人们最容易把它与电子游戏联系在一起,那么在2016年VR&AR有市场吗? VR&AR涉及到的领域有很多,我们最常见的就是视频.游戏,或者是直播.同时在医疗保健,房地产.教育.旅游.军事等等方面都有着直接的应用.VR&AR分布在很多行业的每个角落里,与千家万户有着很密切的关系,可以很方便的为人民服务,不断的改善人们的生活,品格和需求.但是从方面来说,它需要很多的

计算机与硬件基础

说到计算机的发展,不得不提到美国科学家冯·诺依曼.从20世纪初,物理学和电子学科学家们就在争论制造可以进行数值计算的机器应该采用什么样的结构.人们被十进制这个人类习惯的计数方法所困扰.所以,那时以研制模拟计算机的呼声更为响亮和有力.早期的计算机以加电和掉电进行数据的运算,然而却无法用精确的电压值表示数据.20世纪30年代中期,美国科学家冯·诺依曼大胆的提出:抛弃十进制,采用二进制(用有无电压(电平)表示数据)作为数字计算机的数制基础.同时,他还说预先编制计算程序,然后由计算机来按照人们事前制定的

硬件杂谈

http://antkillerfarm.github.io/ 开篇的话 自从改行做起了驱动软件工程师,好多硬件的问题已经不再像当初那样,可以忽略不计了.于是就有了以下的心得. 0欧电阻的作用 在硬件原理图,特别是硬件草案的原理图中,常可看到0欧的电阻.0欧的电阻在效果上当然等同于导线,辛辛苦苦把它引出来焊上,究竟有何用处呢?硬件的同事告诉我,他们一般只在某些新添加的电路上使用这东西.一旦由于某些原因需要去掉新添加的电路的话,只要用电烙铁把电阻取下来就可以了,而不用再造一批测试版. 空指针 空指

网络的硬件设备

说在前面的话 集线器运行在OSI模型的第一层.交换机在第二层.路由器在第三层. 网络的硬件设备,包括:网卡.集线器.交换机.路由器.连接网络设备.网关与网桥和测试网络设备. 网卡 网卡可以插在电脑的主板扩展槽中或集中在主板上,还有通过USB接口连接的无线网卡. 台式机网卡,又属于PCI-E网卡 笔记本网卡     无线网卡 有线网卡,这也属于主板集成网卡 由于目前的网络有ATM网.令牌环网和以太网之分,它们分别采用各自的网卡,所以网卡也有ATM网卡.令牌环网和以太网之分. 按照连接器接口的不同,

P2P网贷系统平台开发中期注意事项

开p2p平台公司主要分为三大步骤,迪蒙网贷在前面介绍了如何成立p2p网贷公司以及建设p2p平台前期工作,那么公司注册好之后如何开展下一步工作?为了让大家熟悉p2p网贷平台建设流程,小编再讲第二个步骤:p2p网贷平台开发中期该做什么? p2p平台各岗位职员配备 p2p网贷公司成立后第一件事当然是组件运营团队,前期的工作岗位安排可参考下面这张较为完整的p2p网贷平台人事组织架构图来进行岗位招聘,适合大中型p2p网贷平台企业,各岗位人数配备根据实际业务需求自拟. 应该说这个人事安排还不是最完善的,从互

硬件工程师从0到1之《基础知识框架》

笔者自2011年从本科毕业至今已经近8年,目前从事与硬件产品经理相关工作,主要面向于B端产品(B端:企业用户).整个岗位职责经历了硬件工程师.FPGA逻辑工程师.项目经理.产品经理,从业企业类型有中型企业.创业公司.上市企业.回首这8年来的经历,从一个刚出校门对硬件非常懵懂的职场小白,到现在对硬件设计过程游刃有余并且在组织优化有自己的一些思考,这个过程值得回味总结.人生职业生涯刚刚过五分之一,我的职业生涯也在路上,将继续探索不断开拓新篇章.闲话休提,为何要写下此篇关于硬件工程师的从0到1?8年前

工业防火墙架构与技术【第二节:硬件架构②】

2).满足对数据包的处理性能的高速度要求 任何防火墙的基本技术功能都是过滤报文.防火墙检查其接收的每个数据包,以确定数据包是否对应于流量模式的所需模板.防火墙然后过滤(丢弃)或转发与这些模板匹配的数据包.这些模板以规则的形式进行建模.在工控防火墙中,有针对已知协议提前建模好的规则模板,也有后期自动学习进行建模的规则模板.由于工控防火墙处理数据包是一个一个处理,包括数据包的校验,数据包每一层包头的处理,所以数据包越小,到达时间就越短,服务器处理数据包要求就越高.比如64B的小包,如果处理数据包要达

何为硬件设计?

硬件设计就是根据产品经理的需求PRS(ProductRequirementSpecification),在COGS(CostofGoodsSale)的要求下,利用目前业界成熟的芯片方案或者技术,在规定时间内完成符合: PRS功能(Function): 性能(Performance): 电源设计(PowerSupply): 功耗(PowerConsumption): 散热(Thermal/Cooling): 噪音(Noise): 信号完整性(SignalIntegrity): 电磁辐射(EMC/E

教你如何使用硬件检测功能

1.硬件检测有什么作用? 新增硬件检测功能,电脑硬件信息一目了然. 打开电脑扣扣管家主程序,点击扣扣电脑管家的"工具栏"中的"硬件检测",将自动为您检测硬件信息. 硬件检测包含了CPU.主板.内存.显卡.显示器.硬盘.网卡.声卡,以及所有接入的USB设备等信息,几乎包含了您电脑上的全部设备信息,可以点击左侧的各标签页查看各类设备的信息. 同时,硬件检测还会实时监控当前的各硬件状态,包括温度.风扇转速和电压等等.您可以在电脑概览的右边栏看到各种表盘. 您可以点击右上角