亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? portserial.c

?? 一個開源的Modbus協議棧
?? C
字號:
/*
 * FreeModbus Libary: Win32 Port
 * Copyright (C) 2006 Christian Walter <wolti@sil.at>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 *
 * File: $Id: portserial.c,v 1.6 2006/07/21 10:59:14 wolti Exp $
 */

#include <windows.h>

#include "port.h"

/* ----------------------- Modbus includes ----------------------------------*/
#include "mb.h"
#include "mbport.h"
#include "mbconfig.h"

/* ----------------------- Defines  -----------------------------------------*/
#if MB_ASCII_ENABLED == 1
#define	BUF_SIZE	513     /* must hold a complete ASCII frame. */
#else
#define	BUF_SIZE	256     /* must hold a complete RTU frame. */
#endif

/* ----------------------- Static variables ---------------------------------*/
static HANDLE   g_hSerial;
static BOOL     bRxEnabled;
static BOOL     bTxEnabled;

static UCHAR    ucBuffer[BUF_SIZE];
static INT      uiRxBufferPos;
static INT      uiTxBufferPos;

/* ----------------------- Function prototypes ------------------------------*/
LPTSTR          Error2String( DWORD dwError );

/* ----------------------- Begin implementation -----------------------------*/
void
vMBPortSerialEnable( BOOL bEnableRx, BOOL bEnableTx )
{
    /* it is not allowed that both receiver and transmitter are enabled. */
    assert( !bEnableRx || !bEnableTx );

    if( bEnableRx )
    {
        PurgeComm( g_hSerial, PURGE_RXCLEAR );
        uiRxBufferPos = 0;
        bRxEnabled = TRUE;
    }
    else
    {
        bRxEnabled = FALSE;
    }
    if( bEnableTx )
    {
        bTxEnabled = TRUE;
        uiTxBufferPos = 0;
    }
    else
    {
        bTxEnabled = FALSE;
    }
}

BOOL
xMBPortSerialInit( UCHAR ucPort, ULONG ulBaudRate, UCHAR ucDataBits,
                   eMBParity eParity )
{
    TCHAR           szDevice[8];
    BOOL            bStatus = TRUE;
    DCB             dcb;



    memset( &dcb, 0, sizeof( dcb ) );

    dcb.DCBlength = sizeof( dcb );
    dcb.BaudRate = ulBaudRate;

    _stprintf_s( szDevice, 8, _T( "COM%d" ), ucPort );

    switch ( eParity )
    {
        case MB_PAR_NONE:
            dcb.Parity = NOPARITY;
            dcb.fParity = 0;
            break;
        case MB_PAR_EVEN:
            dcb.Parity = EVENPARITY;
            dcb.fParity = 1;
            break;
        case MB_PAR_ODD:
            dcb.Parity = ODDPARITY;
            dcb.fParity = 1;
            break;
        default:
            bStatus = FALSE;
    }

    switch ( ucDataBits )
    {
        case 8:
            dcb.ByteSize = 8;
            break;
        case 7:
            dcb.ByteSize = 7;
            break;
        default:
            bStatus = FALSE;
    }



    if( bStatus )
    {
        /* we don't use XON/XOFF flow control. */
        dcb.fInX = dcb.fOutX = FALSE;
        /* we don't need hardware handshake. */
        dcb.fOutxCtsFlow = dcb.fOutxCtsFlow = FALSE;
        dcb.fRtsControl = RTS_CONTROL_ENABLE;
        dcb.fDtrControl = DTR_CONTROL_ENABLE;

        /* misc parameters */
        dcb.fErrorChar = FALSE;
        dcb.fBinary = TRUE;
        dcb.fNull = FALSE;
        dcb.fAbortOnError = FALSE;
        dcb.wReserved = 0;
        dcb.XonLim = 2;
        dcb.XoffLim = 4;
        dcb.XonChar = 0x13;
        dcb.XoffChar = 0x19;
        dcb.EvtChar = 0;

        /* Open the serial device. */
        g_hSerial =
            CreateFile( szDevice, GENERIC_READ | GENERIC_WRITE, 0, NULL,
                        OPEN_EXISTING, 0, NULL );


        if( g_hSerial == INVALID_HANDLE_VALUE )
        {
            vMBPortLog( MB_LOG_ERROR, _T( "SER-INIT" ), _T( "Can't open serial port %s: %s" ),
                        szDevice, Error2String( GetLastError( ) ) );
            bStatus = FALSE;
        }
        else if( !SetCommState( g_hSerial, &dcb ) )
        {
            vMBPortLog( MB_LOG_ERROR, _T( "SER-INIT" ),
                        _T( "Can't set settings for serial device %s: %s" ), 
                        szDevice, Error2String( GetLastError( ) ) );
            bStatus = FALSE;
        }
        else if( !SetCommMask( g_hSerial, 0 ) )
        {
            vMBPortLog( MB_LOG_ERROR, _T( "SER-INIT" ),
                        _T( "Can't set communication event mask for serial device %s: %s" ),
                        szDevice, Error2String( GetLastError( ) ) );
            bStatus = FALSE;
        }

        else
        {
            vMBPortSerialEnable( FALSE, FALSE );
            bStatus = TRUE;
        }
    }
    return bStatus;
}

