#pragma once
#pragma warning(disable:4275)

#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include "windows.h"
#include "CRS232.h"

#include <sstream>
#include <string>
using namespace std;


#ifdef MODBUS_EXPORTS
#define MODBUS_DLL_API __declspec(dllexport)
#else
#define MODBUS_DLL_API //__declspec(dllimport)
#endif

#define MODBUS_BASE_ERROR (SERIAL_PORT_BASE_ERROR + 20000)

#define MAX_COM_BUFFER_LEN 256

typedef enum
{
	MODBUS_BASE_FILE = MODBUS_BASE_ERROR,
	RTU_ERR_ORDER,
	RTU_ERR_ADDR,
	RTU_ERR_DATA,
	RTU_ERR_CONN,
	RTU_ERR_WRITE,
	RTU_ERR_READ_NULL,
	RTU_ERR_RECV,
	RTU_ERR_PARITY,
} MODBUSERR;

class MODBUS_DLL_API CRS485 : public CRS232
{
public:
	char aryComPort[10];
private:
	unsigned char m_Readbuf[MAX_COM_BUFFER_LEN];
	unsigned char m_Writebuf[MAX_COM_BUFFER_LEN];
	unsigned short CalcCrcFast(unsigned char*puchMsg, unsigned short usDataLen);
	long ModbusRead(unsigned char rtuAddr, unsigned char cmd, unsigned short int dataAddr, unsigned short int readCount, unsigned short int *pReadVal);

public:
	long OpenPort(unsigned long xPort, int iRate);
	long OpenPort(char *xPort, int iRate);

	long ModbusRead_01(unsigned char rtuAddr, unsigned short int dataAddr, unsigned short int readCount, unsigned short int *pReadVal);
	long ModbusRead_03(unsigned char rtuAddr, unsigned short int dataAddr, unsigned short int readCount, unsigned short int *pReadVal);
	long ModbusRead_04(unsigned char rtuAddr, unsigned short int dataAddr, unsigned short int readCount, unsigned short int *pReadVal);
	long ModbusWrite_05(unsigned char rtuAddr, unsigned short int dataAddr, unsigned short int &pWriteVal);
	long ModbusWrite_06(unsigned char rtuAddr, unsigned short int dataAddr, unsigned short int pWriteVal);
	long ModbusWrite_10(unsigned char rtuAddr, unsigned short int dataAddr, unsigned short int writeCount, unsigned short int *pWriteVal);
	static string GetErrText(long errid);


};