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

📄 uiuart.c

📁 嵌入工linux开发的源码
💻 C
字号:
#include <pr2k.h>
#include <uiUart.h>
#include <typedefine.h>

#define COM1	0
#define COM2	1
#define COM3	2
#define COM4	3

#define SEND_BUF_SIZE	4096

HANDLE hComDev[4]={0,0,0,0};	//串行设备句柄
BOOL bComDev[4]={FALSE,FALSE,FALSE,FALSE};	//串行设置打开标志

DLL_EXP(int) com_Open(char *DeviceName,TDeviceState *DS)
{
	BOOL bRet;
	COMMTIMEOUTS timeouts;
	DCB dcb;
	COMMPROP CommProp ;
	int port;

	if(memcmp(DeviceName,"COM",3) != 0)		//检查设备名的合法性
		return STATUS_ERR;

	port=DeviceName[3]-'1';
	if(port<0||port>=COM_NUM)
		return STATUS_ERR;

	if(bComDev[port]==TRUE)		//如果串行设备已打开,返回再次打开失败
		return STATUS_ERR;
    /*
	if((hComDev[port]=CreateFile(DeviceName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,\
		FILE_ATTRIBUTE_NORMAL,NULL))==INVALID_HANDLE_VALUE)		//打开串行设备
		return STATUS_ERR;		//打开失败
    */

	hComDev[port]=CreateFile(DeviceName,
		GENERIC_READ | GENERIC_WRITE,
		0,    /* comm devices must be opened w/exclusive-access */
		NULL, /* no security attrs */
		OPEN_EXISTING, /* comm devices must use OPEN_EXISTING */
		0,    /* not overlapped I/O */
		NULL  /* hTemplate must be NULL for comm devices */
		);
                                                           
	if(hComDev[port]==INVALID_HANDLE_VALUE)
		return STATUS_ERR;
     
	SetupComm(hComDev[port],1024, 1024);	//设置接收缓冲区和输出缓冲区的大小

	GetCommTimeouts(hComDev[port],&timeouts);
/*
	timeouts.ReadIntervalTimeout = 0;
	timeouts.ReadTotalTimeoutConstant = 0;
	timeouts.ReadTotalTimeoutMultiplier = 0;
	timeouts.WriteTotalTimeoutConstant = 0;
	timeouts.WriteTotalTimeoutMultiplier = 0;
*/
	timeouts.ReadIntervalTimeout = 1000;
	timeouts.ReadTotalTimeoutConstant = 1000;
	timeouts.ReadTotalTimeoutMultiplier = 100;
	timeouts.WriteTotalTimeoutConstant = 500;
	timeouts.WriteTotalTimeoutMultiplier = 100;

  	SetCommTimeouts(hComDev[port],&timeouts);	//设置超时控制

	//SetCommMask(hComDev[port],EV_ERR|EV_RXCHAR);//监视串口的错误和接收到字符两种事件

	GetCommState(hComDev[port],&dcb);			//获取缺省的DCB结构的值

	switch(DS->BaudRate)			//设定波特率
	{
	case 115200l:
	 	dcb.BaudRate=CBR_115200;
		break;
	case 57600l:
	 	dcb.BaudRate=CBR_57600;
		break;
	case 38400l:
	 	dcb.BaudRate=CBR_38400;
		break;
	case 19200l:
	case 20329l:
	 	dcb.BaudRate=CBR_19200;
		break;
	case 9600l:
	 	dcb.BaudRate=CBR_9600;
		break;
	case 4800l:
	 	dcb.BaudRate=CBR_4800;
		break;
	case 2400l:
	 	dcb.BaudRate=CBR_2400;
		break;
	case 1200l:
	 	dcb.BaudRate=CBR_1200;
		break;
	case 600l:
	 	dcb.BaudRate=CBR_600;
		break;
	case 300l:
	 	dcb.BaudRate=CBR_300;
		break;
	default:
	 	dcb.BaudRate=CBR_9600;		//默认为9600bps
		break;
	}

	dcb.ByteSize=DS->DataBits;		//设定数据位
	dcb.StopBits=DS->StopBits;		//设定停止位
	dcb.fParity=DS->Parity;			//设定奇偶校验

	SetCommState(hComDev[port],&dcb);	//设置串行设备控制参数
	bComDev[port]=TRUE;					//设置串行设备打开标志


	bRet = GetCommProperties(hComDev[port], &CommProp);
	return port;
}

DLL_EXP(int) IrDA_Open(char *DeviceName,TDeviceState *DS)
{
	int ret;

	ret =  com_Open(DeviceName, DS);

	return ret;
}

