0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英创信息技术RS485接口通讯的WinCE编程介绍

英创信息技术 来源:英创信息技术 作者:英创信息技术 2019-11-14 09:41 次阅读

工业控制场合,RS485总线因其接口简单,组网方便,传输距离远等特点而得到广泛应用。RS485和RS232一样都是基于串口的通讯接口,数据收发的操作是一致的,所以使用的是同样WinCE的底层驱动程序。但是它们在实际应用中通讯模式却有着很大的区别,RS232接口为全双工数据通讯模式,而RS485接口为半双工数据通讯模式,数据的收发不能同时进行,为了保证数据收发的不冲突,硬件上是通过方向切换来实现的,相应也要求软件上必须将收发的过程严格地分开。WinCE是一个多线程实时操作系统,RS232通信数据收发可在不同线程中同时进行,而对于RS485就不能采用这种方式,必须按照一定的流程来实现RS485所要求的通讯过程。大多数的RS485通讯采用主从通讯方式,在本文中将以电力系统中常用的DL/T 645多功能电能表通信规约为例,来说明RS485半双工通讯的WinCE编程要点。

本例通过封装两个类来实现DL645通信规约,一、用于串口通信的CESerial类,完成打开、关闭串口,收发串口数据等功能。二、实现DL645规约链路层的类DL645_LCP,它提供设置通信地址,超时时间等信息,并完成通信帧的打包、解包、错误较验、数据帧收发的功能。

基于485半双工通信的特点,使用一个函数Transmit()来完成数据收发。在调用Transmit()函数发送数据后,程序并不立即返回,而是等待数据接收。一个完整的数据发送\接收过程如下:

·应用层调用DL645_LCP类的Transmit()方法,并将发送的数据传递给Transmit()。

·在Transmit()方法中对数据打包,增加帧起始符,帧结束符,校验码等信息,使其符合DL645规约。

·调用串口通信CESerial类的WritePort()方法函数,发送一帧数据。

·等待数据接收。遇下列情况之一时,函数返回:1、接收到一帧完整数据,2、接收超时,3、较验出错,4、通信出错。

下面是Transmit()函数的源代码:

int DL645_LCP::Transmit( LPSTR pDat, int DLen )

{

int i1, i2;

UCHAR WBuf[MaxWDatLen];

// fill write data

for( i1=0; i1《4; i1++ )

WBuf[i1] = 0xFE;

WBuf[i1] = 0x68;

i1++;

memcpy( &WBuf[i1], &m_LAddr, 6 );

i1 += 6;

WBuf[i1] = 0x68;

i1++;

memcpy( &WBuf[i1], pDat, 2 );

i1 += 2;

for( i2=2; i2 《 Dlen; i2++)

{

WBuf[i1] = pDat[i2] + 0x33;

i1++;

}

WBuf[i1] = GetCS( &WBuf[4], i1-4 );

i1++;

WBuf[i1] = 0x16;

i1++;

// write data

m_nDatLen = 0;

m_nDatErrFlg = 0;

m_nUserDatLen = 0;

m_state = RevStateIDLE;

// 发送一帧数据

ceSer.WritePort( (LPSTR)WBuf, i1 );

SetTimeOut( m_dwTimeOut );

// 等待数据接收

for(;;)

{

if( IsTimeOut() )

return ErrTimeout; // 接收超时返回

else if( m_nDatErrFlg == 1 )

return -2; // 数据出错返回

else if( m_state == RevStateEND ) // 数据接收完成返回

{

memcpy( pDat, &RBuf[8], m_nDatLen-8-2 );

return m_nUserDatLen;

}

else

{

Sleep( 5 );

}

}

}

数据接收时,CESerial类的中断处理函数收到数据,直接调用DL645_LCP类中的Receive()方法,在Receive()函数中完成一帧数据的解包工作。

void DL645_LCP::Receive( )

