功能与类似输入的行为不同(C ++)

时间:2015-05-12 08:39:35

标签: c++

我正在尝试使用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是空的。我不明白为什么会发生这种情况。

2 个答案:

答案 0 :(得分:0)

对我而言似乎是一个C代码。但我确实快速分析了你的代码。我认为问题出在你计算

的地方
  

(partiehexa&lt; 10)

LRCascii仅在循环遍历代码的“reste”部分时被分配。在代码的“partiehexa”部分,它不会被分配给任何东西。

建议:将代码更改为以下代码,您的代码将正常工作

if (partiehexa<10) 
{ 
    std::stringstream ss3;
    ss3 << partiehexa;
    ss3 >> temp2;
    LRCascii += temp2;
}

最佳解决方案是以适当的优化方式重写代码。

答案 1 :(得分:0)

计算LRC

  1. 添加消息中的所有数据字节(在转换为ASCII之前,没有初始冒号和最终CR / LF)。
  2. 丢弃任何超过8位的位。
  3. 使结果为负(通过二次赞美)以获取LRC字节。
  4. 在您的示例中,校验和可以通过数学方式计算如下:

    字符串: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 ..