计算机应用 | 古代文学 | 市场营销 | 生命科学 | 交通物流 | 财务管理 | 历史学 | 毕业 | 哲学 | 政治 | 财税 | 经济 | 金融 | 审计 | 法学 | 护理学 | 国际经济与贸易
计算机软件 | 新闻传播 | 电子商务 | 土木工程 | 临床医学 | 旅游管理 | 建筑学 | 文学 | 化学 | 数学 | 物理 | 地理 | 理工 | 生命 | 文化 | 企业管理 | 电子信息工程
计算机网络 | 语言文学 | 信息安全 | 工程力学 | 工商管理 | 经济管理 | 计算机 | 机电 | 材料 | 医学 | 药学 | 会计 | 硕士 | 法律 | MBA
现当代文学 | 英美文学 | 通讯工程 | 网络工程 | 行政管理 | 公共管理 | 自动化 | 艺术 | 音乐 | 舞蹈 | 美术 | 本科 | 教育 | 英语 |

温度监控系统的设计(一)信息工程毕业论文(6)

2013-05-09 01:32
导读:,数据位,奇偶校验停止位的信息包含于一个DCB结构中,而超时方面的信息则包含于COMMTIMEOUTS结构中, 一般在用CreateFile 打开串行口后,可以调用GetCommS
,数据位,奇偶校验停止位的信息包含于一个DCB结构中,而超时方面的信息则包含于COMMTIMEOUTS结构中,
一般在用CreateFile 打开串行口后,可以调用GetCommState 函数来获取串行口的初始配置。要修改串行口的配置应该先修改DCB结构,然后再调用SetCommState函数用指定的DCB结构来设置串行口。例如:
DCB dcb;
GetCommState(mHandle, &dcb) //读取DCB结构
……………………
……………………
dcb.BaudRate=9600 // 设置波特率为9600b/s
dcb.ByteSize=8; // 每个字符有8位
dcb.Parity=NOPARITY; // 无校验
dcb.StopBits=ONESTOPBIT; // 一个停止位
SetCommState(hCom, &dcb) // 保存至DCB结构使设置值生效
调用SetupComm 函数可以设置串行口的输入和输出缓冲区的大小。如果通信的速率较高则应该设置较大的缓冲区。例如:
…………………………
…………………………
SetupComm( mHandle , 1024*2, 1024*2 ) //输入输出缓冲区的大小均为2K
…………………………
…………………………
在用ReadFile 和WriteFile 读写串行口时,需要考虑超时问题。如果在指定的时间内没有读出或写入指定数量的字符,那么ReadFile 或WriteFile 的操作就会结束。要查询当前的超时设置应调用GetCommTimeouts 函数。该函数会填充一个COMMTIMEOUTS 结构调用SetCommTimeouts 可以用某一个COMMTIMEOUTS结构的内容来设置超时。
…………………………
…………………………

TimeOuts. ReadIntervalTimeout=0 //读间隔超时
TimeOuts.ReadTotalTimeoutMultiplier=10 //读时间系数
TimeOuts.ReadTotalTimeoutConstant=100 //读时间常量
TimeOuts.WriteTotalTimeoutMultiplier=10 //写时间系数
TimeOuts.WriteTotalTimeoutConstant=100 //写时间常数
SetCommTimeouts(hCom, &TimeOuts); // 保存设置值生效

(科教作文网http://zw.ΝsΕac.cOM编辑)

………………………………
………………………………
………………………………
COMMTIMEOUTS结构的成员都以毫秒为单位。总超时的计算公式是:
总超时=时间系数×要求读/写的字符数+ 时间常数
异步方式读写串行口时虽然ReadFile()和WriteFile() 在完成操作以前就可能返回但超时仍然是起作用的。这种情况下,超时规定的是操作的完成时间而不是ReadFile()和WriteFile()的返回时间。
(3)读写串口
 初始化工作完成以后便可以根据通信协议合理安排读/写函数ReadFile()和WriteFile()以读写各种握手信息和数据信息等。其中何时读取单片机发送过来的数据信息及应答信息是重要的。此时采取的是事件驱动法,即:设置通信资源上的事件掩码为EV_RXCHAR 。当接收到一个字符并放入缓冲区后即通知应用程序例。
//PC发送一组命令至单片机
WriteFile(mHandle, //串口句柄
pDataBuff, //存放数据缓种区
iLen, //所写数据的长度
pdwWritten, //已写长度操作前应置为0
lpOverlapped) //异步方式
//设置通信事件掩码
DWORD dwMask=EV_RXCHAR;
SetCommMask(m_hFile,dwMask)) //设置通信事件掩码
//等待通信事件的发生
OVERLAPPED os ;
memset( &os, 0, sizeof( OVERLAPPED ) ) ;
os.hEvent=CreateEvent(NULL TRUE FALSE NULL)
if(!WaitCommEvent(m_hFile, &dwEvtMask, &os)) // 重叠操作
if(GetLastError()==ERROR_IO_PENDING)
{
// 无限等待重叠操作结果
GetOverlappedResult(mHandle, &os, &dwTrans, true);
//事件已发生安排读操作
ReadFile(mHandle, //串口句柄
pDataBuff, //存放数据缓种区
iLen, //所读数据的长度
pdwRead, //实际所读长度
lpOverlapped) //异步方式
}
 在上例中,我们无限等待通信事件的发生。如果通信事件一直没有发生则系统将不会继续执行。在实际程序设计中我们可以设置一时限,超过此时限通信事件未到则执行相应错误处理此时,只需将GetOverlappedResult函数替换为WaitForSingleObject函数此函数的声明形式如下:

(科教作文网http://zw.nseAc.com)


WaitForSingleObject(
HANDLE hEvent, //事件句柄
unsigned long mTimeOuts //超时设置
)
(4) 关闭串口
 通信完毕调用CloseHandle() 函数关闭串口例如
CloseHandle(mHandle); //关闭mHandle为打开串口时返回的句柄
6.4 单片机软件设计
 我们知道影响数据转输产生错误的因素有:转输线分布参数上下位机间的波特率误差现场干扰等。而针对近程小批量数据的通信,下位机的波特率误差性是影响可靠通信的最主要因素。所以在单片机软件的设计时应重点考虑并设置好波特率。
6.4.1波特率
(1)波特率误差来源分析
 ①单片机的振荡电路是由晶体及电容C1 和C2 构成。晶振频率主要由晶体的因有频率决定,同时也与电容C1、C2及外界温度有一定的关系。另外,晶体频率的标称值与实际值也不可能完全一致。
 ②波特率最大允许误差分析
 在异步串行通信方式1中单片机以16倍波特率的采样速率对接收数据(RXD)不断采样,一旦检测到由1到0的负跳变,16分频计数器立刻复位,使之满度翻转的时刻恰好与输入位的边沿对准。16分频计数器把每个接收位的时间分为16 份,在中间三位即7 ,8 ,9 ,状态时位检测器对RXD 端的值采样,并以3取2的表决方式确定所接收的数据位。由此可见,当波特率的误差使得在接收某位数据位时,采样点离该位的中点半位间隔时将会对该位采样两次。即:欲使接收的第N位为正确位时,须满足下式成立:
所允许的波特率误差N > 0.54
故当所传输的一帧数据为10 位时,所允许的最大的波特率允许误差为5 %对于其它常用的8位,9位,11位,一帧的串行传输,其最大的波特率允许误差分别为6.25%,5.56%, 和4.5%。
 ③减小波特率误差的措施
 我们知道使用离散度小的晶振是
上一篇:电子相关课题仿真及程序信息工程毕业论文 下一篇:没有了