rs485配置的问题

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;
    }
}

你可能感兴趣的:(rs485配置的问题)