PLC与单片机串口通信设置模式和实现方法论文
“蒹葭遇风”通过精心收集,向本站投稿了4篇PLC与单片机串口通信设置模式和实现方法论文,下面是小编为大家整理后的PLC与单片机串口通信设置模式和实现方法论文,欢迎大家借鉴与参考,希望对大家有所帮助。
篇1:PLC与单片机串口通信设置模式和实现方法论文
PLC与单片机串口通信设置模式和实现方法论文
摘 要:作为一种应用较为广泛的现代化通信技术模式, PLC与单片机串口通信的合理设置和实现, 能够充分地提升行业内部的信息数据交换效率。相关领域的工作人员在日常管理和建设的活动中, 不断地完善PLC串行口与单片机的通信协议, 优化PLC串行口与单片机的通信流程, 有效地拓展PLC串行口与单片机应用途径, 结合现代科学技术, 为二者的有机融合与合理应用提供更为广阔的空间。本文对PLC与单片机串口设置模式进行了简单概述, 分析了PLC串口参数设置以及单片机串行口通信设置的方式;在此基础上, 进一步分析了PLC与单片机串口通信实现的方式。本文旨在为关注这一领域的人士提供一些可行性较高的参考意见, 为我国通信事业的发展做出积极贡献。
关键词:PLC; 单片机; 串口参数;
对于现代通信事业来说, 串行口的合理接入, 可以提升通信和管理的效率, 以更加方便灵活的'特点, 组成更加高效的通信系统。因此, 如何在此种环境下, 分析出PLC与单片机串口通信设置模式和实现方法, 成为了相关领域工作人员的工作重点之一。
1、PLC与单片机串口通信设置模式
1.1、PLC串口参数设置
PLC串行口主要通过对系统寄存器进行设置的方式, 达到系统串行接口初始化的目的。例如, 在进行操作的过程中, 可以应用fp1的系统寄存器, 在制定的位置上, 对串口的波特率进行控制。当串口波特率被控制在h00时, 便可以确定一个起始位、一个停止位以及八个数据位。在这一过程中, 没有奇偶校验位。串口的波特率可以设置在寄存器之中, 通过计算机连接通信的方式, 完成PLC串行口参数设置[1].
1.2、单片机串行口设置
单片机内部的都有一个串行口, 在发送端和接收端两个位置, 对寄存器进行控制。在对软件进行的设置的过程中, 专业技术人员需要对四种不同的通信方式进行集中管理。在单片机串行口的8位异步通信接口中, 可以通过集成点对点的接口方式, 实现8位数据的同时传输。在每一帧信息当中, 都按照一个起始位、一个停止位和八个数据位的组成结构, 将CPU晶振控制在11.0592 MHz, 应用9600bps的波特率, 实现对寄存器状态以及定时器的溢出率确定工作。
2、PLC与单片机串口通信实现方式
2.1、完善PLC串行口与单片机的通信协议
根据前文的分析和论述可以得出, 传统的PLC串行口与单片机可以完成串口通信, 但是在现代化科学技术持续发展的背景下, 传统的规定和标准协议无法持续提供给PLC串行口与单片机合理地使用保障, 相关领域的工作人员需要在日常规划和设计时, 完善PLC串行口与单片机的通信协议, 提升PLC串行口与单片机使用的稳定性和有效性。例如, 我国某地区的通信公司, 在对PLC串行口与单片机进行维护时, 采取了异步串行通信的方式, 着重对字符的格式和波特进行了规定。以协议的方式, 提升了PLC串行口与单片机在通信活动中的可靠性。当地通信公司还将FCS的计算方法进行了优化, 提高了信息数据的传输效率[2].
2.2、优化PLC串行口与单片机的通信流程
当单片机的串行端口存在一个数据寄存器sbup时, 在特定条件下, 当单片机向数据寄存器当中写入了数据, 就完成了发送的流程。若此时, 单片机向sbup当中读入数据时, 系统便启动了该项接受过程。当发送的过程结束之后, 单片机会同PLC一起发出命令帧格式, PLC对此作出相应的反应, 进而完成响应帧格式设定[3].这一过程通常被称为接受通信过程, 主要由单片机进行启动以及接受等多项操作, 并且基本上不需要应用PLC对程序进行编制。发出命令帧的格式主要为呼叫字符、特殊标志位以及PLC站号等。
2.3、拓展PLC串行口与单片机的应用途径
PLC串行口与单片机在现代化通信系统当中, 具有较为广泛的应用效果, 作为一种集成电路, 单片机可以组成多种不同的应用系统。单片机构成的应用系统规模各异, 从微型、小型、中型到大型系统, 都可以根据用户的实际需求进行设定。相比之下, PLC串行口与单片机中的PLC在进行系统设计时, 主要采用了配合外围电路系统的方式, 实现功能的设计。例如, 国内某地区通信公司, 在利用PLC串行口与单片机对通信系统进行优化设计的过程中, 采用了C语言和汇编语言等方式, 在多个不同的领域实现了高效应用。针对单片机在日常使用和维护中存在的困难, 当地通信公司的技术部门工作人员还对单片机和PLC进行了系统优化, 借助了PLC快捷且成功率高可靠性好的优势, 提升了通信系统整体使用效率[4].在尽可能降低经济成本的同时, 逐步扩大PLC串行口与单片机的经济效益和社会效益。该地区的通信企业, 将PLC串行口与单片机合理地应用到了日常生活中的公共交通卡、安保系统、全自动家电控制等方面, 为人们的生活带来了极大的便利。
3、结束语
作为一种应用较为广泛的现代化通信技术模式, PLC与单片机串口通信的合理设置和实现, 能够充分地提升行业内部的信息数据交换效率。相关领域的工作人员在日常管理和建设的活动中, 不断地完善PLC串行口与单片机的通信协议, 优化PLC串行口与单片机的通信流程, 有效地拓展PLC串行口与单片机应用途径, 结合现代科学技术, 为二者的有机融合与合理应用提供更为广阔的空间。
参考文献:
[1]叶翠安。三菱PLC与单片机间串口通信的实现[J].船电技术, , 35 (5) :66-69.
[2]胡家华, 徐鹏, 郑昌雨, 等。PL2303单片机串口转USB口实现串行通信[J].单片机与嵌入式系统应用, , 13 (4) :76-77+81.
[3]党强。PLC与单片机串口通信的实现[J].数字技术与应用, (4) :123+125.
[4]李丽艳。S7-226 PLC与AT89S51单片机串行通信设计研究[J].无线互联科技, (12) :147.
篇2:基因扩增仪与PC机串口通信的设计与实现论文
基因扩增仪(PCR仪)是根据DNA半保留复制原理,通过控制温度变化来自动完成聚合酶链式反应的仪器[1]。PCR仪是生命科学研究领域中使用极为广泛的一种设备,主要应用于基因克隆和医学诊断、遗传工程等领域。目前,随着社会水平的不断提高,人们为保证自己以及家人的生活质量,对医疗卫生要求极为严格。因此为了满足人们的需求,各国都开始在医疗行业上大量投入资金以及人力,鼓励发展医疗行业,从而保证人们的健康与安全。而这种趋势也催动了生命科学仪器的发展,基因扩增仪作为生命科学重要仪器之一,其处理器也从开始的单片机发展为ARM型。但是仅能单机操作的基因扩增仪并不能满足当前需求,从而与其他仪器设备的通信也成为目前主要研究方向之一。
本文重在利用OK6410开发板串口通信模块和Qtcreator环境下使用的第三方串行通信控件qextserialport,自定义通信协议,研究与实现ARM型基因扩增仪与PC机的串行通信,以完成相应的功能要求,满足社会需求。
1相关技术研究
1.1串口通信
串口通信是指外设和计算机间,通过数据信号线、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低[2]。
本文用的是RS-232串行通信,其接口标准:EIA公布的RS-232C是用得最多的一种串行口通讯标准。事实上的RS-232C串口标准配置为”D”型9针插头,其引脚定义如图1。
1.2QT图形界面系统
Qt是一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的,非常容易扩展,并允许真正地组件编程。本设计中上位机和下位机程序均利用QT开发,通过选择不同的编译器,即可生成X86版本和ARM版本的应用程序[3]。通过上位机的界面上的按钮可以实现对基因扩增仪各种参数的设置,也可读取PCR状态信息。使用QT开发程序具有以下优点:
1)优良的跨平台特性;2)面向对象;3)丰富的API及类库;4)运行速度快;5)大量的开发文档及实用的开发工具。
2基因扩增仪与PC机的通信硬件连接
本设计中基因扩增仪采用飞凌公司出品的开发板OK6410来实现。该开发板搭载了三星公司ARM11的处理器S3C6410。底板上提供了1个五线RS232电平串口(UART0)和3个三线TTL电平串口(UART1~UART3)。在开发阶段,需要两根串口线与PC机连接,其中UART0默认为调试串口,它的作用是可以与电脑直接相连,进而监控系统调试信息,另外一个串口需要使用MAX232将TTL电平转化为RS-232电平才可以和电脑相连,该串口线用于数据和指令的发送[4]。
本文采用三线制接法,ARM板上的RXD、TXD、GND分别与PC机的TXD、RXD、GND相连。如图2。
篇3:基因扩增仪与PC机串口通信的设计与实现论文
通信程序中下位机使用Qtcreator编写。通信时各参数设置情况如下:波特率为9600bit/s,数据位8位,停止位1位和无奇偶校验位。
3.1串行通信协议的制定
PC机与基因扩增仪的通信中需要实时的数据交互,因此必须保证通信的质量。而通信质量的保证很大程度上依赖于制定的通信协议的可靠性和高效性。本设计自定义了一种具备高效传输性的面向字节的通信协议,它使用的算法简单、变换效率高、可靠性强。在发送端中,其每一帧的格式如表1所示。
本设计中的通信是以帧为传送格式来创建同步过程的。每一帧都用2byte来表示它的开始标志和结束标志,称为BeginMark和EndMark,分别由固定值01H和0DH来表示,命令部分由A(41H)~Z(5AH),a(61H)~z(7AH)构成,占用1byte,数据部分根据命令的不同会有较大差别,且长度不固定,用来完成发送开关量信息、参数设定、打印信息发送等功能。部分命令就已确保了数据部分的长度,而在某些命令下数据长度是可变的,这时候需要在数据部分加入数据长度信息。在帧校验部分,本设计采用了异或和的校验方式,将从开始标志到数据部分的所有信息进行异或运算,最终的结果作为帧校验,占用1byte。
在接收端,收到信息后,会对接受到的信息进行解析,首先会对接收到的数据进行校验计算,与接受到的`帧校验进行对比,如果一致,则证明数据完整可靠,再进行命令部分和数据部分的解析,如果数据格式全部正确,则接收端会反馈给发送端正确接收的应答命令(ACK帧)如表2,并且执行相应的命令。如果数据格式错误,则反馈给发送端未正确识别命令(NAK帧)如表3,并且附含错误码来指明出错部分。
3.3通信软件的设计
3.3.1下位机程序设计流程图
下位机接收数据并可以在接受并处理上位机发送来的请求,完成相应的工作,软件设计流程图如图3所示:
3.3.2上位机程序设计
上位机可通过指令读取PCR状态信息,可以曲线直观显示下位机传输的数据,并且具有保存功能;并且可发送命令对下位机进行设置,命令语句如下:
4设计实现结果
上位机软件实现结果程序调试成功后,上位机正确获取基因扩增仪部分数据,如表4。
4结束语
本文针对新兴ARM型基因扩增仪的功能上的不足,利用OK6410开发板串口通信模块和Qtcreator环境下使用的第三方串行通信控件qextserialport,自定义严谨的通信协议,完成对基因扩增仪外部控制命令操作,使PC机与PCR仪可以根据人们需求进行实时数据的准确传输与控制。完善了ARM型基因扩增仪的通信功能,使其适应当前社会发展要求。实验表明,该设计可靠性强,稳定性好,具有一定的参考价值。当然,该文方法也存在不足之处,对远距离传输具有一定的局限性,以后可考虑在远距离通信中用无线等方式实现。
参考文献:
[1]张丽萍.基因扩增仪(PCR仪)温度校准装置的研究[D].天津:天津大学,.
[2]刘晖亮.一种车间设备层多串口信息测控终端软件系统的研究与开发[D].重庆:重庆大学,.
[3]霍亚飞.Qt及QtQuick开发实战精解[M].北京:北京航空航天出版社,2012.
[4]李敏.RS-232多串口扩展器件SP2538及其应用[J].国外电子器件,,4(4).
来源:电脑知识与技术 4期
篇4:用VC++6.0实现PC机与单片机之间串行通信的方法.net
湖南大学(长沙410082) 于小亿 王 辉 张志学 摘 要 详细介绍了在Windows环境下应用VC++实现PC机与单片机的几种串行通信方法,给出了用Visual C++6.0编写的PC机程序和用C51编写的单片机通信程序,经实际应用系统运行稳定可靠。 关键词 Visual C++ 类 串行通
湖南大学(长沙410082) 于小亿 王 辉 张志学
摘 要 详细介绍了在Windows环境下应用VC++实现PC机与单片机的几种串行通信方法,给出了用Visual C++6.0编写的PC机程序和用C51编写的单片机通信程序。经实际应用系统运行稳定可靠。
关键词 Visual C++ 类 串行通信
工业控制领域(如DCS系统),经常涉及到串行通信问题。为了实现微机和单片机之间的数据交换,人们用各种不同方法实现串行通信,如DOS下采用汇编语言或C语言,但在Windows 环境下却存在一些困难和不足。在Windows操作系统已经占据统治地位的情况下(何况有些系统根本不支持DOS如Windows2000)开发Windows 环境下串行通信技术就显得日益重要。
VC++6.0是微软公司于1998年推出的一种开发环境,以其强大的功能,友好的界面,32位面向对象的程序设计及Active X的灵活性而受广大软件开发者的青睐,被广泛应用于各个领域。应用VC++开发串行通信目前通常有如下几种方法:一是利用Windows API通信函数;二是利用VC的标准通信函数_inp、_inpw、_inpd、_outp、_outpw、_outpd等直接对串口进行操作;三是使用Microsoft Visual C++的通信控件(MSComm);四是利用第三方编写的通信类。以上几种方法中第一种使用面较广,但由于比较复杂,专业化程度较高,使用较困难;第二种需要了解硬件电路结构原理;第三种方法看来较简单,只需要对串口进行简单配置,但是由于使用令人费解的VARIANT类,使用也不是很容易;第四种方法是利用一种用于串行通信的CSerial类(这种类是由第三方提供),只要理解这种类的几个成员函数,就能方便的使用。笔者利用CSerial类很方便地实现了在固定式EBM气溶胶灭火系统分区启动器(单片机系统)与上位机的通信。以下将结合实例,给出实现串行通信的几种方法。
1 Windows API通信函数方法
与通信有关的Windows API函数共有26个,但主要有关的有:
CreateFile() 用 “comn”(n为串口号)作为文件名就可以打开串口。
ReadFile() 读串口。
WriteFile() 写串口。
CloseHandle() 关闭串口句柄。初始化时应注意CreateFile()函数中串口共享方式应设为0,串口为不可共享设备,其它与一般文件读写类似。以下给出API实现的源代码。
1.1 发送的例程
//声明全局变量
HANDLE m_hIDComDev;
OVERLAPPED m_OverlappedRead, m_Over lappedWrite;
//初始化串口
void CSerialAPIView::OnInitialUpdate()
{
CView::OnInitialUpdate();
Char szComParams[50];
DCB dcb;
Memset(&m_OverlappedRead, 0, sizeof (OVERLAPPED));
Memset(&m_OverlappedWrite, 0, sizeof (OVERLAPPED));
m_hIDComDev = NULL;
m_hIDComDev = CreateFile(“COM2”, GENERIC_READ│GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL│FILE_FLAG_OVERLAPPED, NULL);
if (m_hIDComDev == NULL)
{
AfxMessageBox(“Can not open serial port!”);
goto endd;
}
memset(&m_OverlappedRead, 0, sizeof (OVERLAPPED));
memset(&m_OverlappedWrite, 0, sizeof (OVERLAPPED));
COMMTIMEOUTS CommTimeOuts;
CommTimeOuts. ReadIntervalTimeout=0×FFFFFFFF;
CommTimeOuts. ReadTotalTimeoutMultiplier = 0;
CommTimeOuts. ReadTotalTimeoutConstant= 0;
CommTimeOuts. WriteTotalTimeoutMultiplier = 0;
CommTimeOuts. WriteTotalTimeoutConstant = 5000;
SetCommTimeouts(m_hIDComDev, &CommTimeOuts);
Wsprintf(szComparams, “COM2:9600, n, 8, 1”);
m_OverlappedRead. hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
m_OverlappedWrite. hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
dcb. DCBlength = sizeof(DCB);
GetCommState(m_hIDComDev, &dcb);
dcb. BaudRate = 9600;
dcb. ByteSize= 8;
unsigned char ucSet;
ucSet = (unsigned char) ((FC_RTSCTS&FC_DTRDSR) != 0);
ucSet = (unsigned char) ((FC_RTSCTS&FC_RTSCTS) ! = 0);
ucSet = (unsigned char) ((FC_RTSCTS&FC_XONXOFF) ! = 0);
if (!SetCommState(m_hIDComDev, &dcb)‖
!SetupComm(m_hIDComDev,10000,10000)‖
m_OverlappedRead. hEvent ==NULL‖
m_OverlappedWrite. hEvent ==NULL)
{
DWORD dwError = GetLastError();
if (m_OverlappedRead. hEvent != NULL) CloseHandle(m_OverlappedRead. hEvent);
if (m_OverlappedWrite. hEvent != NULL) CloseHandle(m_OverlappedWrite. hEvent);
CloseHandle(m_hIDComDev);
}
endd:
;
}
//发送数据
void CSerialAPIView::OnSend()
{
char szMessage[20] = “thank you very much”;
DWORD dwBytesWritten;
for (int i=0; i<sizeof(szMessage); i++)
{
WriteFile(m_hIDComDev, (LPSTR)&szMessage[i], 1, &dwBytesWritten, &m_OverlappedWrite);
if (WaitForSingleObject(m_OverlapperWrite, hEvent, 1000))dwBytesWritten = 0;
else{
GentOverlappedResult(m_hIDComDev, &m_OverlappedWrite, &dwBytesWritten, FALSE);
m_OverlappedWrite. Offset += dwBytesWritten;
}
dwBytesWritten++;
}
}
1.2 接收例程
DCB ComDcb; //设备控制块
HANDLE hCom; //global handle
hCom = CreateFile (“COM1”,GENERIC_READ| GENERIC_WRITE,0,
NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hCom==INVALID_HANDLE_VALUE)
{
AfxMessageBox(“无法打开串行口”);
}
else
{
COMMTIMEOUTS CommTimeOuts ;
SetCommMask(hCom, EV_RXCHAR ) ;
SetupComm(hCom, 4096, 4096 ) ; /*设置收发缓冲区 尺寸为4K */
PurgeComm(hCom, PURGE_TXABORT| PURGE_RXABORT |
PURGE_TXCLEAR| PURGE_RXCLEAR ) ; //清收发缓冲区
//以下初始化结构变量CommTimeOuts, 设置超时参数 CommTimeOuts.ReadIntervalTimeout = 0×FFFFFFFF ;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0 ;
CommTimeOuts.ReadTotalTimeoutConstant = 4000 ;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 4000 ;
SetCommTimeouts(hCom, &CommTimeOuts ); //设置超时参数
ComDcb.DCBlength = sizeof( DCB ) ;
GetCommState( hCom, &ComDcb ) ; //获取当前参数
ComDcb.BaudRate =9600; //波特率
ComDcb.ByteSize = 8; //数据位
ComDcb.Parity = 0; /*校验 0~4=no, odd, even, mark, space */
SetCommState(hCom, &ComDcb ) ;
} //设置新的通信参数
接收可用定时器或线程等
DWORD dRead,dReadNum;
unsigned char buff [200];
dRead=ReadFile(hCom, buff, 100, &dReadNum, NULL); //接收100个字符,
//dReadNum为实际接收字节数
2 利用端口函数直接操作
这种方式主要是采用两个端口函数_inp(), _outp()实现对串口的读写,其中读端口函数的原型为:
int _inp(unsigned shot port)
该函数从端口读取一个字节,端口号为0~65535。
写端口的函数原型为:
int _outp(unsigned shot port, int databyte)
该函数向指定端口写入一个字节。
不同的计算机串口地址可能不一样,通过向串口的控制及收发寄存器进行读写,可以实现灵活的串口通信功能,由于涉及具体的硬件电路讨论比较复杂,在此不加赘述,
3 MSComm控件
MSComm控件是微软开发的专用通信控件,封装了串口的所有功能,使用很方便,但在实际应用中要小心对其属性进行配置。下面详细说明该类应用方法。
3.1 MSComm控件的属性
CommPort:设置串口号,类型 short :1-comm1 2-comm2.
Settings:设置串口通信参数,类型 CString :B波特率,P奇偶性(N无校验,E偶校验,O奇校验),D字节有效位数,S停止位。
PortOpen:设置或返回串口状态,类型 BOOL:TURE打开,FALSE关闭。
InputMode:设置从接收缓冲区读取数据的格式,类型 long: 0-Text 1-Bin。
Input:从接收缓冲区读取数据,类型 VARIANT。
InBufferCount:接收缓冲区中的字节数,类型:short。
InBufferSize:接收缓冲区的大小,类型:short。
Output:向发送缓冲区写入数据,类型:VARIANT。
OutBufferCount:发送缓冲区中的字节数,类型:short。
OutBufferSize:发送缓冲区的大小,类型:short。
InputLen:设置或返回Input读出的字节数,类型:short。
CommEvent:串口事件,类型:short。
3.2 程序示例
串口初始化
if (!m_comm.GetPortOpen())
m_comm.SetPortOpen(TURE); /*打开串口*/
m_comm.SetSettings(“4800,n,8,1”); /*串口参数设置*/
m_comm.SetInputMode(0); /*设置TEXT缓冲区输入方式*/
m_comm.SetRthresHold(1); /*每接收一个字符则激发OnComm()事件*/
接收数据
m_comm.SetInputLen(1); /*每次读取一个字符
VARINAT V1=m_comm.GetInput();
/*读入字符*/
m_V1=V1.bstrval;
发送字符 m_comm.SetOutput(Colevariant (“Hello”); /*发送 “Hello” */
3.3 注意
SetOutput方法可以传输文本数据或二进制数据。用SetOutput方法传输文本数据,必须定义一个包含一个字符串的 Variant。发送二进制数据,必须传递一个包含字节数组的Variant 到 Output 属性。正常情况下,如果发送一个 ANSI 字符串到应用程序,可以以文本数据的形式发送。如果发送包含嵌入控制字符、Null 字符等的数据,要以二进制形式发送。此处望引起读者注意,笔者曾经在此犯错。
4 VC++类CSerial
4.1 串行通信类CSerial简介
Cserial 是由MuMega Technologies公司提供的一个免费的VC++类,可方便地实现串行通信。以下为该类定义的说明部分。
class CSerial
{
public:
CSerial();
~CSerial();
BOOL Open( int nPort = 2, int nBaud = 9600 );
BOOL Close( void );
int ReadData( void *, int );
int SendData( const char *, int );
int ReadDataWaiting( void );
BOOL IsOpened( void ){ return( m_bOpened ); }
protected:
BOOL WriteCommByte( unsigned char );
HANDLE m_hIDComDev;
OVERLAPPED m_OverlappedRead, m_OverlappedWrite;
BOOL m_bOpened;
}
4.2 串行通信类Cserial 成员函数简介
1. CSerial::Cserial是类构造函数,不带参数,负责初始化所有类成员变量。
2. CSerial:: Open这个成员函数打开通信端口。带两个参数,第一个是埠号,有效值是1到4,第二个参数是波特率,返回一个布尔量。
3. CSerial:: Close函数关闭通信端口。类析构函数调用这个函数,所以可不用显式调用这个函数。
4. CSerial:: SendData函数把数据从一个缓冲区写到串行端口。它所带的第一个参数是缓冲区指针,其中包含要被发送的资料;这个函数返回已写到端口的实际字节数。
5. CSerial:: ReadDataWaiting函数返回等待在通信端口缓冲区中的数据,不带参数。
6. CSerial:: ReadData函数从端口接收缓冲区读入数据。第一个参数是void*缓冲区指针,资料将被放入该缓冲区;第二个参数是个整数值,给出缓冲区的大小。
4.3 应用VC类的一个实例
1. 固定式EBM气溶胶灭火系统简介
固定式EBM气溶胶灭火装置分区启动器是专为EBM灭火装置设计的自动控制设备。可与两线制感温、感烟探测器配套使用,当监测部位发生火情时,探测器发出电信号给分区启动器,经逻辑判断后发出声、光报警,延时后自动启动EBM灭火装置。为了便于火灾事故的事后分析,需对重要的火警事件和关键性操作进行记录,记录应能从PC机读出来;PC机能控制、协调整个系统的工作,这些都涉及通信。本例中启动器采用RS-485通信接口,系统为主从式网络,PC机为上位机。具体的通信协议为:(1)下位机定时向上传送记录的事件;(2)应答发送,即PC机要得到最新事件记录,而传送时间未到时,PC机发送命令,下位机接收命令后,把最新记录传给上位机;(3)上位机发送其它命令如校时、启动、停止、手/自动等。
2. 通信程序设计
部分上位机程序
(1)发送命令字程序,代码如下
voidCCommDlg::OnSend()
{
CSerial Serial;
//构造串口类,初始化串行口
if (Serial.Open(2,9600)) //if-1
//打开串行口2,波特率为9600bps
{
static char szMessage[]=“0”;
//命令码(可定义各种命令码)
int nBytesSent;
int count=0;
resend:
nBytesSent=Serial.SendData(szMessage,strlen(szMessage));
//发送命令码
char rdMessage [20];
if (Serial.ReadDataWaiting()) //if-2
{
Serial.ReadData(rdMessage,88);
//rdMessage 定义接收字节存储区,为全局变量//
if ((rdMessage[0]!=0x7f)&&(count<3))
{
count++;
goto resend
}
if(count>=3)
MessageBox(“发送命令字失败”);
}
else //if-2
MessageBox(“接收数据错误”);
}
else //if-1
MessageBox(“串行口打开失败”);
}
下位机通信程序:
#include
#include
#include
#define count 9
#define com_code 0x00
#define com_code1 0xff
unsigned char buffer[count];
int po,year,month,date,hour;
int minute,second,recordID ;
int sum;
main()
{
…
/*初始化串口和定时器*/
TMOD=0×20;
TH1=0×fd;
TR1=0×01;
ET1=0×00;
ES=1;
EA=1;
/*待发送数据送缓冲区*/
buffer[0]=0×ff; //数据特征码
buffer[1]=count+1; //数据长度
buffer[2]=year; //年
buffer[3]=month; //月
buffer[4]=date; //日
buffer[5]=hour; //时
buffer[6]=minute; //分
buffer[7]=second; //秒
buffer[8]=recordID; //事件号
for(po=0;po
sum+=buffer[po];
buffer[9]=sum; //校验和
…
}
/*发送中断服务程序*/
void send(void) interrupt 4 using 1
{
int i;
RI=0;
EA=0;
do
{
for(i=0;i<=count;i++)
{
SBUF=buffer[i]; //发送数据和校验和//
while(TI==0);
TI=0;
}
while(RI==0);
RI=0;
}while(SBUF!=0); //主机接收不正确,重新发送//
EA=1;
Return;
}
5 应用总结
根据不同需要,选择合适的方法。我们选用的用VC++类实现的上位机和下位机的串行通信方法具有使用简单、编写程序方便的特点。经过半年多应用于EBM灭火系统的情况来看,该方法实现的系统运行稳定可靠,是一种值得推广的简单易行的通信方法。
参 考 文 献
1 Kate Gregory Visual C++6开发使用手册.北京:机械工业出版社,1999
2 何立民.单片机的C语言应用程序设计.北京:北京航空航天大学出版社,1997
3 马风格.VC控件与串行通讯.1999现代计算机,2000(4)
原文转自:www.ltesting.net
【PLC与单片机串口通信设置模式和实现方法论文】相关文章:






文档为doc格式