📄 uiuart.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 + -