Converting C code into VB.Net 2008

Hello,

following is the code in C used in Modbus CRC calculation. Can someone convert this into VB.Net code since I am not good at C?

Regards,
MI
void ModbusRTU_CalculateCrc(void)
{
	BYTE ucCount = RESET,ucNoOfBits = RESET;
	WORD iCrc;
	
	iCrc = 0xFFFF ^ (*g_pucCRC_Buffer);
	
	for(ucCount = 1; ucCount <= g_ucCRCBufferCount ; ucCount++)
	{
		for(ucNoOfBits = 0; ucNoOfBits <= 7; ucNoOfBits++)
		{
			if((iCrc & 0x01) == 0X01)
			{
				iCrc >>= 1;
	        	iCrc = iCrc^0xA001;
			}	
			else
			{
				iCrc >>= 1;
            }
	 	}
		
		if(ucCount != g_ucCRCBufferCount)
		{
			iCrc = iCrc^(*(++g_pucCRC_Buffer));
		}
		else
		{
		}
	 }
	 
	//Extract lower byte crc.
	g_ucCRCLowByte = iCrc&0x00FF;
	//Extract higher byte of crc.
	g_ucCRCHighByte = ((iCrc>>8)&0x00FF);
	//End of function ModbusRTU_CalculateCrc()
}

Open in new window

vj_miAsked:
Who is Participating?
 
käµfm³d 👽Connect With a Mentor Commented:
Translated from your code (mind the notes in the comments)
Public Sub ModbusRTU_CalculateCrc()
    'Assumes you have the next line declared globally elsewhere
    'Dim g_pucCRC_Buffer, g_ucCRCBufferCount, g_ucCRCLowByte, g_ucCRCHighByte As Integer
 
    'Assumes RESET equals 0
    Dim ucCount As Integer = 0, ucNoOfBits As Integer = 0
    Dim iCrc As Integer
 
    iCrc = &HFFFF Xor g_pucCRC_Buffer
 
    For ucCount = 1 To g_ucCRCBufferCount
        For ucNoOfBits = 0 To 7
            If iCrc And &H1 = &H1 Then
                iCrc >>= 1
                iCrc = iCrc Xor &HA001
            Else
                iCrc >>= 1
            End If
        Next
 
        If ucCount <> g_ucCRCBufferCount Then
            g_pucCRC_Buffer += 1
            iCrc = iCrc Xor g_pucCRC_Buffer
        End If
    Next
 
    g_ucCRCLowByte = iCrc And &HFF
    g_ucCRCHighByte = (iCrc >> 8) And &HFF
 
End Sub

Open in new window

0
 
oobaylyCommented:
Rather than reinventing the wheel, I did a quick google:
http://modbus.control.com/thread/1026164935

It appears to be VB6 code, but it's quite easy to translate into VB.Net
0
 
oobaylyCommented:
Saying that, I'm a masochist. Best test that it works properly though!
A couple of things: The C code uses DWORD, which is an unsigned 16bit integer. As VB.Net isn't too keen on UInt16, I've used a 32bit integer instead.
I've used a cross between the C code and the VB code in the link. I didn't like the C loop, and I didn't like the VB bitshifting (mainly because VB6 doesn't have a bitshift operator)
Private Shared Function ModbusCRC(ByVal buff As Byte()) As Integer
    Dim crc As Integer = &Hff
    For i As Integer = 0 To buff.Length - 1
        crc = crc Xor buff(i)
        For j As Integer = 0 To 7
            If (crc And &H1) = &H1 Then
                crc >>= 1
                crc = crc And &Ha001
            Else
                crc >>= 1
            End If
        Next
    Next
    
    ' Lower & Upper bytes (if you need them)
    Dim lower As Byte = CByte(crc And &Hff)
    Dim upper As Byte = CByte((crc >> 8) And &Hff00)
    
    Return crc
End Function

Open in new window

0
Get your problem seen by more experts

Be seen. Boost your question’s priority for more expert views and faster solutions

 
oobaylyCommented:
Just noticed my code calculates upper incorrectly, originally I had done the bitshift after the bitwise and.
Also, ignore my comments on DWORD, I was reading it as WORD by mistake.
Where was my mind when I posted the answer? <sigh>
Dim upper As Byte = CByte((crc >> 8) And &Hff)

Open in new window

0
 
vj_miAuthor Commented:
Hi friends,

I am yet to test the above code snippets since we got bounced by the data that we send to serial port. Unless that code is fixed, I cannot run the above code snipper. Please bear with me for a day or two. Meantime, I will post the serial port issue as a new thread.

Regards,
MI
0
 
vj_miAuthor Commented:
oobayly:
The code you have mentioned (along with the rectification you asked for returns both lower and upper bytes as 0.

kaufmed:
I had to modify the code slightly for it to work...

Regards,
MI
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.