Losing my fricken mind - BXOR
Someone please check my math...
I'm working on comms with a BlU100 (I'd rather ram a flaming sharp stick in my eye)
They use a really janky hex protocol with a checsum.
here's the string in their example:
"0x02, 0x88, 0x01, 0x0F, 0x1B, 0x83, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x84, 0x03"
what I'm supposed to do to make a checksum is XOR the charactors in the "body" of the message which is the following part of the previous message:
" 0x88, 0x01, 0x0F, 0x1B, 0x83, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00"
The first char ($02) is the message header, the last char ($03) is the termination. The penultimate char (($84) is supposed to be the check sum. I have done the XOR in code and on a calculator and come up with $1F. The answer according to the documentation is supposed to be $84. My method (according to the documentation) of XOR-ing is:
result =$88 BXOR $01
result= result BXOR $01
result= result BXOR $0F
result=result BXOR $1B
etc...
any hints as to what I'm doing wrong? Or is the documentation wrong? anyone have experience with the BLU100?
I'm working on comms with a BlU100 (I'd rather ram a flaming sharp stick in my eye)
They use a really janky hex protocol with a checsum.
here's the string in their example:
"0x02, 0x88, 0x01, 0x0F, 0x1B, 0x83, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x84, 0x03"
what I'm supposed to do to make a checksum is XOR the charactors in the "body" of the message which is the following part of the previous message:
" 0x88, 0x01, 0x0F, 0x1B, 0x83, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00"
The first char ($02) is the message header, the last char ($03) is the termination. The penultimate char (($84) is supposed to be the check sum. I have done the XOR in code and on a calculator and come up with $1F. The answer according to the documentation is supposed to be $84. My method (according to the documentation) of XOR-ing is:
result =$88 BXOR $01
result= result BXOR $01
result= result BXOR $0F
result=result BXOR $1B
etc...
any hints as to what I'm doing wrong? Or is the documentation wrong? anyone have experience with the BLU100?
0
Comments
If I only had the actual unit here I could test against reality. I can tell you this is the worst thought out protocol I've ever seen. The best part is the message IDs are 5 values
0x02 STX
0x03 ETX
0x06 ACK
0x15 NAK
0x1B Escape
However, if these values occur withing the body of the message (which they often do) then they have a set of replacement values you have to sub in AFTER you do the checksum. ANNNNNND if the checksum happens to work out to be one of these reserved values, IT needs to be subbed in. c'mon folks, it's the fricken 21st century. wake up and smell the 16+ bit word length. It's okay to use plain text stuff. All the cool kids are nowadays...
Create the command,
Create the checksum via XOR,
Do the extra special "Escape Out" for certain values (add $80 to the byte and preface it with $1B),
Append with STX and ETX
This is a little subroutine I wrote, I hope it helps:
Define_Function integer fnBSSCommand(Char Initial_Cmd[20]) { local_var Char Raw_Cmd[20] local_var Char After_Build[30] local_var Char Final_Command[40] local_var integer CS_Count local_var integer PB_Length local_var integer RC_Count local_var integer RC_Length local_var integer Check_Sum After_Build = "" //Calculate Checksum PB_Length = length_string (Initial_Cmd) Check_Sum = Initial_Cmd[1] for (CS_Count = 2;CS_Count<=PB_Length;CS_Count++) { Check_Sum = Check_Sum ^ Initial_Cmd[CS_Count] } Raw_Cmd = "Initial_Cmd,Check_Sum" //Escape out the specific bytes that need to be changed RC_Length = length_String (Raw_Cmd) For (RC_Count=1;RC_Count<=RC_Length;RC_Count++) { if (Raw_Cmd[RC_Count] = $02 || Raw_Cmd[RC_Count] = $03 || Raw_Cmd[RC_Count] = $06 || Raw_Cmd[RC_Count] = $15 || Raw_Cmd[RC_Count] = $1B) { After_Build = "After_Build,$1B,(Raw_Cmd[RC_Count]+$80)" } Else { After_Build = "After_Build,Raw_Cmd[RC_Count]" } } Final_Command = "STX,After_Build,ETX" SEND_STRING DSP1,"Final_Command" }Also remember if you're using live feedback from the device, you NEED to REVERSE all those "ESCAPED OUT" bytes the BLU sends you back. It's like the process above only reversed:
Define_Function Char[17] fnBSSRetun(Char Reply_Cmd[]) //Need to pull the escapes out { local_var char raw_return[30] local_var char real_return[20] local_var integer Replycount local_var integer replylength raw_return = "Reply_Cmd" replylength = (length_string(raw_return)-1) real_return = "raw_return[1]" For (Replycount=2;Replycount<=replylength;Replycount++) { if (raw_return[Replycount] = $1B) { real_return = "real_return,(raw_return[Replycount+1]-$80)" Replycount++ } Else { real_return = "real_return,raw_return[Replycount]" } } Return (real_return) }I hope this helps madman.
Andrew,
What a guy! Thanks! it's amazing how close our code is. I even named some of my stack_vars the same... I seem to remember a guy like you helping out with another DSP a while back...