頭文件:
#define OPEN_PORT_FAIL 201 //打開(kāi)串口失敗
#define GET_COM_STATA_FAIL 202 //取串口參數失敗
#define SET_COM_STATA_FAIL 203 //設置串口參數失敗
#define SET_COM_TIMEOUT_FAIL 204 //設置串口超時(shí)失敗
#define SEND_DATA_FAIL 205 //發(fā)送數據失敗
#define RECV_DATA_FAIL 206 //接收數據失敗
#define CLOSE_PORT_FAIL 207 //關(guān)閉串口失敗
#define SEND_DATA_TIMEOUT 208 //發(fā)送超時(shí)
#define RECV_DATA_TIMEOUT 209 //接收超時(shí)
typedef struct __COM_STR__{
int serial_port; //打開(kāi)端口號
int baud; //波特率
int timeout; //超時(shí)
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));
}
// 打開(kāi)串口
int Open_Port()
{
DCB dcb;
int ret = 0;
char m_port[5]="";
sprintf(m_port,"COM%d",m_com_data.serial_port+1);
// 打開(kāi)串口為異步方式
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;
}
// 設置當前串口超時(shí)
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;
}
// 發(fā)送數據
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;
}
// 完成一次發(fā)送接收任務(wù)
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));
}
// 關(guān)閉串口
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
適用于小數據量串口數據通信,如終端控制,大文件傳輸請用同步方式。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。