Collection -> 集合的拷贝

该博客展示了集合拷贝与哈希表克隆的代码示例。使用 NameValueCollection 存储姓名和电话信息并进行拷贝操作,同时使用 Hashtable 存储姓名和地址信息并进行克隆,还展示了克隆后修改原哈希表对克隆表的影响。

using System;
using System.Collections;
using System.Collections.Specialized;

namespace 集合的拷贝
{
 /// <summary>
 /// Class1 的摘要说明。
 /// </summary>
 class Class1
 {  
  [STAThread]
  static void Main(string[] args)
  {
   NameValueCollection namedVColl=new NameValueCollection();
   namedVColl.Add("晓华","13510532686");
   namedVColl.Add("晓华","62658888");
   namedVColl.Add("小杨","1361030486");
   namedVColl.Add("小杨","62293218");
   foreach(string key in namedVColl.Keys)
    Console.WriteLine("姓名={0},电话={1}",key,namedVColl[key]);
   Console.WriteLine("拷贝后获得的命名值集合");
   string[] arr=new string[namedVColl.Count];
   namedVColl.CopyTo(arr,0);
   for(int i=arr.GetLowerBound(0);i<arr.GetUpperBound(0);i++)
   {
    Console.WriteLine("姓名={0},电话={1}",namedVColl.AllKeys[i],arr[i]);
   }
   Hashtable hhtable=new Hashtable();
   hhtable["晓华"]="北京";
   hhtable["小杨"]="南京";
   Console.WriteLine("克隆前哈希表");
   foreach(object key in hhtable.Keys)
    Console.WriteLine("姓名={0},地址={1}",key,hhtable[key]);
   Hashtable hhCloned=(Hashtable)hhtable.Clone();
   hhtable["晓华"]="上海";
   Console.WriteLine("克隆修改初始化哈希表");
   foreach(object key in hhtable.Keys)
       Console.WriteLine("姓名={0},地址={1}",key,hhtable[key]);
   Console.WriteLine("修改后初始化哈希表后的克隆哈萨克希表");
   foreach(object key in hhCloned.Keys)
   {
    Console.WriteLine("姓名={0},地址={1}",key,hhCloned[key]);
   }
   Console.Read();
  }
 }
}

