闲鱼关闭交易影响信誉:一个简单有效的串口DLL
来源:百度文库 编辑:中财网 时间:2024/10/05 23:35:30
头文件:
#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
适用于小数据量串口数据通信,如终端控制,大文件传输请用同步方式。
#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
适用于小数据量串口数据通信,如终端控制,大文件传输请用同步方式。
谁能提供一个下载MSVCR71.DLL的有效网址?
我想知道一个简单有效的祛豆豆的方法!
谁能告诉我一个简单又有效的戒烟方法
如何简单有效的知道一个女孩是不是喜欢你?
求一个方便简单有效的阻止弹出广告窗口
有效的简单减肥方法
简单有效的治疗近视
怎样才能简单有效的去眼代
问一个有关串口设置的问题?
串口硬盘安装系统的一个问题
一个VB串口通信程序的问题。
我编写了一个简单的串口程序(vc++).运行时弹出一个"the device is not open"的对话框,我该怎样改?谢谢!
请大家推荐一个影,音合成的软件,简单有效的。
求一个方便简单有效的阻止弹出广告窗口的办法
将一个Word文档打开,修改后存入另一文件夹,最简单有效的办法是( )
将一个word文档打开修改后存入另一文件夹,最简单有效的方法是什么
如何有效的减肥?简单有效不要太复杂的
谁知道发声的简单有效的方法
减肥的简单有效的方法
如何简单且有效的美白?
怎样有效而简单的去除青春痘?
怎么可以简单有效的宿舍减肥?
减肥最简单最有效的方法?
如何简单而又有效的治疗鼻炎