华 中 科 技 大 学
《传感器》实 验 报 告
院系
专业
班级
学号
姓名
计算机学院
物联网工程
1001 班
U201014335
越慧明
2012 年 9 月 14 日
目录
一 实验题目及内容……………………………………………………………………………………………1
二 实验要求和原理…………………………………………………………………………………………..1
三 函数说明……………………………………………………………………………………………………...2
(1)LodLibrary
(2) GetProcAdress
(3)FT_Open
(4)FT_SetBaudRate
(5)FT_Write
(6)FT_Read
(7)FT_SetTimeOuts
(8)FT_Close
五 实验心得体会……………………………………………………………………………………………..4
六 源代码…………………………………………………………………………………………………………5
一 实验题目及内容
题目:利用温度传感器实时采集被测对象温度
内容:编写程序实现把传感器实时采集的数据以曲线图形方式显示在界面上,
同时计算一段时间内的最高最低以及平均温度。(类似下图曲线)
二 实验要求和原理
实验要求:
使用给定的器材完成课程设计;
编程语言:C/C++,操作系统:Windows 系列;
能够自动搜索通信端口,按握手协议确定端口号,提供端口参数设置功能;
提供温度读取时间间隔设置、开始监测、终止监测功能;
程序提供对传感器标定的功能;
以最直观的方式显示测量的温度值,及测量期间温度的变化情况;
测量值存入数据文件,提供按时间段查询温度曲线的功能;
实验原理:
利用 FTDI 提供的用于 USB-UART 芯片的软件接口实现串口通信。通过打开串
口,配置串口,读写串口,关闭串口四个步骤来读取传感器传来的温度数据。
首先需要加载动态链接库文件 ftd2xx.dll。
创建和打开串口;
对串口的参数进行设置,其中比较重要的是波特率(BaudRate),数据宽
度(BytesBits),奇偶校验(Parity),停止位(StopBits);
然后对串口进行相应的读写操作;
读写结束后,要关闭串口句柄。;
利用 vs2010 的 mfc 编写图像模式,用曲线实时监控温度的变化,同时实
时计算一段时间内最大温度、最小温度和平均温度。
1
三 函数说明
(1) LodLibrary
说明:载入指定的动态链接库,并将它映射到当前进程使用的地址空间。
一旦载入,即可访问库内保存的资源。
返回值:Long,成功则返回库模块的句柄,零表示失败。会设置 GetLastError。
参数:lpLibFileName String,指定要载入的动态链接库的名称。采用与
CreateProcess 函数的 lpCommandLine 参数指定的同样的搜索顺序。
注解:一旦不需要,用 FreeLibrary 函数释放 DLL。
(2) GetProcAdress
说明:GetProcAddress 函数检索指定的动态链接库(DLL)中的输出库函数
地址。
原型:FARPROC GetProcAddress (
HMODULE hModule ,
LPCSTR lpProcName );
// DLL 模块句柄
// 函数名
参数:
hModule包含此函数的 DLL 模块的句柄。LoadLibrary、AfxLoadLibrary
或者 GetModuleHandle 函数可以返回此句柄。
lpProcName 包含函数名的以 NULL 结尾的字符串,或者指定函数的
序数值。如果此参数是一个序数值,它必须在一个字的底字节,高字节必
须为 0。
返回值:
如果函数调用成功,返回值是 DLL 中的输出函数地址。
如果函数调用失败,返回值是 NULL。得到进一步的错误信息,调用函数
GetLastError。
(3) FT_Open
函数原型:
FT_STATUS FT_Open (int iDevice, FT_HANDLE *ftHandle)
参数:
iDevice 要打开的设备序号。设为 0,该函数能自动搜索可用的端口。
ftHandle 可以用来存储句柄的 FT_HANDLE 类型变量的指针。
返回值:
如果成功则返回 FT_OK,即 0;否则返回一个 FT 错误代码。
(4) FT_SetBaudRate
FT_SetBaudRate
函数原型:
FT_STATUS
dwBaudRate)
参数:
ftHandle 设备句柄;
dwBaudRate 波特率。
(FT_HANDLE
ftHandle,
DWORD
2
返回值:
如果成功则返回 FT_OK,即 0;否则返回一个 FT 错误代码。
(5) FT_Write
,
函数原型:
FT_STATUS FT_Write (FT_HANDLE ftHandle , LPVOID lpBuffer
DWORD dwBytesToWrite,
LPDWORD lpdwBytesWritten)
参数:
ftHandle
设备句柄
lpBuffer
写缓存区指针
dwBytesToWrite 写字节数
lpdwBytesWritten 存放写入设备字节数的变量指针
返回值:
如果成功则返回 FT_OK,即 0;否则返回一个 FT 错误代码。
(6) FT_Read
函数原型:
FT_STATUS FT_Read (FT_HANDLE ftHandle, LPVOID lpBuffer, DWORD
dwBytesToRead,
LPDWORD lpdwBytesReturned)
参数:
ftHandle
lpBuffer
dwBytesToRead 读字节数
lpdwBytesReturned 存放读出字节数的变量指针
返回值:
如果成功则返回 FT_OK,即 0;否则返回一个 FT 错误代码。
设备句柄
写缓存区指针
(7) FT_SetTimeOuts
FT_SetTimeouts
(FT_HANDLE
ftHandle,
DWORD
函数原型:
FT_STATUS
dwReadTimeout, DWORD dwWriteTimeout)
参数:
ftHandle 设备句柄
dwReadTimeout 读超时,以毫秒为单位。
dwWriteTimeout 写超时,以毫秒为单位。
返回值:
如果成功则返回 FT_OK,即 0;否则返回一个 FT 错误代码。
(8) FT_Close
函数原型:
FT_STATUS FT_Close (FT_HANDLE ftHandle)
参数:
3
ftHandle 设备句柄
返回值:
如果成功则返回 FT_OK,即 0;否则返回一个 FT 错误代码。
五 实验心得体会
通过本次实验,亲自体会了串口通信的实际应用,利用温度传感器实时采集
数据,通过串口,把数据传到 pc 机上,进行一些列数据处理,求最大最小温度
以及平均温度。
在实验过程中,首先自学利用 FTDI 提供的用于 USB-UART 芯片的软件接口实
现串口通信,编写遇见了很多问题,最开始写出来的程序调试没问题,但是就是
读不出来数据,经过上网查询和询问同学后,才发现是 FT_Read 函数写错了的问
题,最后改过来后,能够在 dos 命令上面显示温度,但是没有图形显示,这又得
利用 vs 的 mfc 来编写图形程序,经过自学一段时间后,基本掌握了 mfc,用其写
出了可以用曲线实时表达温度的图形,而且温度标定也没写好。最后在一些列辛
苦后,终于能全功能读出数据和进行图形显示了。
通过自学和不断摸索做课设,学到了很多课堂上没学到的,也学会了实际应
用这方面。
4
六 源代码
// MySensor.h : PROJECT_NAME 应用程序的主头文件t
//
#pragma once
#ifndef __AFXWIN_H__
#error "在包含此文件之前包“stdafx.h”以生成PCH 文件"
#endif
#include "resource.h"
// 主符号
// CMySensorApp:
// 有关此类的实现,请参阅MySensor.cpp
//
class CMySensorApp : public CWinApp
{
public:
CMySensorApp();
// 重写
public:
virtual BOOL InitInstance();
// 实现
DECLARE_MESSAGE_MAP()
};
extern CMySensorApp theApp;
// MySensorDlg.h : 头文件
//
#pragma once
#include "Sensor.h"
#include "Pannel.h"
// CMySensorDlg 对话框¨°
class CMySensorDlg : public CDialogEx
{
// 构造
public:
CMySensorDlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
enum { IDD = IDD_MYSENSOR_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
Sensor m_Sensor;
Pannel m_Pannel;
CComboBox * pCombo;
float m_max;
float m_min;
float m_average;
float m_current;
afx_msg void OnBnClickedOk();
afx_msg void OnBnClickedButton1();
afx_msg void OnBnClickedCancel();
afx_msg void OnCbnSelchangeCombo1();
afx_msg void OnTimer(UINT_PTR nIDEvent);
CComboBox m_TimeSleced;
//
};
// Pannel.h : header file
//
#ifndef __Pannel_H__
#define __Pannel_H__
/////////////////////////////////////////////////////////////////////////////
// Pannel window
class Pannel : public CWnd
{
// Construction
public:
Pannel();
// Attributes
public:
double AppendPoint(double dNewPoint);
void SetRange(double dLower, double dUpper, int nDecimalPlaces=1);
void SetXUnits(CString string);
void SetYUnits(CString string);