0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

英創(chuàng)信息技術(shù)RS485接口通訊的WinCE編程介紹

英創(chuàng)信息技術(shù) ? 來源:英創(chuàng)信息技術(shù) ? 作者:英創(chuàng)信息技術(shù) ? 2019-11-14 09:41 ? 次閱讀

工業(yè)控制場(chǎng)合,RS485總線因其接口簡(jiǎn)單,組網(wǎng)方便,傳輸距離遠(yuǎn)等特點(diǎn)而得到廣泛應(yīng)用。RS485和RS232一樣都是基于串口的通訊接口,數(shù)據(jù)收發(fā)的操作是一致的,所以使用的是同樣WinCE的底層驅(qū)動(dòng)程序。但是它們?cè)趯?shí)際應(yīng)用中通訊模式卻有著很大的區(qū)別,RS232接口為全雙工數(shù)據(jù)通訊模式,而RS485接口為半雙工數(shù)據(jù)通訊模式,數(shù)據(jù)的收發(fā)不能同時(shí)進(jìn)行,為了保證數(shù)據(jù)收發(fā)的不沖突,硬件上是通過方向切換來實(shí)現(xiàn)的,相應(yīng)也要求軟件上必須將收發(fā)的過程嚴(yán)格地分開。WinCE是一個(gè)多線程實(shí)時(shí)操作系統(tǒng),RS232通信數(shù)據(jù)收發(fā)可在不同線程中同時(shí)進(jìn)行,而對(duì)于RS485就不能采用這種方式,必須按照一定的流程來實(shí)現(xiàn)RS485所要求的通訊過程。大多數(shù)的RS485通訊采用主從通訊方式,在本文中將以電力系統(tǒng)中常用的DL/T 645多功能電能表通信規(guī)約為例,來說明RS485半雙工通訊的WinCE編程要點(diǎn)。

本例通過封裝兩個(gè)類來實(shí)現(xiàn)DL645通信規(guī)約,一、用于串口通信的CESerial類,完成打開、關(guān)閉串口,收發(fā)串口數(shù)據(jù)等功能。二、實(shí)現(xiàn)DL645規(guī)約鏈路層的類DL645_LCP,它提供設(shè)置通信地址,超時(shí)時(shí)間等信息,并完成通信幀的打包、解包、錯(cuò)誤較驗(yàn)、數(shù)據(jù)幀收發(fā)的功能。

基于485半雙工通信的特點(diǎn),使用一個(gè)函數(shù)Transmit()來完成數(shù)據(jù)收發(fā)。在調(diào)用Transmit()函數(shù)發(fā)送數(shù)據(jù)后,程序并不立即返回,而是等待數(shù)據(jù)接收。一個(gè)完整的數(shù)據(jù)發(fā)送\接收過程如下:

·應(yīng)用層調(diào)用DL645_LCP類的Transmit()方法,并將發(fā)送的數(shù)據(jù)傳遞給Transmit()。

·在Transmit()方法中對(duì)數(shù)據(jù)打包,增加幀起始符,幀結(jié)束符,校驗(yàn)碼等信息,使其符合DL645規(guī)約。

·調(diào)用串口通信CESerial類的WritePort()方法函數(shù),發(fā)送一幀數(shù)據(jù)。

·等待數(shù)據(jù)接收。遇下列情況之一時(shí),函數(shù)返回:1、接收到一幀完整數(shù)據(jù),2、接收超時(shí),3、較驗(yàn)出錯(cuò),4、通信出錯(cuò)。

下面是Transmit()函數(shù)的源代碼:

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;

// 發(fā)送一幀數(shù)據(jù)

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

SetTimeOut( m_dwTimeOut );

// 等待數(shù)據(jù)接收

for(;;)

{

if( IsTimeOut() )

return ErrTimeout; // 接收超時(shí)返回

else if( m_nDatErrFlg == 1 )

return -2; // 數(shù)據(jù)出錯(cuò)返回

else if( m_state == RevStateEND ) // 數(shù)據(jù)接收完成返回

{

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

return m_nUserDatLen;

}

else

{

Sleep( 5 );

}

}

}

