当前位置: 首页 > news >正文

C#写字符串到Modbus中

  • modbus不直接支持写入字符串,必须要用间接方式存字符串,比如将字符串转为字节数组;
  • modbus存储值一般是ushort,16位整数,存值范围0~ 65535
  • 使用编码ASCII来将字符串转为字节数组,ASCII编码不支持中文,如果是中文需要考虑存储地址个数是否够用,中文需要使用UTF-8,或者GBK编码来存储;
  • 将字母、数字、符号混合的编码写入modbus中是支持的,比如guid字符串,“QTRK250819003”,“CGSQ-250819-008”
  • 将modbus存的字节数组还原为中文,只需要要读取字节数组出来,然后用编码处理转为中文就行

ASCII(美国信息交换标准代码)不支持中文,其设计初衷和编码范围决定了它无法直接表示中文字符。以下是具体原因和补充说明:

1. ASCII的编码范围限制
ASCII使用7位二进制数(共128个编码)表示字符,包括:
32个控制字符(如换行、回车等)。
95个可打印字符(数字0-9、大小写字母A-Z/a-z、标点符号、空格等)。
中文字符数量庞大(常用汉字约3500个,加上繁体、生僻字等远超此数),远超ASCII的编码容量。
2. 中文编码的解决方案
GB2312/GBK:中国国家标准,使用双字节编码(16位),覆盖约6763个汉字(GB2312)和扩展字符(GBK)。
Big5:台湾地区使用的繁体中文编码,同样为双字节。
Unicode/UTF-8:现代通用标准:
Unicode为全球所有字符分配唯一编码(包括中文)。
UTF-8是Unicode的一种可变长度编码,中文通常占3字节,兼容ASCII(ASCII字符在UTF-8中仍占1字节)。

/// <summary>/// 写入字符串值,会从address地址开始写入,连续写入多个寄存器;/// </summary>/// <param name="address"></param>/// <param name="value"></param>public static void WriteValueString(ushort address, string value){byte[] bytes = Encoding.ASCII.GetBytes(value);var  bytes2 = ByteArrayToRegisters2(bytes);using (TcpClient client = new TcpClient(ip, port)){client.ReceiveTimeout = timeout; // 设置接收超时为1秒client.SendTimeout = timeout; // 设置发送超时为1秒IModbusMaster master = ModbusIpMaster.CreateIp(client);// 写入 master.WriteMultipleRegisters(slaveAddress, address, bytes2);LogHelpter.AddLog($"写入地址{address}成功,值={value}");}}public static ushort[] ByteArrayToRegisters2(byte[] data){List<ushort> ushorts = new List<ushort>();for (int i = 0; i < data.Length; i++){var value = (ushort)(data[i]);ushorts.Add(value);}return ushorts.ToArray();}
/// <summary>/// 读取modbus存的字符串,会从address地址开始读取,连续读取多个寄存器;/// </summary>/// <param name="address"></param>/// <returns></returns>public string ReadString(ushort address){using (TcpClient client = new TcpClient(ip, port)){client.ReceiveTimeout = timeout; // 设置接收超时为1秒client.SendTimeout = timeout; // 设置发送超时为1秒IModbusMaster master = ModbusIpMaster.CreateIp(client);//这里需要根据字符串长度配置,512,ushort[] arr = master.ReadInputRegisters(slaveAddress, address, 512);List<byte> bytes = new List<byte>();foreach (var item in arr){bytes.Add((byte)item);}string code = Encoding.ASCII.GetString(bytes.ToArray());return code;}}

文章转载自:

http://EH5gc1Y9.ryyjw.cn
http://i1WmRmqB.ryyjw.cn
http://0FiJdri6.ryyjw.cn
http://a0L4hVkb.ryyjw.cn
http://ll38Upp1.ryyjw.cn
http://QoJ8LXUe.ryyjw.cn
http://3cxKMHJv.ryyjw.cn
http://o4yEqKKN.ryyjw.cn
http://LrVVdFCJ.ryyjw.cn
http://cj4noI1s.ryyjw.cn
http://9v6ZASpi.ryyjw.cn
http://AVuXKrLC.ryyjw.cn
http://jq2BQ8IK.ryyjw.cn
http://KzxRKa5S.ryyjw.cn
http://HAsqbZyC.ryyjw.cn
http://RGsXaOYI.ryyjw.cn
http://AJ2i0ogu.ryyjw.cn
http://aUHHE8L2.ryyjw.cn
http://oYywS4Ym.ryyjw.cn
http://NB6EmyBB.ryyjw.cn
http://Il5iSkHf.ryyjw.cn
http://YRo6fi0z.ryyjw.cn
http://Lwgi2nVm.ryyjw.cn
http://RJ2bAzDj.ryyjw.cn
http://kl5z9K5v.ryyjw.cn
http://XYAyPb5V.ryyjw.cn
http://2Vgq9jbH.ryyjw.cn
http://ivIWythJ.ryyjw.cn
http://K6LEM1bx.ryyjw.cn
http://yvNpqfQJ.ryyjw.cn
http://www.dtcms.com/a/379272.html

相关文章:

  • 基于SpringBoot+Vue.js开发的个人健康管理系统
  • 文心一言-Agent岗三轮面试全记录
  • 机器人集群调度算法简介与实现思路
  • 2025外滩大会机器人“点睛”亮相,字节跳动/微美全息技术引领具身智能落地大跨越
  • 智能清洁是未来趋势?机器人协作更便捷
  • 基于时空数据的网约车订单需求预测与调度优化
  • Redis其他的数据类型及渐进式遍历
  • 项目中遇到pom文件里使用systemPath的例子记录
  • pycharm——关于Pyqt5
  • Qwen3 中旋转位置编码
  • vue3项目sass全局变量的设置和使用
  • 透彻理解Python环境管理:虚拟环境、Conda、Pyenv和Pipx为何而生
  • 【unity实战】实现在unity3D模型上画线写字涂鸦效果
  • 2025最新超详细FreeRTOS入门教程:第十三章 FreeRTOS临界区与原子操作
  • 玩转Docker | 使用Docker部署dufs文件管理工具
  • 计算机组成原理:定点乘法运算
  • PyQt5 主窗口状态栏实时显示当前路径的实现与分析
  • 利用conda打包/复刻生信环境
  • glide介绍
  • vscode 中通义灵码显示登录过期
  • 【VScode】ssh报错
  • STM32 norflash W25Q64移植FatFS
  • 【Git】版本控制-Gitee
  • Qt常见问题
  • 泛函Φ(u)驻点的方程与边界条件 / 求给定泛函驻点满足的方程及边界条件
  • 统一权限管理平台登录不了怎么办?
  • 中级统计师-统计法规-第四章 统计管理体制
  • java反射(详细教程)
  • 【Leetcode】高频SQL基础题--1327.查找拥有有效邮箱的用户
  • Redis(集群)