1、RS-232C标准协议的全称是EIA-RS-232C标准,其中EIA(Electronic Industry RS-232-C、EIA&RS-422-A、EIA&RS-423A、EIA&RS-485。 这里只介绍EIA&RS-232-C简称232,RS232。 例如,目前在IBM PC机上的COM1、COM2接口,就是RS-232C接口。RS232原理如图1-3。图1 RS232接口电缆和引脚外观图2 RS232 引脚定义DB9RS232接口硬件握手方式1 概述在现代的各种实时监控系统和通信系统中,在Windows 9X/NT下利用VC+对RS-232串口编程是常用的手段。Window
2、s 同时还可以建立其他的线程。线程是操作系统分配CPU时间的根本实体,每个线程占用的CPU时间由系统分配,系统不停的在线程之间切换。进程中的线程共享进程的虚拟地址空间,可以访问进程的资源,处于并行执行状态,这就是多线程的根本概念。2 VC+对多线程的支持3 多线程在串口通信中的应用3.1 串口通信对线程同步的要求因为同一进程的所有线程共享进程的虚拟地址空间,而在Windows 串口通信中,对于每个串口对象,只有一个缓冲区,发送和接收都要用到,必须建立起同步机制,使得在一个时候只能进行一种操作,否那么通信就会出错。VC+提供了同步对象来协调多线程的并行,常用的有以下几种:CCriticalSec
3、tion:临界区对象,将一段代码置入临界区,只允许最多一个线程进入执行这段代码。一个临界区仅在创立它的进程中有效。3.2 Win32 3.3 串口通信的重叠I/O方式五、编程实现代码实现:1、源码#include stdio.hbios.hmain()char ch;/*串口初始化*/outportb(0x3fb,0x80); /设置LCR,访问DLL、DLM,禁止串口中断,无校验,1位停止位;outportb(0x3f8,0x0C); /设置串口的波特率低八位(DLL);outportb(0x3f9,0x00); /设置串口的波特率高八位(DLM);outportb(0x3fb,0x03);
4、 /设置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) /假设线路状态存
5、放器LSR的末尾为1,表示接收就绪 ch=inportb(0x3f8); /读取数据 putch(ch); /显示数据 注:com1口的基地址为:03F8; com2口的基地址为:02F8。根据串口线的连接,选择通信的是com1口还是com2口2、BOOL InitComm file:/串口初始化,这里只给出关键步骤的代码,下同HANDLE m_hComm;COMMTIMEOUTS m_CommTimeouts;m_hComm = CreateFile(COM1, 0, NULL, OPEN_EXISTING,FILE_FLAG_OVERLAPPED, file:/重叠I/O方式0);if (
6、m_hComm = INVALID_HANDLE_VALUE) return FALSE;m_CommTimeouts.ReadIntervalTimeout = 1000;file:/进行超时设置,读者应根据自己的实际需要设置m_CommTimeouts.ReadTotalTimeoutMultiplier = 500;m_CommTimeouts.ReadTotalTimeoutConstant = 5000;m_CommTimeouts.WriteTotalTimeoutMultiplier = 500;m_CommTimeouts.WriteTotalTimeoutConstant =
7、 5000;if (!SetCommTimeouts(m_hComm, &m_CommTimeouts)CloseHandle(m_hComm);return FALSE;PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | return TRUE;在串口初始化成功后,就可以建立监控线程处理串口通信事件。下面是该线程的关键代码。UINT CommThread(LPVOID pParam) BOOL bResult = FALSE;if (m_hComm) file:/查看端口是否翻开,这里m_hComm同上,作者在
8、这里做了简化PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);for (;) file:/只要线程运行,就处于监视端口行为的无限循环bResult = WaitCommEvent(m_hComm, &Event, &m_ov);if (!bResult) file:/进行出错处理elseEvent = WaitForMultipleObjects(4, m_hEvent, FALSE, INFINITE);file:/无限等待设定的事件发生,数组m_hEvent根据需要定义了须响应
9、的接收,发送,关闭端口事件和OVERLAPPED类型的hEvent事件switch (Event)/读写事件的响应处理过程,在此略return 0;实验过程:1.因为笔记本电脑上没有专门的串口供实验要求,所以先安装虚拟串口创立程序。后创立两个虚拟串口。2.实验要求实现串口的通信,因此添加MFC平台上的MSComm控件,通过此控件来实现通信。3.4.翻开串口,实现通信。通信结束后关闭串口。上图为实现串口通信的图,但通信时不能使用汉字。调试主界面如下列图:首先翻开串口,在发送区输入信息,然后点击发送信息,如下列图:点击接收信息如下列图:六、MODBUS协议实验原理Modbus 协议是应用于电子控制
10、器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络例如以太网和其它设备之间可以通信。Modbus 协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。1、在Modbus网络上转输 标准的Modbus口是使用一RS-232C兼容串行接口,它定义了连接口的针脚、电缆 控制器通信使用主从技术,即仅一设备主设备能初始化传输查询。其它设备从设备根据主设备查询提供的数据作出相应反响。典型的主设备:主机和可编程仪表。典型的从设备:可编程控制器。
11、 主设备可单独和从设备通信,也能以播送方式和所有从设备通信。如果单独通信,从设备返回一消息作为回应,如果是以播送方式查询的,那么不作任何回应。Modbus协议建立了主设备查询的格式:设备或播送地址、功能代码、所有要发送的数据、一错误检测域。2、在其它类型网络上转输 3、查询回应周期 1查询 2回应 如果从设备产生一正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应。数据段包括了从设备收集的数据:象存放器值或状态。如果有错误发生,功能代码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。错误检测域允许主设备确认消息内容是否可用。ModBus的传输方式3表3
12、ASCII和RTU传输模式的特性ASCII可打印字符便于故障检测,而且对于用高级语言如Fortan编程的主计算机及主PC很适宜。RTU那么适用于机器语言编程的计算机和PC主机。用RTU模式传输的数据是8位二进制字符。如欲转换为ASCII模式,那么每个RTU字符首先应分为高位和低位两局部,这两局部各含4位,然后转换成十六进制等量值。用以构成报文的ASCII字符都是十六进制字符。ASCII模式使用的字符虽是RTU模式的两倍,但ASCII数据的译玛和处理更为容易一些,此外,用RTU模式时报文字符必须以连续数据流的形式传送,用ASCII模式,字符之间可产生长达1s的间隔,以适应速度较快的机器。表4给出
13、了以RTU方式读取整数据的例子以RTU方式读取整数据的例子2ModBus的数据校验方式CRC-16循环冗余错误校验:装如一个16位存放器,所有数位均为1。该16位存放器的高位字节与开始8位字节进行“异或运算。运算结果放入这个16位存放器。把这个16存放器向右移一位。重复和,直至移出8位。另外8位与该十六位存放器进行“异或运算。重复,直至该报文所有字节均与16位存放器进行“异或运算,并移位8次。这个16位存放器的内容即2字节CRC错误校验,被加到报文的最高有效位。另外,在某些非ModBus通信协议中也经常使用CRC16作为校验手段,而且产生了一些CRC16的变种,他们是使用CRC16多项式X16+X15+X2+1,单首次装入的16位存放器为0000;使用CRC16的反序X16+X14+X1+1,首次装入存放器值为0000或FFFFH。LRC纵向冗余错误校验线圈七、实验总结 本次实验虽属简单小型实验,却着实遇到不少问题,通过实验,我也进一步发现了自己在动手能力和自学能力方面的缺乏,当然对本实验所涉及到的东西也算是有了不少兴趣,感觉越来越有意思了。同时也对rs232串口的发送与接收信息有了进一步的了解,初步认识了MODBUS协议传输数据的原理,相信本实验对我日后的进一步学习有莫大帮助。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1