BOOL
xMBPortSerialSetTimeout( DWORD dwTimeoutMs )
{
    BOOL            bStatus;
    COMMTIMEOUTS    cto;

    /* usTimeOut is the inter character timeout used to detect the end 
     * of frame. The total timeout is set to 50ms to make sure we
     * can exit the blocking read. */
    cto.ReadIntervalTimeout = dwTimeoutMs;
    cto.ReadTotalTimeoutConstant = 50;
    cto.ReadTotalTimeoutMultiplier = 0;
    cto.WriteTotalTimeoutConstant = 0;
    cto.WriteTotalTimeoutMultiplier = 0;

    if( !SetCommTimeouts( g_hSerial, &cto ) )
    {
         vMBPortLog( MB_LOG_ERROR, _T( "SER-INIT" ),
                     _T( "Can't set timeouts for serial device: %s" ),
                     Error2String( GetLastError( ) ) );
        bStatus = FALSE;
    }
    else
    {
        bStatus = TRUE;
    }

    return bStatus;
}

void
vMBPortClose ( void )
{
    ( void )CloseHandle( g_hSerial );
}

BOOL
xMBPortSerialPoll(  )
{
    BOOL            bStatus = TRUE;
    DWORD           dwBytesRead;
    DWORD           dwBytesWritten;
    DWORD           i;

    while( bRxEnabled )
    {
        /* buffer wrap around. */
        if( uiRxBufferPos >= BUF_SIZE )
            uiRxBufferPos = 0;

        if( ReadFile( g_hSerial, &ucBuffer[uiRxBufferPos],
                      BUF_SIZE - uiRxBufferPos, &dwBytesRead, NULL ) )
        {
            if( dwBytesRead == 0 )
            {
                /* timeout with no bytes. */
                break;
            }
            else if( dwBytesRead > 0 )
            {
                vMBPortLog( MB_LOG_DEBUG, _T( "SER-POLL" ),
                            _T( "detected end of frame (t3.5 expired.)\r\n" ) );
                for( i = 0; i < dwBytesRead; i++ )
                {
                    /* Call the modbus stack and let him fill the buffers. */
                    ( void )pxMBFrameCBByteReceived(  );
                }
            }
        }
        else
        {
            vMBPortLog( MB_LOG_ERROR, _T( "SER-POLL" ), _T( "I/O error on serial device: %s" ),
                        Error2String( GetLastError ( ) ) );
            bStatus = FALSE;
        }
    }
    if( bTxEnabled )
    {
        while( bTxEnabled )
        {
            ( void )pxMBFrameCBTransmitterEmpty(  );
            /* Call the modbus stack to let him fill the buffer. */
        }
        dwBytesWritten = 0;
        if( !WriteFile
            ( g_hSerial, &ucBuffer[0], uiTxBufferPos, &dwBytesWritten, NULL )
            || ( dwBytesWritten != uiTxBufferPos ) )
        {
            vMBPortLog( MB_LOG_ERROR, _T( "SER-POLL" ), _T( "I/O error on serial device: %s" ),
                        Error2String( GetLastError ( ) ) );
            bStatus = FALSE;
        }
    }

    return bStatus;
}

BOOL
xMBPortSerialPutByte( CHAR ucByte )
{
    assert( uiTxBufferPos < BUF_SIZE );
    ucBuffer[uiTxBufferPos] = ucByte;
    uiTxBufferPos++;
    return TRUE;
}

BOOL
xMBPortSerialGetByte( CHAR * pucByte )
{
    assert( uiRxBufferPos < BUF_SIZE );
    *pucByte = ucBuffer[uiRxBufferPos];
    uiRxBufferPos++;
    return TRUE;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久99精品久久久| 中文字幕av一区二区三区高| 高清久久久久久| 紧缚捆绑精品一区二区| 日韩在线a电影| 亚洲成人av中文| 亚洲成av人**亚洲成av**| 亚洲成人1区2区| 卡一卡二国产精品 | 精品午夜一区二区三区在线观看| 日本v片在线高清不卡在线观看| 日韩黄色在线观看| 毛片一区二区三区| 国产自产高清不卡| 国产成人av电影免费在线观看| 成人综合婷婷国产精品久久蜜臀| 成人激情小说网站| 91免费看`日韩一区二区| 欧美在线|欧美| 欧美一区二区在线免费观看| 欧美精品一区二区三区视频| 国产欧美日韩视频在线观看| 亚洲男女一区二区三区| 日韩av在线免费观看不卡| 国产精品一区二区免费不卡 | 欧美精品三级日韩久久| 日韩免费看的电影| 国产视频一区在线播放| 一区二区三区中文免费| 日本sm残虐另类| eeuss鲁片一区二区三区| 欧美日韩一卡二卡| 国产日韩欧美激情| 日韩精品亚洲一区| www.欧美.com| 精品久久久久久无| 亚洲一区在线观看免费观看电影高清| 久久精品99国产精品| 99国产精品久| 日韩精品一区二区三区蜜臀| 亚洲欧美日韩小说| 国产做a爰片久久毛片| 在线精品国精品国产尤物884a| 精品福利av导航| 亚洲综合在线观看视频| 国产99久久精品| 欧美一区二区三区白人| 18欧美亚洲精品| 国产精品一区二区三区四区| 欧美一级黄色片| 一区二区三区日韩在线观看| 国产高清一区日本| 51久久夜色精品国产麻豆| 1区2区3区国产精品| 成人午夜视频免费看| 日韩欧美区一区二| 视频一区欧美日韩| 日本久久一区二区三区| 欧美国产国产综合| 国产最新精品免费| 日韩欧美中文字幕制服| 日韩成人av影视| 欧美日韩国产欧美日美国产精品| 国产精品免费免费| 成人一区二区三区视频| 久久综合色之久久综合| 久久精品国产第一区二区三区| 91精品黄色片免费大全| 五月天一区二区| 欧美日韩一区二区欧美激情| 亚洲高清免费观看| 欧美日韩免费视频| 亚洲成人三级小说| 欧美一区二区免费视频| 免费在线欧美视频| 日韩免费一区二区三区在线播放| 毛片av中文字幕一区二区| 日韩欧美国产高清| 国产在线播精品第三| 久久免费偷拍视频| 成人国产精品免费观看视频| 国产精品国产三级国产aⅴ原创| 成人免费观看视频| 亚洲蜜桃精久久久久久久| 色域天天综合网| 水野朝阳av一区二区三区| 欧美一区二区网站| 国模无码大尺度一区二区三区| 久久精品一区二区三区不卡 | 欧美xxxxx裸体时装秀| 蜜臀久久99精品久久久画质超高清| 欧美一二三区在线| 国产一区二区三区久久悠悠色av| 久久精品一区二区三区不卡牛牛| 99久久久精品免费观看国产蜜| 亚洲欧美日韩小说| 日韩欧美中文一区二区| 国产精品中文字幕一区二区三区| 欧美激情在线一区二区| 色综合天天综合在线视频| 亚洲午夜精品在线| 久久久久国色av免费看影院| 99精品久久免费看蜜臀剧情介绍| 亚洲图片自拍偷拍| 久久综合久色欧美综合狠狠| 99re成人精品视频| 青青草原综合久久大伊人精品| 日韩欧美中文字幕制服| 91麻豆免费在线观看| 免费成人小视频| 国产精品私人影院| 6080国产精品一区二区| 国产精品66部| 日韩精品一二三四| 自拍av一区二区三区| 91精品国产入口| 99国产一区二区三精品乱码| 日产国产高清一区二区三区| 中文字幕在线观看一区| 日韩美女视频在线| 色诱视频网站一区| 丰满白嫩尤物一区二区| 日韩国产高清在线| 亚洲精品高清视频在线观看| 2023国产精品| 宅男在线国产精品| 色国产精品一区在线观看| 国产综合久久久久久久久久久久| 亚洲成人免费看| 亚洲精品乱码久久久久久日本蜜臀| 26uuu成人网一区二区三区| 91在线视频观看| 精品一区二区免费| 五月天精品一区二区三区| 亚洲日本韩国一区| 中文字幕av资源一区| 国产三级一区二区三区| 精品久久久久99| 91精品国产综合久久福利软件 | 日韩高清不卡一区二区| 一区二区三区中文字幕在线观看| 欧美国产97人人爽人人喊| 日韩欧美国产一二三区| 欧美日韩视频第一区| 欧美视频第二页| 在线观看成人免费视频| 91极品美女在线| 日本道精品一区二区三区| 99精品偷自拍| 色婷婷久久综合| 日本韩国精品一区二区在线观看| 99热精品国产| 91蜜桃免费观看视频| 99r国产精品| 日本韩国欧美一区| 欧美日韩亚洲综合| 日韩一级片网址| 欧美一级午夜免费电影| 日韩欧美在线综合网| 26uuu久久综合| 国产精品素人一区二区| 18涩涩午夜精品.www| 亚洲国产视频直播| 日韩电影免费一区| 精品在线观看免费| 国产成人亚洲精品青草天美| 懂色av一区二区三区免费观看| 成人免费视频一区二区| 97se亚洲国产综合自在线| 91黄视频在线观看| 91精品国产综合久久蜜臀| 欧美成人猛片aaaaaaa| 国产区在线观看成人精品| 亚洲欧洲三级电影| 日韩电影在线一区| 国产精品亚洲午夜一区二区三区| aaa国产一区| 欧美区一区二区三区| 欧美精品一区二区三区在线| 亚洲色图在线播放| 日本不卡123| 97超碰欧美中文字幕| 91麻豆精品国产| 国产日韩亚洲欧美综合| 亚洲国产一区二区视频| 国产一区二区免费视频| 91碰在线视频| 欧美tickling网站挠脚心| 最新热久久免费视频| 美国三级日本三级久久99| 99国产精品久久久久久久久久 | 免费精品视频在线| 成人精品视频一区二区三区尤物| 欧美网站一区二区| 久久精品免费在线观看| 丝袜美腿亚洲一区二区图片| 99久久99精品久久久久久| 日韩女优av电影| 一区二区三区中文免费| 国产成人精品亚洲777人妖|