#pragma once #include "MsGlobal.h" #include <windows.h> #include <process.h> #include "hid/hidapi.h" #pragma comment (lib,"setupapi.lib") using namespace std; struct sBuff { sBuff() { stop = 0; len = 0; memset(udata, 0, 10240); } int stop; int len; unsigned char udata[10240]; }; class ComBase { public: ComBase(); ~ComBase(); int InitUSB(unsigned short vid, unsigned short pid); int OpenUSB(unsigned short vid, unsigned short pid); void CloseUSB(); public: int SendMsg(unsigned char* Send, size_t nLength); int ReceiveMsg(unsigned char* pReceiveBuf, size_t& nLength); int getDevStatus() { return handle ? 0 : 1; } hid_device *getHID() { return this->handle; } sBuff *getBuff() { return this->m_pBuff; } void setBuff(sBuff *pBuff) { this->m_pBuff = pBuff; } private: hid_device *handle; sBuff *m_pBuff; }; #include "ComBase.h" #include "algorithm/GCS_Encrypt.h" #include "files/logFile.h" ComBase::ComBase() { handle = nullptr; m_pBuff = new sBuff(); } ComBase::~ComBase() { if (handle) CloseUSB(); delete m_pBuff; m_pBuff = nullptr; } int ComBase::InitUSB(unsigned short vid, unsigned short pid) { if (hid_init())//实际上不调用它hid_enumerate和下面的hid_open也会自动调用 return -1; hid_device_info* Hids, *HidsCopy;//一个用于接收设备信息的单链表,另一个用来遍历,该结构体使用unicode编码,所以下面都要用unicode处理方式 Hids = hid_enumerate(vid, pid);//获取vid为0x154F,pid为0x4304的HID设备链表,这里如果都是0就是获取所有的HID设备 HidsCopy = Hids; LPCWSTR wpSerialNumber = L"\0";//用来去重,一个hid设备一般有多个端点,因此会读到多个 while (HidsCopy) { if (CompareStringW(LOCALE_INVARIANT, NORM_LINGUISTIC_CASING, wpSerialNumber, -1, HidsCopy->serial_number, -1) != CSTR_EQUAL)//去重 { xPrintf((LPCTSTR)HidsCopy->serial_number); wpSerialNumber = HidsCopy->serial_number;//我这里只需要序列号,实际上这个结构体还有很多数据,可以参考官方的实例 } HidsCopy = HidsCopy->next; } hid_free_enumeration(Hids);//释放设备链表 return 0; } /********************************************************* 函数名称: OpenUSB(LPCTSTR PscSerialNumber) 函数功能: 打开USB-HID设备 输入参数: 参数1: LPCTSTR PscSerialNumber - HID设备的序列号 返回值: 成功 - 0 失败 - -1 ********************************************************/ int ComBase::OpenUSB(unsigned short vid, unsigned short pid) { if (MsGlobal::m_VirtualVer == VER_VIRTUAL) { return 0; } if (handle) CloseUSB(); handle = hid_open(vid, pid, NULL);//打开指定vid、pid、序列号的设备 if (!handle) { xPrintf("无法打开USB设备"); hid_exit(); return -1; } // 将hid_read()函数设置为非阻塞。 if (hid_set_nonblocking(handle, 1) != 0)// 1启用非阻塞 0禁用非阻塞。 { xPrintf("设置非阻塞失败"); hid_close(handle); hid_exit(); return -2; } return 0; } //关闭USB-HID设备 /********************************************************* 函数名称: CloseUSB(hid_device*& handle) 函数功能: 关闭USB-HID设备 输入参数: 参数1: hid_device*& handle - 操作句柄 ********************************************************/ void ComBase::CloseUSB() { if (MsGlobal::m_VirtualVer == VER_VIRTUAL) { return; } if (handle) { hid_close(handle); hid_exit(); } handle = nullptr;//这里将指针置空,增强安全性 } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // 线程执行的函数 unsigned int WINAPI ThreadSendMsg(LPVOID lpThreadParameter) { ComBase *m_pDev = (ComBase *)lpThreadParameter; if (!m_pDev) { xPrintf("lpThreadParameter error"); return -1; } sBuff *pBuff = m_pDev->getBuff(); if (!pBuff || pBuff->len == 0) { xPrintf("getBuff error"); return -2; } hid_device *handle = m_pDev->getHID(); if (handle == INVALID_HANDLE_VALUE) { xPrintf("getHID error"); return -3; } // 读取数据并清空缓存 int leftNum = 1; while (leftNum) { unsigned char buf[1024]; memset(buf, 0, 1024); leftNum = hid_read_timeout(handle, buf, sizeof(buf), 0); if (leftNum < 0) { xPrintf("hid_read_timeout error"); return -4; } } // 此处对消息进行加密,从第三个字节开始 GCS_Msg_Encryption(secret::KEY_COMMUNICATION, sizeof(secret::KEY_COMMUNICATION), &pBuff->udata[2], pBuff->udata[1]); // 此处分包,目前支持64个字节(加上id一共65个字节) int size = 64; int packs = pBuff->len / size * size; if (pBuff->len % size != 0) { packs++; } int result = 0; for (int i = 0; i < packs; i++) { int rlen = size; if (i * size > pBuff->len) rlen = pBuff->len - (i - 1) * size; UCHAR OutputReport[65]; memset(OutputReport, 0, 65); memcpy(&OutputReport[1], &pBuff->udata[i * size], rlen); int iResp = hid_write(handle, OutputReport, 65); if (iResp < 0) { xPrintf("hid_write error"); result = -5; break; } } ExitThread(result); } int ComBase::SendMsg(unsigned char* Send, size_t nLength) { /// 初始化缓存 this->m_pBuff->stop = 0; this->m_pBuff->len = nLength; memcpy(this->m_pBuff->udata, Send, nLength); /// 启动发送线程 unsigned int dwThreadID; HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadSendMsg, (void *)this, 0, &dwThreadID); if (hThread == NULL) { xPrintf("_beginthreadex Error!"); return -1; } /// 线程阻塞 DWORD wr = WaitForSingleObject(hThread, 3000); switch (wr) { case WAIT_FAILED: { xPrintf("thread wait failed"); this->m_pBuff->stop = 1; CloseHandle(hThread); return -2; } break; case WAIT_TIMEOUT: { xPrintf("thread wait timeout"); this->m_pBuff->stop = 1; CloseHandle(hThread); return -3; } break; default: break; } /// 获取线程函数的返回值 DWORD dwExitCode; GetExitCodeThread(hThread, &dwExitCode); if (dwExitCode != 0) { xPrintf("thread exit code error"); CloseHandle(hThread); return -4; } CloseHandle(hThread); return 0; } // 线程执行的函数 unsigned int WINAPI ThreadReceiveMsg(LPVOID lpThreadParameter) { ComBase *m_pDev = (ComBase *)lpThreadParameter; if (!m_pDev) { xPrintf("lpThreadParameter error"); return -1; } sBuff *pBuff = m_pDev->getBuff(); if (!pBuff || pBuff->len != 0) { xPrintf("getBuff error"); return -2; } hid_device *handle = m_pDev->getHID(); if (handle == INVALID_HANDLE_VALUE) { xPrintf("getHID error"); return -3; } int result = 0; while (!pBuff->stop) { UCHAR recvDataBuf[1024]; memset(recvDataBuf, 0, 1024); int len = hid_read(handle, recvDataBuf, 65); if (len > 0) { memcpy(&pBuff->udata[pBuff->len], recvDataBuf, len); pBuff->len += len; if (pBuff->udata[0] != 0xE5) {/// 无效数据 xPrintf("read data exception\n"); result = -4; break; } else {/// 有效数据 int msglen = pBuff->udata[1] + 2; if (msglen <= pBuff->len) {/// 接收完成 // 此处对消息进行解密,从第三个字节开始 GCS_Msg_Decrypt(secret::KEY_COMMUNICATION, sizeof(secret::KEY_COMMUNICATION), &pBuff->udata[2], pBuff->udata[1]); //计算crc16 uint16_t crc = crc16_modbus(&pBuff->udata[0], msglen - 2); uint8_t crc_low = crc & 0xFF; uint8_t crc_high = (crc >> 8) & 0xFF; if (crc_low != pBuff->udata[msglen - 1] || crc_high != pBuff->udata[msglen - 2]) { xPrintf("crc error\n"); result = -5; break; } else { xPrintf("read data finish\n"); result = 0; break; } } else {/// 接收未完成 xPrintf("read data unfinish\n"); continue; } } } } ExitThread(result); } int ComBase::ReceiveMsg(unsigned char* pReceiveBuf, size_t& nLength) { /// 刷新缓存 this->m_pBuff->stop = 0; this->m_pBuff->len = 0; memset(this->m_pBuff->udata, 0, 10240); /// 启动接收线程 unsigned int dwThreadID; HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadReceiveMsg, (void *)this, 0, &dwThreadID); if (hThread == NULL) { xPrintf("_beginthreadex error!"); return -1; } /// 线程阻塞 DWORD wr = WaitForSingleObject(hThread, 3000); switch (wr) { case WAIT_FAILED: { xPrintf("thread wait failed"); this->m_pBuff->stop = 1; CloseHandle(hThread); return -2; } break; case WAIT_TIMEOUT: { xPrintf("thread wait timeout"); this->m_pBuff->stop = 1; CloseHandle(hThread); return -3; } break; default: break; } /// 获取线程函数的返回值 DWORD dwExitCode; GetExitCodeThread(hThread, &dwExitCode); if (dwExitCode != 0) { xPrintf("thread exit code error"); CloseHandle(hThread); return -4; } /// 根据协议拷贝有效的消息部分 nLength = this->m_pBuff->udata[1] + 2; memcpy(pReceiveBuf, this->m_pBuff->udata, nLength); CloseHandle(hThread); return 0; }#pragma once #include "MsGlobal.h" #include <windows.h> #include <process.h> #include "hid/hidapi.h" #pragma comment (lib,"setupapi.lib") using namespace std; struct sBuff { sBuff() { stop = 0; len = 0; memset(udata, 0, 10240); } int stop; int len; unsigned char udata[10240]; }; class ComBase { public: ComBase(); ~ComBase(); int InitUSB(unsigned short vid, unsigned short pid); int OpenUSB(unsigned short vid, unsigned short pid); void CloseUSB(); public: int SendMsg(unsigned char* Send, size_t nLength); int ReceiveMsg(unsigned char* pReceiveBuf, size_t& nLength); int getDevStatus() { return handle ? 0 : 1; } hid_device *getHID() { return this->handle; } sBuff *getBuff() { return this->m_pBuff; } void setBuff(sBuff *pBuff) { this->m_pBuff = pBuff; } private: hid_device *handle; sBuff *m_pBuff; }; #include "ComBase.h" #include "algorithm/GCS_Encrypt.h" #include "files/logFile.h" ComBase::ComBase() { handle = nullptr; m_pBuff = new sBuff(); } ComBase::~ComBase() { if (handle) CloseUSB(); delete m_pBuff; m_pBuff = nullptr; } int ComBase::InitUSB(unsigned short vid, unsigned short pid) { if (hid_init())//实际上不调用它hid_enumerate和下面的hid_open也会自动调用 return -1; hid_device_info* Hids, *HidsCopy;//一个用于接收设备信息的单链表,另一个用来遍历,该结构体使用unicode编码,所以下面都要用unicode处理方式 Hids = hid_enumerate(vid, pid);//获取vid为0x154F,pid为0x4304的HID设备链表,这里如果都是0就是获取所有的HID设备 HidsCopy = Hids; LPCWSTR wpSerialNumber = L"\0";//用来去重,一个hid设备一般有多个端点,因此会读到多个 while (HidsCopy) { if (CompareStringW(LOCALE_INVARIANT, NORM_LINGUISTIC_CASING, wpSerialNumber, -1, HidsCopy->serial_number, -1) != CSTR_EQUAL)//去重 { xPrintf((LPCTSTR)HidsCopy->serial_number); wpSerialNumber = HidsCopy->serial_number;//我这里只需要序列号,实际上这个结构体还有很多数据,可以参考官方的实例 } HidsCopy = HidsCopy->next; } hid_free_enumeration(Hids);//释放设备链表 return 0; } /********************************************************* 函数名称: OpenUSB(LPCTSTR PscSerialNumber) 函数功能: 打开USB-HID设备 输入参数: 参数1: LPCTSTR PscSerialNumber - HID设备的序列号 返回值: 成功 - 0 失败 - -1 ********************************************************/ int ComBase::OpenUSB(unsigned short vid, unsigned short pid) { if (MsGlobal::m_VirtualVer == VER_VIRTUAL) { return 0; } if (handle) CloseUSB(); handle = hid_open(vid, pid, NULL);//打开指定vid、pid、序列号的设备 if (!handle) { xPrintf("无法打开USB设备"); hid_exit(); return -1; } // 将hid_read()函数设置为非阻塞。 if (hid_set_nonblocking(handle, 1) != 0)// 1启用非阻塞 0禁用非阻塞。 { xPrintf("设置非阻塞失败"); hid_close(handle); hid_exit(); return -2; } return 0; } //关闭USB-HID设备 /********************************************************* 函数名称: CloseUSB(hid_device*& handle) 函数功能: 关闭USB-HID设备 输入参数: 参数1: hid_device*& handle - 操作句柄 ********************************************************/ void ComBase::CloseUSB() { if (MsGlobal::m_VirtualVer == VER_VIRTUAL) { return; } if (handle) { hid_close(handle); hid_exit(); } handle = nullptr;//这里将指针置空,增强安全性 } ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // 线程执行的函数 unsigned int WINAPI ThreadSendMsg(LPVOID lpThreadParameter) { ComBase *m_pDev = (ComBase *)lpThreadParameter; if (!m_pDev) { xPrintf("lpThreadParameter error"); return -1; } sBuff *pBuff = m_pDev->getBuff(); if (!pBuff || pBuff->len == 0) { xPrintf("getBuff error"); return -2; } hid_device *handle = m_pDev->getHID(); if (handle == INVALID_HANDLE_VALUE) { xPrintf("getHID error"); return -3; } // 读取数据并清空缓存 int leftNum = 1; while (leftNum) { unsigned char buf[1024]; memset(buf, 0, 1024); leftNum = hid_read_timeout(handle, buf, sizeof(buf), 0); if (leftNum < 0) { xPrintf("hid_read_timeout error"); return -4; } } // 此处对消息进行加密,从第三个字节开始 GCS_Msg_Encryption(secret::KEY_COMMUNICATION, sizeof(secret::KEY_COMMUNICATION), &pBuff->udata[2], pBuff->udata[1]); // 此处分包,目前支持64个字节(加上id一共65个字节) int size = 64; int packs = pBuff->len / size * size; if (pBuff->len % size != 0) { packs++; } int result = 0; for (int i = 0; i < packs; i++) { int rlen = size; if (i * size > pBuff->len) rlen = pBuff->len - (i - 1) * size; UCHAR OutputReport[65]; memset(OutputReport, 0, 65); memcpy(&OutputReport[1], &pBuff->udata[i * size], rlen); int iResp = hid_write(handle, OutputReport, 65); if (iResp < 0) { xPrintf("hid_write error"); result = -5; break; } } ExitThread(result); } int ComBase::SendMsg(unsigned char* Send, size_t nLength) { /// 初始化缓存 this->m_pBuff->stop = 0; this->m_pBuff->len = nLength; memcpy(this->m_pBuff->udata, Send, nLength); /// 启动发送线程 unsigned int dwThreadID; HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadSendMsg, (void *)this, 0, &dwThreadID); if (hThread == NULL) { xPrintf("_beginthreadex Error!"); return -1; } /// 线程阻塞 DWORD wr = WaitForSingleObject(hThread, 3000); switch (wr) { case WAIT_FAILED: { xPrintf("thread wait failed"); this->m_pBuff->stop = 1; CloseHandle(hThread); return -2; } break; case WAIT_TIMEOUT: { xPrintf("thread wait timeout"); this->m_pBuff->stop = 1; CloseHandle(hThread); return -3; } break; default: break; } /// 获取线程函数的返回值 DWORD dwExitCode; GetExitCodeThread(hThread, &dwExitCode); if (dwExitCode != 0) { xPrintf("thread exit code error"); CloseHandle(hThread); return -4; } CloseHandle(hThread); return 0; } // 线程执行的函数 unsigned int WINAPI ThreadReceiveMsg(LPVOID lpThreadParameter) { ComBase *m_pDev = (ComBase *)lpThreadParameter; if (!m_pDev) { xPrintf("lpThreadParameter error"); return -1; } sBuff *pBuff = m_pDev->getBuff(); if (!pBuff || pBuff->len != 0) { xPrintf("getBuff error"); return -2; } hid_device *handle = m_pDev->getHID(); if (handle == INVALID_HANDLE_VALUE) { xPrintf("getHID error"); return -3; } int result = 0; while (!pBuff->stop) { UCHAR recvDataBuf[1024]; memset(recvDataBuf, 0, 1024); int len = hid_read(handle, recvDataBuf, 65); if (len > 0) { memcpy(&pBuff->udata[pBuff->len], recvDataBuf, len); pBuff->len += len; if (pBuff->udata[0] != 0xE5) {/// 无效数据 xPrintf("read data exception\n"); result = -4; break; } else {/// 有效数据 int msglen = pBuff->udata[1] + 2; if (msglen <= pBuff->len) {/// 接收完成 // 此处对消息进行解密,从第三个字节开始 GCS_Msg_Decrypt(secret::KEY_COMMUNICATION, sizeof(secret::KEY_COMMUNICATION), &pBuff->udata[2], pBuff->udata[1]); //计算crc16 uint16_t crc = crc16_modbus(&pBuff->udata[0], msglen - 2); uint8_t crc_low = crc & 0xFF; uint8_t crc_high = (crc >> 8) & 0xFF; if (crc_low != pBuff->udata[msglen - 1] || crc_high != pBuff->udata[msglen - 2]) { xPrintf("crc error\n"); result = -5; break; } else { xPrintf("read data finish\n"); result = 0; break; } } else {/// 接收未完成 xPrintf("read data unfinish\n"); continue; } } } } ExitThread(result); } int ComBase::ReceiveMsg(unsigned char* pReceiveBuf, size_t& nLength) { /// 刷新缓存 this->m_pBuff->stop = 0; this->m_pBuff->len = 0; memset(this->m_pBuff->udata, 0, 10240); /// 启动接收线程 unsigned int dwThreadID; HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadReceiveMsg, (void *)this, 0, &dwThreadID); if (hThread == NULL) { xPrintf("_beginthreadex error!"); return -1; } /// 线程阻塞 DWORD wr = WaitForSingleObject(hThread, 3000); switch (wr) { case WAIT_FAILED: { xPrintf("thread wait failed"); this->m_pBuff->stop = 1; CloseHandle(hThread); return -2; } break; case WAIT_TIMEOUT: { xPrintf("thread wait timeout"); this->m_pBuff->stop = 1; CloseHandle(hThread); return -3; } break; default: break; } /// 获取线程函数的返回值 DWORD dwExitCode; GetExitCodeThread(hThread, &dwExitCode); if (dwExitCode != 0) { xPrintf("thread exit code error"); CloseHandle(hThread); return -4; } /// 根据协议拷贝有效的消息部分 nLength = this->m_pBuff->udata[1] + 2; memcpy(pReceiveBuf, this->m_pBuff->udata, nLength); CloseHandle(hThread); return 0; } 这段代码实现了什么功能,让我读懂每一行代码
最新发布
09-03
typedef struct { int ParaId; // 参数ID char DataType; // 参数数据类型 char RegAddress[15]; // 参数值 uint8_t RegByteValue[8]; // 采集到寄存器值 } DEVICEID_PARAID; typedef struct { char DeviceIdIndex; // 该数据库下参数个数,及DEVICEID_PARAID数 uint8_t TypeLen; // DeviceType长度 uint8_t DeviceType[20]; // 高8位设备类型,低8位设备ID 数据库 逆变器有第17-24位 电表是92+电表表号 DEVICEID_PARAID *DeviceParaID; // 该设备下参数 } DEVICE_DATA; typedef struct // 设备编号 { char Number; // 这是第几个设备 char DeviceDataIndex; // 数据库地址个数,最大为DEVICE_DATA数 DEVICE_DATA *DeviceData; // 该采集设备下的数据库集 } DEVICE_NUMBER; typedef struct { char date[14]; // 时间 char DeviceNumberIndex; // 设备数 char Poffset; // char SampleFre; // 采集频率 char MessageId[10]; DEVICE_NUMBER *DeviceNumber; // 采集设备集 } DEVICE_PARA; // 采集多个设备 struct DEVICE_ARGV_LIST { int portfd; // 485 端口号 int plc_addr; // 485 plc设备地址 char plc_ip[20]; // tcp ip int DeviceNumber; // plc 编号 0 1 char DeviceNumber_s[16]; // 采集设备集合 }; struct DEVICE_ARGV { int Device_num; // 采集plc个数 struct DEVICE_ARGV_LIST DeviceArgvList[TCP_IP_MAXSIZE]; // 参数列表集 }; for (t1 = 0; t1 < DevicePara_t->DeviceNumberIndex; t1++) { if (DeviceArgv_t->DeviceArgvList[0].DeviceNumber_s[t1] == ‘1’) // 读取cls.conf中RS485X_Addr中需要采集的设备,标志为1 portfd = DeviceArgv_t->DeviceArgvList[0].portfd; else if (DeviceArgv_t->DeviceArgvList[1].DeviceNumber_s[t1] == ‘1’) portfd = DeviceArgv_t->DeviceArgvList[1].portfd; else continue; } 这里定义有结构体其中DeviceNumber_s为采集控制使用那个485fd采集和采集哪些设备 我现在有个多层嵌套结构体DEVICE_PARA,其中RegAddress为采集地址,地址分为V IX QX MX MD DBX DBW DBD 现在要把地址分类并且将地址连续的一次采集,采集完成后把采集到的值放回原来的对应位置,地址是固定的,只需运行一次将地址分类、排序、合并连续地址后,只需循环重复采集和数据填充到原来参数中即可 采用的是MODBUS采集,还须区分采集的从机地址相同,地址连续的才能合并在一起一次采集,从机地址是DevicePara_t->DeviceNumber[t1].Number决定 ,并且我有两个RS485接口及两个fd,可以随意确定使用那个485采集也用DevicePara_t->DeviceNumber[t1].Number判断决定吧 也不一定是奇数用4851偶数用4852,有可能全用一个485采集 采集寄存器个数和返回值长度关系是:个数*2=长度
07-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值