rs232串口通信实验报告文档格式.docx
- 文档编号:19312724
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:11
- 大小:666.55KB
rs232串口通信实验报告文档格式.docx
《rs232串口通信实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《rs232串口通信实验报告文档格式.docx(11页珍藏版)》请在冰豆网上搜索。
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的传输方式
3
表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协议传输数据的原理,相信本实验对我日后的进一步学习有莫大帮助。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- rs232 串口 通信 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)