⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ser_rwbuf.c

📁 基于三星S3C2410的串口驱动程序
💻 C
字号:
/******************************************************
Copyright(c) 版权所有,1998-2003微逻辑。保留所有权利。
******************************************************/

/*****************************************************
文件说明:RW BUF 操作
版本号:  1.0.0
开发时期:2004-05-17
作者:    肖远钢
修改记录:
******************************************************/
//root include
#include <ewindows.h>
//"\inc_local"
#include "ser_rwbuf.h"


/***************  全局区 定义, 声明 *****************/
#define SER_INTER_LOCK
/******************************************************/

#ifndef CANCEL_XYG_SER_RX


void	RWBuf_Init( SER_RWBUF* lpRWBuf )
{
	memset( lpRWBuf, 0, sizeof(SER_RWBUF) );
	return ;
}

void	RWBuf_SetZero( SER_RWBUF* lpRWBuf, DWORD fIsWork )
{
#ifdef SER_INTER_LOCK
	InterlockedExchange( &lpRWBuf->fIsWork, fIsWork );
	InterlockedExchange( &lpRWBuf->dwCntRW, 0 );
	InterlockedExchange( &lpRWBuf->dwReadRW, 0 );
	InterlockedExchange( &lpRWBuf->dwWriteRW, 0 );
#else
	lpRWBuf->fIsWork = fIsWork;
	lpRWBuf->dwCntRW = 0;
	lpRWBuf->dwReadRW = 0;
	lpRWBuf->dwWriteRW = 0;
#endif
	RETAILMSG(1,(TEXT("\r\n xyg_rwbuf_work[%d]\r\n"), fIsWork));
	return ;
}




BOOL	RWBuf_GetWriteBuf( SER_RWBUF* lpRWBuf, OUT LPBYTE* ppBufWrite, OUT LONG* pdwLen )
{
	//获取剩余空间
	if( lpRWBuf->dwCntRW==LEN_SERBUF )
	{
		*pdwLen = 0;
		RETAILMSG(1,(TEXT("\r\n xyg_rwbuf_GetWriteBuf: no space!!!!!\r\n")));
		return FALSE;
	}
	*ppBufWrite = lpRWBuf->pBufRW+lpRWBuf->dwWriteRW;
	//
	if( lpRWBuf->dwWriteRW >= lpRWBuf->dwReadRW )
	{
		*pdwLen = LEN_SERBUF - lpRWBuf->dwWriteRW;
	}
	else
	{
		*pdwLen = lpRWBuf->dwReadRW - lpRWBuf->dwWriteRW;
	}
	return TRUE;
}

BOOL	RWBuf_SetWriteLen( SER_RWBUF* lpRWBuf, LONG dwLen )
{
	if( dwLen<=LEN_SERBUF )
	{
#ifdef SER_INTER_LOCK
		InterlockedExchangeAdd( &lpRWBuf->dwCntRW, dwLen );
#else
		lpRWBuf->dwCntRW += dwLen;
#endif
		lpRWBuf->dwWriteRW += dwLen;
		if( lpRWBuf->dwWriteRW >= LEN_SERBUF )
		{
			lpRWBuf->dwWriteRW -= LEN_SERBUF;
		}
	}
	return TRUE;
}




LONG	RWBuf_ReadBuf( SER_RWBUF* lpRWBuf, OUT LPBYTE pBufRead, LONG dwLen )
{
	LPBYTE		pBufReadTmp;
	LONG		dwLenRead;

	if( !lpRWBuf->dwCntRW )
	{
		RETAILMSG(1,(TEXT("\r\n xyg_rwbuf_ReadBuf: no dwCntRW!!!!!\r\n")));
		return 0;
	}
	//
	if( lpRWBuf->dwWriteRW <= lpRWBuf->dwReadRW )
	{
		dwLenRead = LEN_SERBUF - lpRWBuf->dwReadRW;
	}
	else
	{
		dwLenRead = lpRWBuf->dwWriteRW - lpRWBuf->dwReadRW;
	}
	//
	if( dwLenRead>dwLen )
	{
		dwLenRead = dwLen;
	}
	memcpy( pBufRead, lpRWBuf->pBufRW+lpRWBuf->dwReadRW, dwLenRead );
	lpRWBuf->dwReadRW += dwLenRead;
	if( lpRWBuf->dwReadRW >= LEN_SERBUF )
	{
		lpRWBuf->dwReadRW -= LEN_SERBUF;
	}
#ifdef SER_INTER_LOCK
	InterlockedExchangeAdd( &lpRWBuf->dwCntRW, -dwLenRead );
#else
	lpRWBuf->dwCntRW -= dwLenRead;
#endif

	return dwLenRead;
}



#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -