C++ RS-485通讯示例

摘要:
RS-485是一种半双工通信协议,通常用于工业控制模块之间的通信。由于其传输距离长,不容易出错,因此被广泛使用。这是Windows下的示例。Linux需要进行相应的修改。

RS-485是一种半双工的通信协议,经常用于工业控制模块间的通信,因其传输距离远,不容易出错的特点,应用广泛。

此为windows下示例,linux需做相应修改。

#pragma once
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>

class Net485
{
public:
    Net485(long baud_rate, wchar_t* port_name);
    bool send(BYTE data[], int length);
protected:
    void set_up_serial_port(long baud);

private:

    HANDLE serial_port;

};

#include "Net485.h"
#include <iostream>

Net485::Net485(long baud_rate, wchar_t* port_name)
{
    const wchar_t name[8] = L"COM4";
    serial_port = CreateFile(name, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
    if (serial_port == INVALID_HANDLE_VALUE)
    {
        fprintf(stderr, "Error opening portn");
        CloseHandle(serial_port);
    }
    else 
    {
        set_up_serial_port(baud_rate);
    }
}

bool Net485::send(BYTE data[],int length)
{
    if (serial_port == INVALID_HANDLE_VALUE)
    {
        printf("发送失败::INVALID_HANDLE_VALUE");
        return false;
    }

    DWORD dwTx = 0;
    BOOL ret = FALSE;
    DWORD dwLength = length;

    Sleep(10);

    if (dwLength > 0)
    {
        ret = WriteFile(serial_port, data, dwLength, &dwTx, NULL);
        if (ret == FALSE)
        {
            printf("发送失败");
            return false;
        }
    }

    return true;
}

void Net485::set_up_serial_port(long baud)
{
    DCB properties;

    // 设置读写缓冲区
    GetCommState(serial_port, &properties);

    switch (baud)
    {
    case 1200:
        properties.BaudRate = CBR_1200;
        break;
    case 2400:
        properties.BaudRate = CBR_2400;
        break;
    case 4800:
        properties.BaudRate = CBR_4800;
        break;
    case 9600:
        properties.BaudRate = CBR_9600;
        break;
    case 14400:
        properties.BaudRate = CBR_14400;
        break;
    case 19200:
        properties.BaudRate = CBR_19200;
        break;
    case 38400:
        properties.BaudRate = CBR_38400;
        break;
    default:
        fprintf(stderr, "Invalid baud rate: %ldn", baud);
        exit(0);
        break;
    }

    properties.Parity = NOPARITY;
    properties.ByteSize = 8;
    properties.StopBits = ONESTOPBIT;

    SetCommState(serial_port, &properties);

    //在读写串口前,用 PurgeComm 函数清空缓冲区
    PurgeComm(serial_port, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_TXABORT | PURGE_TXABORT);

    return;
}

使用示例

/// 485PLC通信
Net485* net = new Net485(9600,L"COM4");

BYTE data[2];
data[0] = 0x01;
if (info.th == 1) {

    data[1] = 0x11;
}
else {

    data[1] = 0x12;
}
net->send(data,sizeof(data));

免责声明:文章转载自《C++ RS-485通讯示例》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇高通量计算框架HTCondor(一)——概述网页布局下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

关于序列化:把某个对象序列化成字节流

在网络编程中。一个常常的操作是将本地的数据块转换成字符流并将其发送到远端。远端将这个字符串流恢复成数据库。如果有例如以下一个类CObject。编写两个函数,分别将CObject中的成员变量转换为一个字符流(convert2Stream()函数)。并将字符流的数据又一次恢复到一个CObject对象中(convert2Object()函数): char* c...

【DLL相关】实现函数的DLL封装,并在另一个项目中调用

直接给出步骤: ===========函数的DLL封装=========== 1.创建第一个项目:win32控制台程序,应用程序类型:DLL,附加选项:导出符号(命名:double_dll) 2.double_dll.h中加入函数定义   extern DOUBLE_DLL_API int doublefun(int);//DOUBLE_DLL_API 根...

nodejs版实现properties后缀文件解析

1、propertiesParser.js let readline = require('readline'); let fs = require('fs');// properties文件路径 let local = 'zh', url = local == 'zh' ? /public/messages_zh.properties' :...

Linux使用PAM锁定多次登陆失败的用户(重置次数)原理后续补充----

  linux上的用户,如果用户连续3次登录失败,就锁定该用户,几分钟后该用户再自动解锁。Linux有一个pam_tally2.so的PAM模块,来限定用户的登录失败次数,如果次数达到设置的阈值,则锁定用户。 1、 vim /etc/pam.d/sshd    (远程ssh)   限制用户远程登录   在#%PAM-1.0的下面,即第二行,添加内容,一定...

Linux下C连接MySql数据库

目录: 一、解决小的问题; 二、大问题,如果你不小心把/usr/lib的所属用户改了导致sudo命令用不了: 三、C连接MySql编程本身: 其实写这个程序真的很简单,十多分钟的事情,只是以前没在Linux下用纯C连过Mysql,想试一下,竟然搞了一整天,而且不是由于编码本身,是因为其他的一些周边问题,所以很有必要做一下笔记。 一、解决小的问题: 1、...

Spring Boot 2.0的属性绑定

Spring Boot2.0的属性绑定 原文从Spring boot第一个版本以来,我们可以使用@ConfigurationProperties注解将属性绑定到对象。也可以指定属性的各种不同格式。比如,person.first-name,person.firstName和PERSON_FIRSTNAME都可以使用。这个功能叫做“relaxed bindi...