C++ 通过Modbus TCP向设备发送第二个命令代码时出现问题

C++ 通过Modbus TCP向设备发送第二个命令代码时出现问题,c++,tcp,rfid,modbus,C++,Tcp,Rfid,Modbus,我是初学者,通过Modbus TCP发送消息有困难。 我在端口502上创建带有RFID读/写头的win套接字,然后我将第一个命令10h(写入多个寄存器)发送到win套接字,然后我收到回复,没有问题。。。在那之后,我认为已经准备好发送下一个命令(再次发送10h或03h(读取\u保持\u寄存器),但它不起作用。我必须创建一个新的套接字,然后它一直工作到第一个命令被执行…似乎RFID头没有收到命令。我通常使用send()和recv()功能。我试着用SimplyModbus这样的测试仪测试设备,一切正常

我是初学者,通过Modbus TCP发送消息有困难。 我在端口502上创建带有RFID读/写头的win套接字,然后我将第一个命令10h(写入多个寄存器)发送到win套接字,然后我收到回复,没有问题。。。在那之后,我认为已经准备好发送下一个命令(再次发送10h或03h(读取\u保持\u寄存器),但它不起作用。我必须创建一个新的套接字,然后它一直工作到第一个命令被执行…似乎RFID头没有收到命令。我通常使用send()和recv()功能。我试着用SimplyModbus这样的测试仪测试设备,一切正常。有人对这个问题有经验吗?非常感谢你们的帮助

#ifndef PCH_H
#define PCH_H
#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS

#include <Winsock2.h>
#include <WS2tcpip.h>
#include <string>
#include <iostream>

#include <stdio.h>
#include <conio.h>


#pragma comment (lib,"WS2_32.lib")

using namespace std;
using std::string;
typedef SSIZE_T ssize_t;

#endif //PCH_H

bool modbus::modbus_connect() {
    if(HOST == "" || PORT == 0) {
        std::cout << "Missing Host and Port" << std::endl;
        return false;
    } else {
        std::cout << "Found Proper Host "<< HOST << " and Port " <<PORT <<std::endl;
    }

    WSAData data;
    sockaddr_in _server;
    WORD ver = MAKEWORD(2, 2);
    wsResult = WSAStartup(ver, &data);
    if (wsResult != 0)
    {
        cerr << "Error Create Socket" << wsResult << endl;
        return false;
    }

    _socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if(_socket == -1) {
        std::cout <<"Error Opening Socket" <<std::endl;
        return false;
    } else {
        std::cout <<"Socket Opened Successfully" << std::endl;
    }

    u_long iMode = 0;
    wsResult = ioctlsocket(_socket, FIONBIO, &iMode);

    _server.sin_family = AF_INET;
    _server.sin_addr.s_addr = inet_addr(HOST.c_str());
    _server.sin_port = htons(PORT);

    wsResult = ::bind(_socket,(sockaddr*)&_server, sizeof(_server));


    if (connect(_socket, (sockaddr*)&_server, sizeof(_server)) < 0) {
        std::cout<< "Connection Error" << std::endl;
        return false;
    }

    std::cout<< "Connected" <<std::endl;
    _connected = true;
    return true;
}

ssize_t modbus::modbus_send(uint8_t *to_send, int length)
{
    FD_ZERO(&fds);
    tv.tv_sec = 5;
    tv.tv_usec = 0;

    FD_SET(_socket, &fds);
    int i = select(32, NULL, &fds, NULL, &tv); // write
    if (i <= 0)
    {
        printf("select - error %d\n", WSAGetLastError());
        closesocket(_socket);
        WSACleanup();
        return 1;
    }
    _msg_id++;

    wsResult = send(_socket, (const char*)to_send, (size_t)length, 0);
    if (wsResult == SOCKET_ERROR)
    {
        printf("send failed with error: %d\n", WSAGetLastError());
        WSACleanup();
    }

    return 0;
}

ssize_t modbus::modbus_receive(uint8_t *buffer)
{
    FD_ZERO(&fds);
    tv.tv_sec = 5;
    tv.tv_usec = 0;

    FD_SET(_socket, &fds);
    int i = select(32, &fds, NULL, NULL, &tv); //read
    if (i <= 0)
    {
        printf("no TCP response received\n");
        closesocket(_socket);
        WSACleanup();
        return 1;
    }

    wsResult = recv(_socket, (char *)buffer, 1024, 0);
    if (wsResult == 0)
    {
        printf("received failed with error: %d\n", WSAGetLastError());
        WSACleanup();

    }
    return 0;
}



\ifndef PCH\u
#定义PCH_H
#定义\u CRT\u安全\u无\u警告
#定义\u WINSOCK\u不推荐\u无\u警告
#包括
#包括
#包括
#包括
#包括
#包括
#pragma注释(lib,“WS2_32.lib”)
使用名称空间std;
使用std::string;
typedef SSIZE\u T SSIZE\T;
#endif//PCH\u H
bool modbus::modbus_connect(){
如果(主机==“”| |端口==0){

std::你的设备或开发工具包有什么例子吗?你能详细说明设备型号吗?我看到你在Windows上。嗨,我只有RFID设备的手册。你目前展示的是连接、发送和接收的实现,基本上是围绕系统套接字+连接、发送和接收的包装。不清楚这些功能是如何实现的ons在更大的代码中协同工作,但正是这种正确的协同工作似乎是您的问题所在。换句话说,您的问题缺少帮助您所需的基本细节。最后,我正在使用GIT中的库。第一次调用命令10h,然后调用03h读取设备中的寄存器。该命令是已执行,但第二个答案是否定的。如果没有进一步解释,您的问题将不会得到回答,请详细说明您的SDK,您如何使用它,并提供指向它的链接。设备的链接有帮助,但您的问题不是硬件问题,因为您似乎需要提供进一步的详细信息。还可以使用您的代码更新您的帖子,因为您似乎有改进你知道你的东西,但这里的人只知道你给他们看的东西。你的设备或开发工具包有什么例子吗?你能详细介绍一下设备型号吗?我看到你在Windows上。嗨,我只有RFID设备的手册。你现在展示的是连接、发送和接收的实现,基本上都是包装式的系统套接字+连接、发送和接收。不清楚这些函数在您的较大代码中是如何协同工作的,但正是这种协同工作的方式似乎是您的问题所在。换句话说,您的问题缺少帮助您所需的基本细节。最后,我正在使用GIT的库。我第一次打电话给您命令10h,然后是03h,用于读取设备中的寄存器。该命令已执行,但第二个命令不是。如果不作进一步解释,您的问题将不会得到回答,请详细说明您的SDK,如何使用它,并提供指向它的链接。指向设备的链接有帮助,但您的问题不是硬件问题,因为您似乎需要进一步提供r详细信息。也用你的代码更新你的文章,因为你似乎已经改进了它。你知道你的东西,但这里的人只知道你给他们看什么。