數(shù)據(jù)接收時(shí),CESerial類的中斷處理函數(shù)收到數(shù)據(jù),直接調(diào)用DL645_LCP類中的Receive()方法,在Receive()函數(shù)中完成一幀數(shù)據(jù)的解包工作。

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類上做相應(yīng)的修改,可方便的實(shí)現(xiàn)其它的485通信規(guī)約。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式主板
    +關(guān)注

    關(guān)注

    7

    文章

    6081

    瀏覽量

    34936
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    RS485通訊接口及其應(yīng)用

    RS485通訊接口及其應(yīng)用
    發(fā)表于 08-17 16:30

    創(chuàng)主板中預(yù)裝Modbus通訊協(xié)議

    modbus_Master.h,與原來的靜態(tài)庫保持不變,相應(yīng)各個(gè)API函數(shù)的說明請(qǐng)參見創(chuàng)網(wǎng)站技術(shù)天地文章《Wince下的Modbus主控通訊
    發(fā)表于 10-20 10:40

    RS485通訊接口芯片介紹及選型要點(diǎn)

    RS485接口有著豐富產(chǎn)品,適合各種通訊需求??偩€端口有著增強(qiáng)的ESD性能及浪涌電流吸收能力。優(yōu)恩RS485接口芯片UN3485 工作電壓范
    發(fā)表于 03-30 16:46

    ?移通創(chuàng)聯(lián)RS485轉(zhuǎn)PROFINET網(wǎng)關(guān)

    數(shù)據(jù))、觸發(fā)數(shù)據(jù)改變發(fā)送(固定位置數(shù)據(jù)改變才會(huì)發(fā)送)。7、網(wǎng)關(guān)的狀態(tài)字可全面反映網(wǎng)橋的通信狀態(tài)和串口的通信狀態(tài),控制字可以靈活控制發(fā)送、接收邏輯。移通創(chuàng)聯(lián)RS485轉(zhuǎn)PROFINET網(wǎng)關(guān)PROFINET接口技術(shù)
    發(fā)表于 10-22 18:38

    RS485接口通訊WinCE編程要點(diǎn)

    在工業(yè)控制場(chǎng)合, RS485 總線因其接口簡(jiǎn)單,組網(wǎng)方便,傳輸距離遠(yuǎn)等特點(diǎn)而得到廣泛應(yīng)用。RS485RS232 一樣都是基于串口的通訊
    發(fā)表于 06-09 15:47 ?56次下載

    RS485通訊接口及其應(yīng)用

    RS485通訊接口及其應(yīng)用 本文敘述了串行遠(yuǎn)距離通訊中流行的 R S 4 8 5 通訊方式的特點(diǎn)和組網(wǎng)方式. 給出了具體的電路,
    發(fā)表于 05-21 15:43 ?216次下載
    <b class='flag-5'>RS485</b><b class='flag-5'>通訊</b><b class='flag-5'>接口</b>及其應(yīng)用

    rs485通訊協(xié)議

    rs485通訊協(xié)議是本技術(shù)頻道的核心內(nèi)容,介紹rs485通訊協(xié)議原理,
    發(fā)表于 08-13 17:21
    <b class='flag-5'>rs485</b><b class='flag-5'>通訊</b>協(xié)議

    RS485通訊基本要求

    RS485通訊基本要求,了解RS485常用的工業(yè)通訊方式呢,學(xué)習(xí)485必備
    發(fā)表于 06-14 17:51 ?48次下載

    工業(yè)通訊RS232如何轉(zhuǎn)RS485通訊接頭

    本文首先介紹RS232通訊RS485通訊的概述,其次介紹
    發(fā)表于 04-19 10:18 ?3.2w次閱讀
    工業(yè)<b class='flag-5'>通訊</b><b class='flag-5'>RS</b>232如何轉(zhuǎn)<b class='flag-5'>RS485</b><b class='flag-5'>通訊</b>接頭

    創(chuàng)信息技術(shù)WinCE系統(tǒng)多串口擴(kuò)展方案簡(jiǎn)介

     異步串行通訊口(UART)是在工業(yè)自動(dòng)化中應(yīng)用最為廣泛的通訊接口之一,其接口形式包括RS232C、RS
    的頭像 發(fā)表于 10-31 15:15 ?1587次閱讀
    <b class='flag-5'>英</b><b class='flag-5'>創(chuàng)</b><b class='flag-5'>信息技術(shù)</b><b class='flag-5'>WinCE</b>系統(tǒng)多串口擴(kuò)展方案簡(jiǎn)介

    創(chuàng)信息技術(shù)RS485總線的特征簡(jiǎn)介與實(shí)際應(yīng)用

    發(fā)送標(biāo)準(zhǔn),經(jīng)通訊工業(yè)協(xié)會(huì)(TIA)修訂后命名為TIA/EIA-485-A。滿足RS485標(biāo)準(zhǔn)的收發(fā)器采用差分傳輸方式(Differential Driver Mode),數(shù)據(jù)最高傳輸速率為10Mbps,最大通信距離約為1219m
    的頭像 發(fā)表于 10-31 15:09 ?2026次閱讀
    <b class='flag-5'>英</b><b class='flag-5'>創(chuàng)</b><b class='flag-5'>信息技術(shù)</b><b class='flag-5'>RS485</b>總線的特征簡(jiǎn)介與實(shí)際應(yīng)用

    創(chuàng)信息技術(shù)工控主板對(duì)RS485硬件方向控制介紹

    RS485是工業(yè)現(xiàn)場(chǎng)最常用的現(xiàn)場(chǎng)總線之一。
    的頭像 發(fā)表于 11-15 09:38 ?1364次閱讀
    <b class='flag-5'>英</b><b class='flag-5'>創(chuàng)</b><b class='flag-5'>信息技術(shù)</b>工控主板對(duì)<b class='flag-5'>RS485</b>硬件方向控制<b class='flag-5'>介紹</b>

    創(chuàng)信息技術(shù)工控系統(tǒng)中的RS485通訊接口設(shè)計(jì)介紹

    在工業(yè)控制、采集等現(xiàn)場(chǎng)應(yīng)用中,非常普遍地都會(huì)使用到RS485、CAN等通訊接口。同時(shí)這類通訊線纜連接的兩個(gè)設(shè)備相隔距離又比較遠(yuǎn)(最長的距離會(huì)達(dá)到1公里以上)、設(shè)備工作環(huán)境也比較惡劣(機(jī)
    的頭像 發(fā)表于 02-03 10:22 ?1517次閱讀
    <b class='flag-5'>英</b><b class='flag-5'>創(chuàng)</b><b class='flag-5'>信息技術(shù)</b>工控系統(tǒng)中的<b class='flag-5'>RS485</b><b class='flag-5'>通訊</b><b class='flag-5'>接口</b>設(shè)計(jì)<b class='flag-5'>介紹</b>

    創(chuàng)信息技術(shù)WinCE主板與STM32多功能模塊通訊介紹

    ,STM32F103RCT6通過其USB Device接口創(chuàng)工控主板連接通訊,STM32在WinCE系統(tǒng)中被當(dāng)做一個(gè)串口設(shè)備,
    的頭像 發(fā)表于 02-06 11:12 ?1938次閱讀

    什么是RS485接口?

    什么是RS485接口? 隨著科技的發(fā)展,通信技術(shù)已經(jīng)滲透到我們生活的方方面面。在各種通信方式中,RS485接口因其獨(dú)特的優(yōu)勢(shì)和廣泛的應(yīng)用領(lǐng)域
    的頭像 發(fā)表于 01-11 17:37 ?4333次閱讀