rs232串口通信实验报告文档格式.docx

上传人:b****6 文档编号:19312724 上传时间:2023-01-05 格式:DOCX 页数:11 大小:666.55KB
下载 相关 举报
rs232串口通信实验报告文档格式.docx_第1页
第1页 / 共11页
rs232串口通信实验报告文档格式.docx_第2页
第2页 / 共11页
rs232串口通信实验报告文档格式.docx_第3页
第3页 / 共11页
rs232串口通信实验报告文档格式.docx_第4页
第4页 / 共11页
rs232串口通信实验报告文档格式.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

rs232串口通信实验报告文档格式.docx

《rs232串口通信实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《rs232串口通信实验报告文档格式.docx(11页珍藏版)》请在冰豆网上搜索。

rs232串口通信实验报告文档格式.docx

RS-232C标准〔协议〕的全称是EIA-RS-232C标准,其中EIA(ElectronicIndustry&

#0;

RS-232-C、EIA&

RS-422-A、EIA&

RS-423A、EIA&

RS-485。

这里只介绍EIA&

RS-232-C〔简称232,RS232〕。

例如,目前在IBMPC机上的COM1、COM2接口,就是RS-232C接口。

RS232原理如图1-3。

图1RS232接口电缆和引脚外观

图2RS232引脚定义〔DB9〕

RS232接口硬件握手方式

1概述

  在现代的各种实时监控系统和通信系统中,在Windows9X/NT下利用VC++对RS-232串口编程是常用的手段。

Windows同时还可以建立其他的线程。

线程是操作系统分配CPU时间的根本实体,每个线程占用的CPU时间由系统分配,系统不停的在线程之间切换。

进程中的线程共享进程的虚拟地址空间,可以访问进程的资源,处于并行执行状态,这就是多线程的根本概念。

  2VC++对多线程的支持

  3多线程在串口通信中的应用

  3.1串口通信对线程同步的要求

  因为同一进程的所有线程共享进程的虚拟地址空间,而在Windows

  串口通信中,对于每个串口对象,只有一个缓冲区,发送和接收都要用到,必须建立起同步机制,使得在一个时候只能进行一种操作,否那么通信就会出错。

  VC++提供了同步对象来协调多线程的并行,常用的有以下几种:

   CCriticalSection:

临界区对象,将一段代码置入临界区,只允许最多一个线程进入执行这段代码。

一个临界区仅在创立它的进程中有效。

  3.2

  Win32

  3.3串口通信的重叠I/O方式

五、编程实现

代码实现:

1、源码

#include<

conio.h>

stdio.h>

bios.h>

main()

{

charch;

/************************串口初始化*************************/

outportb(0x3fb,0x80);

//设置LCR,访问DLL、DLM,禁止串口中断,无校验,1位停止位;

outportb(0x3f8,0x0C);

//设置串口的波特率低八位(DLL);

outportb(0x3f9,0x00);

//设置串口的波特率高八位(DLM);

outportb(0x3fb,0x03);

//设置LCR,禁止访问DLL、DLM,禁止串口中断,无校验,1位停止位;

outportb(0x3fc,0x03);

//初始化MCR,数据终端准备好,请求发送;

while

(1)//保持监听状态

{

/*************************发送数据*************************/

if(bioskey

(1))

ch=bioskey(0)&

0x0ff;

//假设有键盘输入,获取ASCII码

if(ch==27)//假设输入字符为“ESC〞,退出程序

exit(0);

outportb(0x3f8,ch);

//否那么将字符送入发送端口

}

/*************************接收数据*************************/

ch=inportb(0x3fd);

//读取接收端口的线路状态存放器LSR的状态

if(ch&

0x01)//假设线路状态存放器LSR的末尾为1,表示接收就绪

ch=inportb(0x3f8);

//读取数据

putch(ch);

//显示数据

}

}

注:

com1口的基地址为:

03F8;

com2口的基地址为:

02F8。

根据串口线的连接,选择通信的是com1口还是com2口

2、

BOOLInitCommfile:

//串口初始化,这里只给出关键步骤的代码,下同

 HANDLEm_hComm;

 COMMTIMEOUTSm_CommTimeouts;

 m_hComm=CreateFile("

COM1"

  0,

  NULL,

  OPEN_EXISTING,

  FILE_FLAG_OVERLAPPED,file:

//重叠I/O方式

  0);

 if(m_hComm==INVALID_HANDLE_VALUE)

  {returnFALSE;

 m_CommTimeouts.ReadIntervalTimeout=1000;

 file:

//进行超时设置,读者应根据自己的实际需要设置

 m_CommTimeouts.ReadTotalTimeoutMultiplier=500;

 m_CommTimeouts.ReadTotalTimeoutConstant=5000;

 m_CommTimeouts.WriteTotalTimeoutMultiplier=500;

 m_CommTimeouts.WriteTotalTimeoutConstant=5000;

 if(!

SetCommTimeouts(m_hComm,&

m_CommTimeouts))

  {CloseHandle(m_hComm);

   returnFALSE;

 PurgeComm(m_hComm,PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_RXABORT|

 returnTRUE;

  在串口初始化成功后,就可以建立监控线程处理串口通信事件。

下面是该线程的关键代码。

UINTCommThread(LPVOIDpParam)

 BOOLbResult=FALSE;

 if(m_hComm)file:

//查看端口是否翻开,这里m_hComm同上,作者在这里做了简化

  PurgeComm(m_hComm,PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_RXABORT|   PURGE_TXABORT);

  for(;

;

)file:

//只要线程运行,就处于监视端口行为的无限循环

  {

   bResult=WaitCommEvent(m_hComm,&

Event,&

m_ov);

   if(!

bResult)

    {file:

//进行出错处理}

   else

   {

    Event=WaitForMultipleObjects(4,m_hEvent,FALSE,INFINITE);

    file:

//无限等待设定的事件发生,数组m_hEvent根据需要定义了须响应的接收,发送,关闭端口事件和OVERLAPPED类型的hEvent事件

    switch(Event)

//读写事件的响应处理过程,在此略}

    }

    return0;

 }

实验过程:

1.因为笔记本电脑上没有专门的串口供实验要求,所以先安装虚拟串口创立程序。

后创立两个虚拟串口。

2.实验要求实现串口的通信,因此添加MFC平台上的MSComm控件,通过此控件来实现通信。

3.

4.翻开串口,实现通信。

通信结束后关闭串口。

上图为实现串口通信的图,但通信时不能使用汉字。

调试主界面如下列图:

首先翻开串口,在发送区输入信息,然后点击发送信息,如下列图:

点击接收信息如下列图:

六、MODBUS协议实验原理

Modbus协议是应用于电子控制器上的一种通用语言。

通过此协议,控制器相互之间、控制器经由网络〔例如以太网〕和其它设备之间可以通信。

  Modbus协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。

它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。

它制定了消息域格局和内容的公共格式。

1、在Modbus网络上转输

标准的Modbus口是使用一RS-232C兼容串行接口,它定义了连接口的针脚、电缆控制器通信使用主—从技术,即仅一设备〔主设备〕能初始化传输〔查询〕。

其它设备〔从设备〕根据主设备查询提供的数据作出相应反响。

典型的主设备:

主机和可编程仪表。

典型的从设备:

可编程控制器。

主设备可单独和从设备通信,也能以播送方式和所有从设备通信。

如果单独通信,从设备返回一消息作为回应,如果是以播送方式查询的,那么不作任何回应。

Modbus协议建立了主设备查询的格式:

设备〔或播送〕地址、功能代码、所有要发送的数据、一错误检测域。

2、在其它类型网络上转输

3、查询—回应周期

〔1〕查询

〔2〕回应

如果从设备产生一正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应。

数据段包括了从设备收集的数据:

象存放器值或状态。

如果有错误发生,功能代码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。

错误检测域允许主设备确认消息内容是否可用。

ModBus的传输方式 

表3ASCII和RTU传输模式的特性 

ASCII可打印字符便于故障检测,而且对于用高级语言〔如Fortan〕编程的主计算机及主PC很适宜。

RTU那么适用于机器语言编程的计算机和PC主机。

用RTU模式传输的数据是8位二进制字符。

如欲转换为ASCII模式,那么每个RTU字符首先应分为高位和低位两局部,这两局部各含4位,然后转换成十六进制等量值。

用以构成报文的ASCII字符都是十六进制字符。

ASCII模式使用的字符虽是RTU模式的两倍,但ASCII数据的译玛和处理更为容易一些,此外,用RTU模式时报文字符必须以连续数据流的形式传送,用ASCII模式,字符之间可产生长达1s的间隔,以适应速度较快的机器。

表4给出了以RTU方式读取整数据的例子 

以RTU方式读取整数据的例子 

〔2〕ModBus的数据校验方式 

CRC-16〔循环冗余错误校验〕 

①装如一个16位存放器,所有数位均为1。

②该16位存放器的高位字节与开始8位字节进行“异或〞运算。

运算结果放入这个16位存放器。

③把这个16存放器向右移一位。

⑤重复③和④,直至移出8位。

⑥另外8位与该十六位存放器进行“异或〞运算。

⑦重复③~⑥,直至该报文所有字节均与16位存放器进行“异或〞运算,并移位8次。

⑧这个16位存放器的内容即2字节CRC错误校验,被加到报文的最高有效位。

另外,在某些非ModBus通信协议中也经常使用CRC16作为校验手段,而且产生了一些CRC16的变种,他们是使用CRC16多项式X↑16+X↑15+X↑2+1,单首次装入的16位存放器为0000;

使用CRC16的反序X↑16+X↑14+X↑1+1,首次装入存放器值为0000或FFFFH。

LRC〔纵向冗余错误校验〕 

线圈 

七、实验总结

本次实验虽属简单小型实验,却着实遇到不少问题,通过实验,我也进一步发现了自己在动手能力和自学能力方面的缺乏,当然对本实验所涉及到的东西也算是有了不少兴趣,感觉越来越有意思了。

同时也对rs232串口的发送与接收信息有了进一步的了解,初步认识了MODBUS协议传输数据的原理,相信本实验对我日后的进一步学习有莫大帮助。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 司法考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1