88j11工程标准图集:一个简单有效的串口DLL

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 00:19:46
头文件:

#define OPEN_PORT_FAIL 201 //打开串口失败
#define GET_COM_STATA_FAIL 202 //取串口参数失败
#define SET_COM_STATA_FAIL 203 //设置串口参数失败
#define SET_COM_TIMEOUT_FAIL 204 //设置串口超时失败
#define SEND_DATA_FAIL 205 //发送数据失败
#define RECV_DATA_FAIL 206 //接收数据失败
#define CLOSE_PORT_FAIL 207 //关闭串口失败
#define SEND_DATA_TIMEOUT 208 //发送超时
#define RECV_DATA_TIMEOUT 209 //接收超时

typedef struct __COM_STR__{
int serial_port; //打开端口号
int baud; //波特率
int timeout; //超时
HANDLE m_hComm; //端口句柄
} COM_STR;

C文件:

COM_STR  m_com_data;

CCommApp theApp;

// 初始化全局变量

void Init_Com(COM_STR m_data)
{
memset(&m_com_data,0,sizeof(COM_STR));
memcpy(&m_com_data,&m_data,sizeof(COM_STR));
}

// 打开串口

int Open_Port()
{
DCB dcb;
int ret = 0;
char m_port[5]="";
sprintf(m_port,"COM%d",m_com_data.serial_port+1);

// 打开串口为异步方式

m_com_data.m_hComm=CreateFile(
m_port,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL
);

if(m_com_data.m_hComm == (HANDLE) -1){
TRACE("OPEN_PORT_FAIL\n");
return OPEN_PORT_FAIL;
}

// 得到当前串口默认配置

ret=GetCommState(m_com_data.m_hComm,&dcb);
if(!ret){
CloseHandle(m_com_data.m_hComm);
TRACE("GET_COM_STATA_FAIL\n");
return GET_COM_STATA_FAIL;
}

// 设置串口波特率

int baud=CBR_1200;

switch(m_com_data.baud){
case 1 : baud=CBR_2400;   break;
case 2 : baud=CBR_4800;   break;
case 3 : baud=CBR_9600;   break;
case 4 : baud=CBR_14400;  break;
case 5 : baud=CBR_19200;  break;
case 6 : baud=CBR_38400;  break;
case 7 : baud=CBR_56000;  break;
case 8 : baud=CBR_57600;  break;
case 9 : baud=CBR_115200; break;
default : break;
}

// 设置当前串口参数

dcb.BaudRate=baud;
dcb.Parity=NOPARITY;
dcb.StopBits=ONESTOPBIT;
dcb.ByteSize=8;

ret=SetCommState(m_com_data.m_hComm,&dcb);
if(!ret){
CloseHandle(m_com_data.m_hComm);
TRACE("SET_COM_STATA_FAIL\n");
return SET_COM_STATA_FAIL;
}

// 设置当前串口超时

COMMTIMEOUTS m_timeout;
m_timeout.ReadIntervalTimeout = 10000;
m_timeout.ReadTotalTimeoutConstant = m_com_data.timeout;
m_timeout.ReadTotalTimeoutMultiplier = 0;
m_timeout.WriteTotalTimeoutConstant = m_com_data.timeout;
m_timeout.WriteTotalTimeoutMultiplier = 0;

ret=SetCommTimeouts(m_com_data.m_hComm,&m_timeout);
if(!ret){
CloseHandle(m_com_data.m_hComm);
TRACE("SET_COM_TIMEOUT_FAIL\n");
return SET_COM_TIMEOUT_FAIL;
}

// 清串口缓冲区

PurgeComm(m_com_data.m_hComm,PURGE_TXCLEAR);
PurgeComm(m_com_data.m_hComm,PURGE_RXCLEAR);

return 0;
}

// 发送数据

int Send_Data(char * buf,int buf_len)
{
int ret=0;
DWORD len=0;
ret=WriteFile(m_com_data.m_hComm,buf,buf_len,&len,NULL);
if(!ret){
TRACE("SEND_DATA_FAIL\n");
return SEND_DATA_FAIL;
}
if(len==0){
TRACE("SEND_DATA_TIMEOUT\n");
return SEND_DATA_TIMEOUT;
}
return 0;
}

// 接收数据

int Recv_Data(char * buf,int buf_len)
{
int ret=0;
DWORD len=0;
ret=ReadFile(m_com_data.m_hComm,buf,buf_len,&len,NULL);
if(!ret){
TRACE("RECV_DATA_FAIL\n");
return RECV_DATA_FAIL;
}
if(len==0){
TRACE("RECV_DATA_TIMEOUT\n");
return RECV_DATA_TIMEOUT;
}
return 0;
}

// 完成一次发送接收任务

int Trans_Data(char * buf,int send_len,int recv_len)
{
int ret=0;
ret=Send_Data(buf,send_len);
if(ret){
return ret;
}
return (Recv_Data(buf,recv_len));
}

// 关闭串口

int Close_Port()
{
int ret=0;
ret=CloseHandle(m_com_data.m_hComm);
if(!ret){
TRACE("CLOSE_PORT_FAIL\n");
return CLOSE_PORT_FAIL ;
}
return 0;
}

导出文件(DEF):

; Comm.def : Declares the module parameters for the DLL.

LIBRARY      "Comm"
DESCRIPTION  ‘Comm Windows Dynamic Link Library‘

EXPORTS
    ; Explicit exports can go here

Init_Com @1
Open_Port @2
Send_Data @3
Recv_Data @4
Trans_Data @5
Close_Port @6

适用于小数据量串口数据通信,如终端控制,大文件传输请用同步方式。