rs485.h
#ifndef __WIN_RS485_OPER_H__
#define __WIN_RS485_OPER_H__
#include
extern DWORD g_dwLastError_com;
extern HANDLE g_hRs485Com;
//打开串口操作
HANDLE open_rs485(TCHAR* szCOM);
//RS485发送数据
int rs485_send(HANDLE hCom, char *szSendbuf, DWORD dwNum);
//RS485接收数据
int rs485_recv(HANDLE hCom, char *szRecvbuf, DWORD dwWantRead);
//关闭串口操作
int close_rs485(HANDLE hCom);
//===========================以下自用 配置属性进行修改
//对RS485进行配置
void dcb_conf(DCB *dcb);
#endif
rs485.cpp
#include "stdafx.h"
#include "rs485.h"
DWORD g_dwLastError_com = 0;
HANDLE g_hRs485Com = NULL;
/****************************************************************
*功能: 对RS485串口进行打开初始化 *
*原型: HANDLE open_rs485(char *com) *
*参数: char *com 串口号 *
*返回值: 成功: 打开的端口描述符 *
* 失败: 退出函数 *
*****************************************************************/
HANDLE open_rs485(TCHAR* szCOM)
{
HANDLE hcom = NULL;
do
{
if (szCOM == NULL)
{
break;
}
// 打开串口
hcom = CreateFile(szCOM,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
if (hcom == INVALID_HANDLE_VALUE)
{
hcom = NULL;
g_dwLastError_com = GetLastError();
break;
}
// 获得打开串口属性
DCB dcb;
if (!GetCommState(hcom, &dcb))
{
hcom = NULL;
CloseHandle(hcom);
g_dwLastError_com = GetLastError();
break;
}
// 设置串口属性
dcb_conf(&dcb);
if (!SetCommState(hcom, &dcb))
{
hcom = NULL;
CloseHandle(hcom);
g_dwLastError_com = GetLastError();
break;
}
} while (FALSE);
return hcom;
}
/****************************************************************
*功能: 对LED003的RS485串口进行配置 *
*原型: void dcb_conf(DCB *dcb) *
*参数: DCB *dcb 要配置的串口描述符 *
*返回值: 无 *
*****************************************************************/
void dcb_conf(DCB *dcb)
{
if (dcb == NULL)
{
goto quit;
}
dcb->BaudRate = 9600; //波特率
dcb->fBinary = TRUE; //二进制模式。必须为TRUE
dcb->ByteSize = 8; //数据位。范围4-8
dcb->StopBits = ONESTOPBIT; //停止位
dcb->fParity = FALSE; //奇偶校验。无奇偶校验
dcb->Parity = NOPARITY; //校验模式。无奇偶校验
dcb->fOutxCtsFlow = FALSE; //CTS线上的硬件握手
dcb->fOutxDsrFlow = FALSE; //DST线上的硬件握手
dcb->fDtrControl = DTR_CONTROL_ENABLE;//DTR控制
dcb->fDsrSensitivity = FALSE;
dcb->fTXContinueOnXoff = FALSE;
dcb->fOutX = FALSE; //是否使用XON/XOFF协议
dcb->fInX = FALSE; //是否使用XON/XOFF协议
dcb->fErrorChar = FALSE; //是否使用发送错误协议
dcb->fNull = FALSE; //停用null stripping
dcb->fRtsControl = RTS_CONTROL_ENABLE;
dcb->fAbortOnError = FALSE; //串口发送错误,并不终止串口读写
quit:
;
}
/****************************************************************
*功能: RS485串口发送数据 *
*原型: int rs485_send(HANDLE hcom ,char *send_buf ,int nnum) *
*参数: HANDLE hcom 要发往的串口号 *
* char *send_buf 要发送数据的首地址 *
* int nnum 要发送数据的长度 *
*返回值: 成功:send_res 实际发送数据的长度 *
* 失败: -1 *
*****************************************************************/
int rs485_send(HANDLE hCom, char *szSendbuf, DWORD dwNum)
{
if (hCom == NULL || szSendbuf == NULL)
{
return -1;
}
DWORD nNumWrite = 0;
if (WriteFile(hCom, szSendbuf, dwNum, &nNumWrite, NULL) == 0)
{
g_dwLastError_com = GetLastError();
return -1;
}
return nNumWrite;
}
/****************************************************************
*功能: RS485串口接收数据 *
*原型: int rs485_send(HANDLE hcom ,char *send_buf ,int nnum) *
*参数: HANDLE hcom 要接收数据的串口号 *
* char *send_buf 要接收数据的存放地址 *
* int nnum 要接收数据的长度 *
*返回值: 成功:recv_res 实际接收数据的长度 *
* 失败: -1 *
*****************************************************************/
int rs485_recv(HANDLE hCom, char *szRecvbuf, DWORD dwWantRead)
{
if (hCom == NULL || szRecvbuf == NULL)
{
return -1;
}
DWORD dwRead = 0;
if (ReadFile(hCom, szRecvbuf, dwWantRead, &dwRead, NULL) == 0)
{
g_dwLastError_com = GetLastError();
return -1;
}
return dwRead;
}
/****************************************************************
*功能: RS485关闭串口 *
*原型: void Close_RS485(HANDLE hcom) *
*参数: HANDLE hcom 要接收数据的串口号 *
*返回值: 成功: 1 关闭成功 *
* 失败: 0 关闭失败 *
*****************************************************************/
int close_rs485(HANDLE hCom)
{
if (CloseHandle(hCom))
{
return 1;
}
else
{
g_dwLastError_com = GetLastError();
return 0;
}
}