使用校验和通过ASCII将消息从设备转换为LIS

问题描述 投票:0回答:1

我正在寻找帮助。我正在尝试使用ASCII通过TCP / IP与设备通信。该协议包括一个校验和,该校验和由两个ASCII字符组成,这些ASCII字符表示范围从00到FF的两个字符的十六进制数字。

我知道十六进制数是通过对帧中所有先前字符进行模256 10加(即,在<STX> … <ETX>(含)以上),然后以十六进制格式表示所得的8位无符号整数而生成的。

例如,我知道此校验和为84,但如何计算? <STX>ID_DATA<FS><RS>aMOD<GS>LIS<GS><GS><GS><FS>iIID<GS>333<GS><GS><GS><FS><RS><ETX>84<EOT>

话虽这么说,校验和将是什么? <STX>SMP_REQ<FS><RS>aMOD<GS>LIS<GS><GS><GS><FS>iIID<GS>42731<GS><GS><GS><FS>rSEQ<GS>16<GS><GS><GS><FS><RS><ETX>{chksum}<EOT>

任何指导都将不胜感激? :)TIA!

hex ascii checksum
1个回答
0
投票

最新总比没有好。这是获取校验和的方法:

public const byte STX = 2;
public const byte FS = 28;
public const byte GS = 29;
public const byte RS = 30;
public static byte[] STX_BUFF = { STX };
public static byte[] FS_BUFF = { FS };
public static byte[] GS_BUFF = { GS };
public static byte[] RS_BUFF = { RS };

string checksum = "00";
int byteVal = 0;
int sumOfChars = 0;
string frame = string.Format("{0}SMP_REQ{1}{2}aMOD{3}0500{3}{3}{3}{1}iIID{3}{6}{3}{3}{3}{1}rSEQ{3}{5}{3}{3}{3}{1}{2}{4}", Encoding.ASCII.GetString(STX_BUFF), Encoding.ASCII.GetString(FS_BUFF), Encoding.ASCII.GetString(RS_BUFF), Encoding.ASCII.GetString(GS_BUFF), Encoding.ASCII.GetString(ETX_BUFF), rSEQ, iIID);

// obtiene el checksum
for (int i = 0; i < frame.Length; i++)
{
   byteVal = Convert.ToInt32(frame[i]);
   sumOfChars += byteVal;
}
checksum = Convert.ToString(sumOfChars % 256, 16).ToUpper();
if (checksum.Length == 1) checksum = "0" + checksum;

frame += string.Format("{0}{1}", checksum, Encoding.ASCII.GetString(EOT_BUFF));
© www.soinside.com 2019 - 2024. All rights reserved.