我正在尝试使用modbus协议,现在我正在计算消息的LRC。我做了一个功能,无论我投入什么都没有问题,然后我注意到id没有用于一个输入,我找不到合理解释为什么这不起作用。
功能是:
void LRCstring(std::string example)
{
std::stringstream ss;
std::string hex =example.substr(1, example.length()-5);
std::vector<unsigned char> hexCh;
unsigned int buffer;
int offset = 0;
while (offset < hex.length()) {
ss.clear();
ss << std::hex << hex.substr(offset, 2);
ss >> buffer;
hexCh.push_back(static_cast<unsigned char>(buffer));
offset += 2;
}
unsigned char LRC=0x00;
int i;
for (i=0;i<hexCh.size();i++)
{
LRC=LRC+hexCh[i];
}
LRC = 0xFF-LRC; // 1 complement
LRC = LRC+1; // 2 complement
//std::string s = std::to_string(LRC);
//int deci = atoi(s.c_str());
int deci = LRC;
int reste=deci % 16;
std::string temp;
int partiehexa=(deci-reste)/16;
std::string temp2;
std::cout << "deci : " << deci << std::endl;
std::cout << "reste : " << reste << std::endl;
std::cout << "partiehexa : " << partiehexa << std::endl;
std::stringstream ss2;
ss2 << reste;
ss2 >> temp;
ss2 << partiehexa;
ss2 >> temp2;
if (partiehexa<10) {LRCascii+=temp2;}
if (partiehexa==10) {LRCascii+='A';}
if (partiehexa==11) {LRCascii+='B';}
if (partiehexa==12) {LRCascii+='C';}
if (partiehexa==13) {LRCascii+='D';}
if (partiehexa==14) {LRCascii+='E';}
if (partiehexa==15) {LRCascii+='F';}
if (reste<10) {LRCascii+=temp;}
if (reste==10) {LRCascii+='A';}
if (reste==11) {LRCascii+='B';}
if (reste==12) {LRCascii+='C';}
if (reste==13) {LRCascii+='D';}
if (reste==14) {LRCascii+='E';}
if (reste==15) {LRCascii+='F';}
std::cout << "LRC : " << LRCascii << std::endl;
return;
}
输入及其工作结果的示例:
输入&gt; “:040100130013 ?? \ r \ n” 个
cout显示“LRC:D5”
输入&gt; “:0401CD6B05 ?? \ r \ n” 个
cout显示“LRC:BE”
D5和BE是正确的结果。
我尝试了其他输入,在此之前没有问题:
输入&gt; “:0403006B0003 ?? \ r \ n” 个
cout显示“LRC:B”
输入&gt; “:040306022B00000064 ?? \ r \ n” 个
cout显示“LRC:2”
它应该是8B,而不仅仅是B,它应该是62,而不仅仅是2.
我们可以看到LRC的最后部分是好的,但另一部分被忽略了。更奇怪的是,在这种情况下,“partiehexa”的cout显示“8”和“6”,它不是这个int是空的。我不明白为什么会发生这种情况。
答案 0 :(得分:0)
对我而言似乎是一个C代码。但我确实快速分析了你的代码。我认为问题出在你计算
的地方(partiehexa&lt; 10)
LRCascii仅在循环遍历代码的“reste”部分时被分配。在代码的“partiehexa”部分,它不会被分配给任何东西。
建议:将代码更改为以下代码,您的代码将正常工作
if (partiehexa<10)
{
std::stringstream ss3;
ss3 << partiehexa;
ss3 >> temp2;
LRCascii += temp2;
}
最佳解决方案是以适当的优化方式重写代码。
答案 1 :(得分:0)
计算LRC
在您的示例中,校验和可以通过数学方式计算如下:
字符串:040306022B00000064
校验和:62
字节#1十六进制值04十进制值4
字节#2十六进制值03十进制值3
字节#3十六进制值06十进制值6
字节#4十六进制值02十进制值2
字节#5十六进制值2B十进制值43
字节#6十六进制值00十进制值0
字节#7十六进制值00十进制值0
字节#8十六进制值00十进制值0
字节#9十六进制值64十进制值100
总十六进制值9E十进制值158
LRC:十六进制值FFFFFFFF62十进制值-158
因此,此示例中的单个Hex LRC字节为62。
PRASHANT ..