• RS232/485通信方式 保存和加载时数据的处理


    RS232/485通信方式

    数据以RS232/485方式通信时,以0xA5作为开始码,以0xAE作为结束码。在开始码和结束码之间的0xA5, 0xAA, 0xAE数据需要进行转码。

    PC端发送数据时将1个码变为2个码:

    0xA5 -> 0xAA 0x05

    0xAA -> 0xAA 0x0A

    0xAE -> 0xAA 0x0E

    PC端接收数据时将2个码变为1个码:

    0xAA 0x05 -> 0xA5

    0xAA 0x0A -> 0xAA

    0xAA 0xAE -> 0xAE

    如:

    int CRs232::SendData(const BYTE *pBuffer, int nLength)
    {
    int i;
    BYTE *pTemp;
    BYTE szTemp[4096];

    pTemp = szTemp;
    *pTemp++ = 0xA5;
    for(i=0; i<nLength; i++)
    {
    if(*pBuffer == 0xA5 || *pBuffer == 0xAA || *pBuffer == 0xAE)
    {
    *pTemp++ = 0xAA;
    *pTemp++ = (BYTE)(*pBuffer & 0x0f);
    }
    else
    {
    *pTemp++ = *pBuffer;
    }
    pBuffer++;
    }
    *pTemp++ = 0xAE;

    i = (int)(pTemp - szTemp);
    return WriteData(szTemp, i);
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////

    int CRs232::ReceiveData(BYTE *pBuffer, int nBufSize)
    {
    int nRead;
    int nLength;
    int i, rep;
    int cv;
    BYTE ch;
    BYTE szTemp[4096];
    bool bRecvStarted;

    #ifdef _DEBUG//测试缓冲区溢出
    //BYTE buffer[ 5 ];
    //pBuffer = buffer;
    //nBufSize = sizeof( buffer );
    #endif

    cv = 0;
    nLength = 0;
    bRecvStarted = false;
    for( rep = 1; rep > 0; )
    {
    nRead = ReadData( szTemp, sizeof( szTemp ) );
    if( nRead > 0 )
    {
    for( i = 0; i < nRead; i++ )
    {
    ch = szTemp[ i ];
    if( ch == 0xA5 )//开始接受数据
    {
    cv = 0;
    nLength = 0;
    bRecvStarted = true;
    }
    else if( ch == 0xAE )//结束接受数据
    {
    cv = 0;
    rep = -1; //设置成功接受数据标记
    bRecvStarted = false;
    break;
    }
    else if( ch == 0xAA )//设置转码标记
    {
    cv = 1;
    }
    else if( nLength < nBufSize )
    {
    if( bRecvStarted )//已开始接受数据
    {
    if( cv )//需要转码
    {
    cv = 0;
    pBuffer[ nLength++ ] = 0xA0 | ( 0x0F & ch );
    }
    else//不需转码
    {
    pBuffer[ nLength++ ] = ch;
    }
    }
    }
    else//缓冲区溢出
    {
    rep = 0; //设置主循环退出条件
    break; //退出此内循环
    }
    }
    }
    else//接受不到数据,
    {
    rep = 0;//设置主循环退出条件
    }
    }
    if( rep == -1 )//接受完整数据成功
    {
    return nLength;
    }
    else
    {
    return 0;
    }
    }

  • 相关阅读:
    VS 2005 RDLC报表实现WEB客户端打印(2)
    VS 2005 RDLC报表实现WEB客户端打印(1)
    封装就是一个包装,将包装的内外分为两个空间
    以count或是sum为条件的查询
    DbRulesAuthorizationProvider for .net 2.0
    Asp.net Ajax 'Sys'未定义
    广州网球场地名录
    谷歌 寄语
    深圳市网球场地一览表
    .net 2.0 串口通讯一小例
  • 原文地址:https://www.cnblogs.com/chenzuoyou/p/3144511.html
Copyright © 2020-2023  润新知