{

UINT i, i1;

if( m_nDatLen 《= MaxRDatLen )

{

for( i=0; i

{

SetTimeOut( m_dwTimeOut );

RBuf[m_nDatLen] = (unsigned char)ceSer.DatBuf[i];

switch( m_state )

{

case RevStateIDLE:

if( RBuf[m_nDatLen]==0x68 )

{

m_state = RevStateSTART;

m_nDatLen++;

}

break;

case RevStateSTART:

m_nDatLen++;

if( m_nDatLen==7 ) m_state = RevStateADDR;

break;

case RevStateADDR:

if( RBuf[m_nDatLen]==0x68 )

{

m_state = RevStateSTART1;

m_nDatLen++;

}

break;

case RevStateSTART1:

m_nDatLen++;

m_state = RevStateCTRL;

break;

case RevStateCTRL:

m_nUserDatLen = RBuf[m_nDatLen];

if( m_nUserDatLen==0 ) m_state = RevStateDATA;

else m_state = RevStateDLEN;

m_nDatLen++;

break;

case RevStateDLEN:

m_nDatLen++;

if( m_nDatLen==(10+m_nUserDatLen) )

m_state = RevStateDATA;

break;

case RevStateDATA:

m_state = RevStateSUM;

if( GetCS( RBuf, m_nDatLen)!= RBuf[m_nDatLen] )

m_nDatErrFlg = 1;

m_nDatLen++;

break;

case RevStateSUM:

if( RBuf[m_nDatLen]==0x16 )

{

m_nDatLen++;

for( i1=0; i1RBuf[10+i1] -= 0x33;

m_state = RevStateEND;

}

break;

default:;

}

}

}

else m_nDatErrFlg = 1;

}

利用本文提供的例程,在DL645_LCD类上做相应的修改,可方便的实现其它的485通信规约。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6085

    浏览量

    35196
收藏 人收藏

    评论

    相关推荐

    RS485通讯接口及其应用

    RS485通讯接口及其应用
    发表于 08-17 16:30

    主板中预装Modbus通讯协议

    modbus_Master.h,与原来的静态库保持不变,相应各个API函数的说明请参见网站技术天地文章《Wince下的Modbus主控通讯
    发表于 10-20 10:40

    RS485通讯接口芯片介绍及选型要点

    RS485接口有着丰富产品,适合各种通讯需求。总线端口有着增强的ESD性能及浪涌电流吸收能力。优恩RS485接口芯片UN3485 工作电压范
    发表于 03-30 16:46

    移通RS485转PROFINET网关

    数据)、触发数据改变发送(固定位置数据改变才会发送)。7、网关的状态字可全面反映网桥的通信状态和串口的通信状态,控制字可以灵活控制发送、接收逻辑。移通RS485转PROFINET网关PROFINET接口技术
    发表于 10-22 18:38

    RS485接口通讯WinCE编程要点

    在工业控制场合, RS485 总线因其接口简单,组网方便,传输距离远等特点而得到广泛应用。RS485RS232 一样都是基于串口的通讯
    发表于 06-09 15:47 56次下载

    RS485通讯接口及其应用

    RS485通讯接口及其应用 本文叙述了串行远距离通讯中流行的 R S 4 8 5 通讯方式的特点和组网方式. 给出了具体的电路,
    发表于 05-21 15:43 216次下载
    <b class='flag-5'>RS485</b><b class='flag-5'>通讯</b><b class='flag-5'>接口</b>及其应用

    rs485通讯协议

    rs485通讯协议是本技术频道的核心内容,介绍rs485通讯协议原理,
    发表于 08-13 17:21
    <b class='flag-5'>rs485</b><b class='flag-5'>通讯</b>协议

    RS485通讯基本要求

    RS485通讯基本要求,了解RS485常用的工业通讯方式呢,学习485必备
    发表于 06-14 17:51 48次下载

    工业通讯RS232如何转RS485通讯接头

    本文首先介绍RS232通讯RS485通讯的概述,其次介绍
    发表于 04-19 10:18 3.3w次阅读
    工业<b class='flag-5'>通讯</b><b class='flag-5'>RS</b>232如何转<b class='flag-5'>RS485</b><b class='flag-5'>通讯</b>接头

    信息技术WinCE系统多串口扩展方案简介

     异步串行通讯口(UART)是在工业自动化中应用最为广泛的通讯接口之一,其接口形式包括RS232C、RS
    的头像 发表于 10-31 15:15 1647次阅读
    <b class='flag-5'>英</b><b class='flag-5'>创</b><b class='flag-5'>信息技术</b><b class='flag-5'>WinCE</b>系统多串口扩展方案简介

    信息技术RS485总线的特征简介与实际应用

    发送标准,经通讯工业协会(TIA)修订后命名为TIA/EIA-485-A。满足RS485标准的收发器采用差分传输方式(Differential Driver Mode),数据最高传输速率为10Mbps,最大通信距离约为1219m
    的头像 发表于 10-31 15:09 2127次阅读
    <b class='flag-5'>英</b><b class='flag-5'>创</b><b class='flag-5'>信息技术</b><b class='flag-5'>RS485</b>总线的特征简介与实际应用

    信息技术工控主板对RS485硬件方向控制介绍

    RS485是工业现场最常用的现场总线之一。
    的头像 发表于 11-15 09:38 1426次阅读
    <b class='flag-5'>英</b><b class='flag-5'>创</b><b class='flag-5'>信息技术</b>工控主板对<b class='flag-5'>RS485</b>硬件方向控制<b class='flag-5'>介绍</b>

    信息技术工控系统中的RS485通讯接口设计介绍

    在工业控制、采集等现场应用中,非常普遍地都会使用到RS485、CAN等通讯接口。同时这类通讯线缆连接的两个设备相隔距离又比较远(最长的距离会达到1公里以上)、设备工作环境也比较恶劣(机
    的头像 发表于 02-03 10:22 1594次阅读
    <b class='flag-5'>英</b><b class='flag-5'>创</b><b class='flag-5'>信息技术</b>工控系统中的<b class='flag-5'>RS485</b><b class='flag-5'>通讯</b><b class='flag-5'>接口</b>设计<b class='flag-5'>介绍</b>

    信息技术WinCE主板与STM32多功能模块通讯介绍

    ,STM32F103RCT6通过其USB Device接口工控主板连接通讯,STM32在WinCE系统中被当做一个串口设备,
    的头像 发表于 02-06 11:12 2031次阅读

    什么是RS485接口

    什么是RS485接口? 随着科技的发展,通信技术已经渗透到我们生活的方方面面。在各种通信方式中,RS485接口因其独特的优势和广泛的应用领域
    的头像 发表于 01-11 17:37 4889次阅读