Lucky--Luka Posted June 5, 2023 Report Share Posted June 5, 2023 Hi everyone I need to make a VI that receives 4-byte hexadecimal values as ASCII strings from a CAN-USB interface. I am using an Arduino CAN schield with a firmware that I have not personally written and that I still haven't access to. I do have a problem with the format in which I receive the values. To get the exact value I should add 0 in the middle of the values when missing. I give an example to explain better. I get the string: 2 8 D5 0 0 0 0 B 5 70 <CR><LF> (value: 46448) I'd like to interpret it as: 2 8 D5 0 0 0 0 B 05 70 <CR><LF> (value: 722288) I'll give another example. I get the string: 2 8 D5 0 0 0 0 B 4 5 <CR><LF> (value: 2885) I'd like to interpret it as: 2 8 D5 0 0 0 0 B 04 05 <CR><LF> (value: 721925) The maximum value I can read in this case is 1000000 in any case. After I have added the zeros where needed in order to have always groups of two characters I can make something as in the attached VI to get the number that I am looking for. Does anyone have an idea what algorithm I can use? Thank you! ASCII-HEX.vi Quote Link to comment
Lipko Posted June 6, 2023 Report Share Posted June 6, 2023 The problem is not clear to me. You want to parse the string or do something else with it? Why wouldn't a simple scan from string work? Or do you want to forward the message? How fast should it be? Quote Link to comment
ShaunR Posted June 6, 2023 Report Share Posted June 6, 2023 12 hours ago, Lucky--Luka said: To get the exact value I should add 0 in the middle of the values when missing I don't think so. 12 hours ago, Lucky--Luka said: 4-byte hexadecimal values 12 hours ago, Lucky--Luka said: 2 8 D5 0 0 0 0 B 5 70 <CR><LF> (value: 46448) this should be (byte) grouped as 28 D5 00 00 B5 70 that's 6 bytes. I expect the last 4 bytes are the value so the first two (28 D5) are some sort of header. 00 00 B5 70 = 46448 so that seems reasonable. So. doing the same for your arbitrary insert... 12 hours ago, Lucky--Luka said: 2 8 D5 0 0 0 0 B 05 70 28 D5 00 00 (but what about the B?) 05 70. since 722288 = 00 0B 05 70 we have [with our arbitrary insert] 28 D5 00 00 0B 05 70. But that means we how have 7 bytes and have a 3 byte header instead of 2. Adding a 0 arbitrarily is not the solution here. You need to look at how you (the human) are understanding the data from the Arduino again. Quote Link to comment
hooovahh Posted June 6, 2023 Report Share Posted June 6, 2023 More information is needed. Is this a response to an ISO 15765 request? UDS, KWP2000, etc. Or is this periodically broadcasted frames? If it is UDS or something similar you'll need a CDD file to define how it should interpret the response. If it is a periodic message then a DBC file will define the structure of the data being sent, and what IDs belong to what data. I cover the Signal API and how bits can be interpreted in Part 5 of my CAN blog, and I talk about multi frame messaging in Part 8. If you are trying to reverse the CAN bus without this information, then I suspect you will have a very difficult time. There is an IEEE Float Data Type in the XNet Database editor which uses 4 bytes so it is possible this will do what you want. I'd make a database using the XNet Database editor specifying where in the frame the bits are and try using the conversion API with it. EDIT: Also I think Shaun is incorrect. 2 8 D5 0 0 0 0 B 5 70 I'm unsure what the 2 means but 8 means there are 8 bytes to read and the 8 bytes are D5 00 00 00 00 0B 05 70. 8 bytes is a common payload length for CAN. Double Edit: What are your expected values? I ran them through the IEEE conversion and tried Big/Little Endian but ended up with really large numbers both negative and positive. Quote Link to comment
Rolf Kalbermatter Posted June 16, 2023 Report Share Posted June 16, 2023 On 6/5/2023 at 11:18 PM, Lucky--Luka said: Hi everyone I need to make a VI that receives 4-byte hexadecimal values as ASCII strings from a CAN-USB interface. I am using an Arduino CAN schield with a firmware that I have not personally written and that I still haven't access to. I do have a problem with the format in which I receive the values. To get the exact value I should add 0 in the middle of the values when missing. I give an example to explain better. I get the string: 2 8 D5 0 0 0 0 B 5 70 <CR><LF> (value: 46448) I'd like to interpret it as: 2 8 D5 0 0 0 0 B 05 70 <CR><LF> (value: 722288) I'll give another example. I get the string: 2 8 D5 0 0 0 0 B 4 5 <CR><LF> (value: 2885) I'd like to interpret it as: 2 8 D5 0 0 0 0 B 04 05 <CR><LF> (value: 721925) The maximum value I can read in this case is 1000000 in any case. After I have added the zeros where needed in order to have always groups of two characters I can make something as in the attached VI to get the number that I am looking for. Does anyone have an idea what algorithm I can use? Thank you! ASCII-HEX.vi 6.73 kB · 2 downloads Posted on the dark side too and answered there quite extensively. https://forums.ni.com/t5/LabVIEW/Double-word-hex-string-to-number-format-problem/m-p/4309006 Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.