DLL_EXP(STATUS) com_Close(int port)
{

	if(port<0||port>=COM_NUM)
		return STATUS_ERR;

	if(bComDev[port] == FALSE)		//如果串行设备未打开,则关闭失败
		return STATUS_ERR;

	SetCommMask(hComDev[port],0);	//取消事件监视,此时监视线程中的WaitCommEvent将返回

	//停止发送和接收数据,并清除发送和接收缓冲区
	PurgeComm(hComDev[port],PURGE_TXABORT| PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);

	CloseHandle(hComDev[port]);	//关闭设备句柄
	hComDev[port]=0;
	bComDev[port]=FALSE;		//设置串行设备关闭标志

	return STATUS_OK;
}

STATUS com_EnableCTS(int port)
{
	DCB dcb;

	if(bComDev[port] == FALSE)	//如果串行设备未打开,则关闭失败
		return STATUS_ERR;

	GetCommState(hComDev[port],&dcb);			//获取缺省的DCB结构的值
	dcb.fOutxCtsFlow = TRUE;	

	SetCommState(hComDev[port],&dcb);
	return STATUS_OK;
}

STATUS com_DisableCTS(int port)
{
	DCB dcb;

	if(bComDev[port] == FALSE)	//如果串行设备未打开,则关闭失败
		return STATUS_ERR;

	GetCommState(hComDev[port],&dcb);			//获取缺省的DCB结构的值
	dcb.fOutxCtsFlow = FALSE;	

	SetCommState(hComDev[port],&dcb);
	return STATUS_OK;
}

DLL_EXP(int) com_CheckReceiverBuffer(int port)
{

	DWORD dwErrorFlags;
	COMSTAT ComStat;		//串行设备状态结构

	if(port<0||port>=COM_NUM)
		return STATUS_ERR;

	if(bComDev[port] == FALSE)
		return STATUS_ERR;					//设备未打开

	ClearCommError(hComDev[port],&dwErrorFlags,&ComStat);  //读取串行设备的当前状态
	return ComStat.cbInQue;				//接收Buffer中的数据长度
}

DLL_EXP(int) com_CheckTransmitterBuffer(int port)
{

	DWORD dwErrorFlags;
	COMSTAT ComStat;		//串行设备状态结构

	if(bComDev[port] == FALSE)
		return STATUS_ERR;					//设备未打开

	ClearCommError(hComDev[port],&dwErrorFlags,&ComStat);  //读取串行设备的当前状态
	return ComStat.cbOutQue;
}

DLL_EXP(int) com_Receive(int port, unsigned char *buffer,int len)
{

	DWORD dwBytesRead;

	if(bComDev[port] == FALSE)
		return STATUS_ERR;					//设备未打开

//	if( !com_CheckReceiverBuffer(port) )
//		return 0;							//缓冲区中没有数据

	if(!ReadFile(hComDev[port],buffer,len,&dwBytesRead,NULL))  //读取数据
		return STATUS_ERR;					//读取错误

	return dwBytesRead;
}

DLL_EXP(int) com_Send(int port, unsigned char *buffer,int len)
{

	DWORD dwBytesWritten;
	int i;

	if(bComDev[port] == FALSE)
		return STATUS_ERR;					//设备未打开

	i=0;
	while(i<len)
	{
		if(!WriteFile(hComDev[port],buffer,len-i,&dwBytesWritten,NULL))
			return i;
		i+=dwBytesWritten;
		buffer+=dwBytesWritten;
	}
	return i;
}

DLL_EXP(STATUS) hs_ReceiveByte(int port, unsigned char *data)
{

	unsigned char buf;
	DWORD dwBytesRead;

	if(bComDev[port] == FALSE)
		return STATUS_ERR;							//设备未打开

	if(!ReadFile(hComDev[port],&buf,1,&dwBytesRead,NULL))  //读取数据
		return STATUS_ERR;							//读取错误

	if(dwBytesRead != 1)
		return STATUS_ERR;							//未读到有效数据
	else
	{
		*data=buf;
		return STATUS_OK;
	}
}


DLL_EXP(STATUS) com_ReceiveByte(int port, unsigned char *data)
{

	unsigned char buf;
	DWORD dwBytesRead;

	if(bComDev[port] == FALSE)
		return STATUS_ERR;							//设备未打开

	if(!ReadFile(hComDev[port],&buf,1,&dwBytesRead,NULL))  //读取数据
		return STATUS_ERR;							//读取错误

	if(dwBytesRead != 1)
		return STATUS_ERR;							//未读到有效数据
	else
	{
		*data=buf;
		return STATUS_OK;
	}
}

DLL_EXP(STATUS) com_SendByte(int port, unsigned char data)
{

	DWORD dwBytesWritten;
	int iRet,i,j;

	if(data==0xaa)
	{
		i=0;
	}

	if(port<0||port>=COM_NUM)
		return STATUS_ERR;

	if(bComDev[port] == FALSE)
		return STATUS_ERR;							//设备未打开

	while(1)
	{
		if(!WriteFile(hComDev[port],&data, 1,&dwBytesWritten,NULL))
			return STATUS_ERR;
		if(dwBytesWritten==1)
			return STATUS_OK;
	}
}

⌨️ 快捷键说明

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