头文件:
#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 适用于小数据量串口数据通信,如终端控制,大文件传输请用同步方式。 |
|
来自: bluecrystal > 《vc的串口编程》