美文网首页
rs485配置的问题

rs485配置的问题

作者: 蓝色科学史 | 来源:发表于2020-06-29 14:31 被阅读0次

    rs485.h

    #ifndef  __WIN_RS485_OPER_H__
    #define  __WIN_RS485_OPER_H__
    #include <WinSock2.h>
    
    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配置的问题

          本文链接:https://www.haomeiwen.com/subject/epvofktx.html