Avatar billede LennartH Nybegynder
18. maj 2011 - 14:32 Der er 4 kommentarer og
1 løsning

VBA kode til C#

Nedenstående kode fungerer i VBA (Excel 2003/2007):

NextSerialNum = 15001
serialCode = Chr(0)
serialCode = serialCode + Chr(0)
serialCode = serialCode + Chr(0)
serialCode = serialCode + Chr(0)
serialCode = serialCode + Chr((NextSerialNum \ 16777216) And 255)
serialCode = serialCode + Chr((NextSerialNum \ 65536) And 255)
serialCode = serialCode + Chr((NextSerialNum \ 256) And 255)
serialCode = serialCode + Chr(NextSerialNum And 255)


... men jeg skal bruge den i min C# kode. Nogen der kan hjælpe?
På forhånd tak.
Avatar billede arne_v Ekspert
18. maj 2011 - 21:22 #1
nextserialnum = 15001;
            serialCode = "" + (char)0;
            serialCode = serialCode + (char)0;
            serialCode = serialCode + (char)0;
            serialCode = serialCode + (char)0;
            serialCode = serialCode + (char)((nextserialnum / 16777216) & 255);
            serialCode = serialCode + (char)((nextserialnum / 65536) & 255);
            serialCode = serialCode + (char)((nextserialnum / 256) & 255);
            serialCode = serialCode + (char)(nextserialnum & 255);
Avatar billede LennartH Nybegynder
18. maj 2011 - 22:29 #2
Tak for hurtigt svar!

Jeg rodede med noget Modulus, men din løsning ser rigtig ud.
Dog skulle den gerne generere et serienummer på 8 bytes !?

((NextSerialNum / 16777216) & 255) får værdien 0
((NextSerialNum / 65536) & 255) får værdien 1
((NextSerialNum / 256) & 255)  får værdien 45
(NextSerialNum & 255) får værdien 145

og den færdige streng i dit eksempel bliver serialCode = "\0\0\0\0\0-‘"

Jeg får en fejl når strengen bruges i et efterfølgende kald.

VBA-koden ser således ud:

Private Function EolSend(ByVal Str As String)

    Dim char As Integer
   
    ' Send the escape character to signal a new command
    EolSendChar (255)

    ' Output each character to the serial port
    success = True
    While Len(Str) > 0
   
        char = AscB(Str)
        Str = Right(Str, Len(Str) - 1)
       
        ' Double send the escape character
        If char = 255 Then
            If EolSendChar(char) = 1 Then
                success = False
            End If
        End If
       
        If EolSendChar(char) = 1 Then
            success = False
        End If
       
    Wend
    EolSend = True

End Function

... og min konvertering til C# (sikkert med nogle grumme fejl):

private bool EolSend(string Str)
        {
            UInt32 SChars;
            UInt32 resultat;
            Int32 iLngd;
            bool bSuccess;

            resultat = Serial.EolSendChar(Convert.ToChar(255));
           
            bSuccess = true;

            while (Str.Length > 0)
            {
                SChars = Convert.ToByte(Str); // Her smider den en exception
                iLngd = Str.Length;
                iLngd = iLngd - 1;
                Str = Str.Substring(1, iLngd);

                if (SChars == 255)
                {
                    if (Serial.EolSendChar(Convert.ToChar(255)) == 1)
                    {
                        bSuccess = false;
                    }
                }

                if (Serial.EolSendChar(Convert.ToChar(SChars)) == 1)
                {
                    bSuccess = false;
                }
            }

            return bSuccess;
        }
Avatar billede arne_v Ekspert
19. maj 2011 - 03:17 #3
Den genererer 8 chars, men de kan nemt konverteres til 8 bytes ved at strippe 8 high bits af.

Men maaske var byte() bedre en string.

Du kunne starte med at checke om de 8 enkelt vaerdier er de samme.
Avatar billede LennartH Nybegynder
22. maj 2011 - 19:37 #4
Arne_V ... du har ret!
Den genererer 8 selvstændige tegn ... og ja, løsningen er at bruge byte().
Hvis andre skulle være interesseret, så er Arne_V's forslag her:

byte[] byteSerialCode = new byte[8];
           
            byteSerialCode[0] = 0;
            byteSerialCode[1] = 0;
            byteSerialCode[2] = 0;
            byteSerialCode[3] = 0;
            byteSerialCode[4] = Convert.ToByte(((iNxtSNum2 / 16777216) & 255));
            byteSerialCode[5] = Convert.ToByte(((iNxtSNum2 / 65536) & 255));
            byteSerialCode[6] = Convert.ToByte(((iNxtSNum2 / 256) & 255));
            byteSerialCode[7] = Convert.ToByte((iNxtSNum2 & 255));

Det fungerer perfekt. Lægger du et svar, Arne_V og tak for hjælpen.
Avatar billede arne_v Ekspert
22. maj 2011 - 20:55 #5
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester