Const CardType = 2          '控制卡类型,2型卡
Const ComPort = 1           '串口1
Const ComBaudRate = 38400   '通讯速率
Const ComDelay = 1500       '延时
Const LedNum = 0            '屏号
Const LedWidth = 384        '屏宽
Const LedHeight = 128       '屏高
Const LedColor = 1          '双色屏
'
'
Const MAXWIDTH = 2048
Const MAXHEIGHT = 512' 图片数据结构,注意 VB 语言中,数组下标前一个是列,后一个是行。
' CL2005系列控制系统最大控制范围宽度为2048,每个字节表示8个点,需要256个字节,所以第一下标从0到255。
' CL2005系列控制卡最大控制范围高度为512行,第2下标直接写0到511
Dim PictBuf(0 To MAXWIDTH \ 8 - 1, 0 To MAXHEIGHT - 1) As Byte
'
' 节目表数据结构,
Private Type ProgStruct
    PictIndex   As Byte
    Enter       As Byte
    Leave       As Byte
    Speed       As Byte
    StayTime    As Byte
    bFollowFlag As Byte
    bShowTimer  As Byte
    bTimerPlay  As Byte
    TimerMode   As Byte
    WeekFlag    As Byte
    StartHour   As Byte
    StartMinute As Byte
    EndHour     As Byte
    EndMinute   As Byte
    NotUsed0    As Byte
    NotUsed1    As Byte
End Type
--------------------------------------------------------------------------------------------------------------------------------------
' 通用图片整理程序截取到图片数据缓冲区
' 用户若需要调用该程序,需要事先定义图片变量 Pict 和数据缓冲区变量 PicBuf
' Pict       : 图片,可以更换成Bmp
' Buff       : 图片缓冲区
' PictWidth  : 图片宽度
' PictHeight : 图片高度
' Width      : 显示屏宽度
' Height     : 显示屏高度
Private Sub PictToBuff(ByRef PictDc As PictureBox, PictWidth As Integer, PictHeight As Integer, xWidth As Integer, xHeight As Integer, Color As Integer)
Dim x As Integer, y As Integer, z As Integer, EndX As Integer, EndY As Integer
Dim vC As Long
Dim v As Byte, xv As Byte
Dim ROLE(0 To 9) As Byte
Dim xx As Integer
    ROLE(0) = &H80: ROLE(1) = &H40: ROLE(2) = &H20: ROLE(3) = &H10
    ROLE(4) = &H8: ROLE(5) = &H4: ROLE(6) = &H2: ROLE(7) = &H1
    '
    ' 清除图片缓冲区
    For y = 0 To MAXHEIGHT - 1 Step 1
        For x = 0 To MAXWIDTH \ 8 - 1 Step 1
            PictBuf(x, y) = 0
        Next x
    Next y
    '
    ' 根据图片和屏体的宽高决定截取图片的宽高,保证数据不越界
    If PictWidth >= xWidth Then EndX = xWidth Else EndX = PictWidth
    If PictHeight >= xHeight Then EndY = xHeight Else EndY = PictHeight
    '
    ' 遍历高度和宽度
    ' 先截取红色
    xx = (EndX + 7) \ 8 - 1
    For y = 0 To EndY - 1 Step 1
        For x = 0 To xx Step 1
            v = 0
            For z = 0 To 7 Step 1
                vC = PictDc.Point((x * 8 + z) * 15, y * 15)
                If (vC Mod 256) > 32 Then v = v + ROLE(z)
            Next z
            PictBuf(x, y) = v
        Next x
    Next y
    ' 双色屏则再截取绿色
    If Color <> 0 Then
        For y = 0 To EndY - 1 Step 1
            For x = 0 To xx Step 1
                v = 0
                For z = 0 To 7 Step 1
                    vC = PictDc.Point((x * 8 + z) * 15, y * 15)
                    If ((vC \ 256) Mod 256) > 32 Then v = v + ROLE(z)
                Next z
               PictBuf(x, y + xHeight) = v
            Next x
        Next y
    End If
End Sub
--------------------------------------------------------------------------------------------------------------------------------------
' 通用文本整理程序
' VB 的字符串全是16位代码,控件要求使用8位ASCII码,因此需要用下面的程序
' 将16位字符串整理为8位的ASCII码串,并且整理成 C 语言的以0结束的格式
Private Sub StringToByte(ByRef S As String, ByRef ByteBuf() As Byte)
Dim i As Integer
Dim j As Integer
Dim v As Integer
Dim xv As Integer
Dim Lv As Long
    j = 0
    For i = 0 To Len(S) - 1
        v = Asc(Mid(S, i + 1, 1))           '取一个16位字符
        If v > 0 Then                       '普通字符
            ByteBuf(j) = v
            j = j + 1
        Else                                '小于0则为中文字,实际是大于等于32768
            Lv = 65536 + v
            xv = Lv \ 256
            ByteBuf(j) = xv
            j = j + 1
            xv = Lv Mod 256
            ByteBuf(j) = xv
            j = j + 1
        End If
    Next i
    ByteBuf(j) = 0                          'CL2005Ocx 控件是C语言编写的,字符串必须以0结尾
End SubPrivate Sub BtnReset_Click()
Dim bOK As Boolean
    bOK = CL2005.ComInitial(ComPort, ComBaudRate, ComDelay)
    If bOK Then bOK = CL2005.SetLEDProperty(CardType, LedNum, LedWidth, LedHeight, LedColor, 0)
    If bOK Then bOK = CL2005.Reset
    CL2005.CloseCL2005
    If bOK Then
        bOK = MsgBox("发送成功", vbOKOnly, "复位控制卡")
    Else
        bOK = MsgBox("发送失败", vbOKOnly, "复位控制卡")
    End If
End SubPrivate Sub BtnSendPicture_Click()
Dim bOK As Boolean
Dim ProgList(0 To 9) As ProgStruct
Dim w As Integer, h As Integer
Dim i As Integer
    w = (Pict.Width + 14) \ 15
    h = (Pict.Height + 14) \ 15
    Call PictToBuff(Pict, w, h, LedWidth, LedHeight, LedColor)
    bOK = CL2005.ComInitial(ComPort, ComBaudRate, ComDelay)
    If bOK Then bOK = CL2005.SetLEDProperty(CardType, LedNum, LedWidth, LedHeight, LedColor, 0)
    ' 发送图片
    If bOK Then bOK = CL2005.SendPicture(0, VarPtr(PictBuf(0, 0)))
    ' 发送图片的语句也可用下列语句替换
'    If bOK Then
'        i = 0
'        Do While bOK And (i < CL2005.GetPictureSendTimes)
'            bOK = bOK And CL2005.SendPictureEx(0, i, VarPtr(PictBuf(0, 0)))
'            i = i + 1
'        Loop
'    End If
    ProgList(0).PictIndex = 0       ' 图片0的播放属性
    ProgList(0).Enter = 0           ' 进入方式0
    ProgList(0).Leave = 2           ' 退出方式2
    ProgList(0).Speed = 12          ' 速度
    ProgList(0).StayTime = 5        ' 停留时间
    ProgList(0).bFollowFlag = 0     ' 非紧随模式
    ProgList(0).bShowTimer = 0      ' 非整页时钟项
    ProgList(0).TimerMode = 0       ' 不显示日期时间
    ProgList(0).bTimerPlay = 0      ' 非定时播放项
    
    ProgList(1).PictIndex = 0       ' 图片0的播放属性
    ProgList(1).Enter = 1           ' 进入方式1
    ProgList(1).Leave = 1           ' 退出方式1
    ProgList(1).Speed = 0           ' 速度
    ProgList(1).StayTime = 5        ' 停留时间
    ProgList(1).bFollowFlag = 0     ' 非紧随模式
    ProgList(1).bShowTimer = 0      ' 非整页时钟项
    ProgList(1).TimerMode = 0       ' 不显示日期时间
    ProgList(1).bTimerPlay = 0      ' 非定时播放项
    
    If bOK Then bOK = CL2005.SendProgList(2, VarPtr(ProgList(0).PictIndex))
    CL2005.CloseCL2005
    If bOK Then
        bOK = MsgBox("发送成功", vbOKOnly, "发送图片")
    Else
        bOK = MsgBox("发送失败", vbOKOnly, "发送图片")
    End If
End Sub
Private Sub BtnSendText_Click()
Dim S As String
Dim TxtBuf(0 To 1023) As Byte
Dim bOK As Boolean
    S = "`02绿`01红`03黄"
    Call StringToByte(S, TxtBuf)
    bOK = CL2005.ComInitial(ComPort, ComBaudRate, ComDelay)
    If bOK Then bOK = CL2005.SetLEDProperty(CardType, LedNum, LedWidth, LedHeight, LedColor, 0)
    If bOK Then bOK = CL2005.ShowString(0, LedWidth - 3 * 16 - 1, 0, 1, VarPtr(TxtBuf(0)))
    If bOK Then bOK = CL2005.SwitchToBank(0)
    CL2005.CloseCL2005
    If bOK Then
        bOK = MsgBox("发送成功", vbOKOnly, "显示文字")
    Else
        bOK = MsgBox("发送失败", vbOKOnly, "显示文字")
    End If
End Sub改为C#谢谢

解决方案 »

  1.   

    建议将VB的程序包装成COM对象,直接让C#调用。
      

  2.   

    private const CardType = 2; //'控制卡类型,2型卡
     private const ComPort = 1; //'串口1
     private const ComBaudRate = 38400; //'通讯速率
     private const ComDelay = 1500; //'延时
     private const LedNum = 0; //'屏号
     private const LedWidth = 384; //'屏宽
     private const LedHeight = 128 ;//'屏高
     private const LedColor = 1; //'双色屏
     private const MAXWIDTH = 2048;
     private const MAXHEIGHT = 512;
            byte[,] PictBuf = new byte[MAXWIDTH / 8, MAXHEIGHT];
       private struct ProgStruct
        {
            byte PictIndex;
            byte Enter;
            byte Leave;
            byte Speed;
            byte StayTime;
            byte bFollowFlag;
            byte bShowTimer;
            byte bTimerPlay;
            byte TimerMode;
            byte WeekFlag;
            byte StartHour;
            byte StartMinute;
            byte EndHour;
            byte EndMinute;
            byte NotUsed0;
            byte NotUsed1;
        }; private void PictToBuff(ref PictureBox PictDc, int PictWidth, int PictHeight, int xWidth, int xHeight, int Color)
    {
    int x = 0;
    int y = 0;
    int z = 0;
    int EndX = 0;
    int EndY = 0;
    long vC = 0;
    byte v = 0;
    byte xv = 0;
    byte[] ROLE = new byte[10];
    int xx = 0;
    ROLE(0) = 0x80;
    ROLE(1) = 0x40;
    ROLE(2) = 0x20;
    ROLE(3) = 0x10;
    ROLE(4) = 0x8;
    ROLE(5) = 0x4;
    ROLE(6) = 0x2;
    ROLE(7) = 0x1;
    //
    // 清除图片缓冲区
    for (y = 0; y <= MAXHEIGHT - 1; y += 1) {
    for (x = 0; x <= MAXWIDTH / 8 - 1; x += 1) {
    PictBuf(x, y) = 0;
    }
    }
    //
    // 根据图片和屏体的宽高决定截取图片的宽高,保证数据不越界
    if (PictWidth >= xWidth)
    EndX = xWidth;
    else
    EndX = PictWidth;
    if (PictHeight >= xHeight)
    EndY = xHeight;
    else
    EndY = PictHeight;
    //
    // 遍历高度和宽度
    // 先截取红色
    xx = (EndX + 7) / 8 - 1;
    for (y = 0; y <= EndY - 1; y += 1) {
    for (x = 0; x <= xx; x += 1) {
    v = 0;
    for (z = 0; z <= 7; z += 1) {
    vC = PictDc.Point((x * 8 + z) * 15, y * 15);
    if ((vC % 256) > 32)
    v = v + ROLE(z);
    }
    PictBuf(x, y) = v;
    }
    }
    // 双色屏则再截取绿色
    if (Color != 0) {
    for (y = 0; y <= EndY - 1; y += 1) {
    for (x = 0; x <= xx; x += 1) {
    v = 0;
    for (z = 0; z <= 7; z += 1) {
    vC = PictDc.Point((x * 8 + z) * 15, y * 15);
    if (((vC / 256) % 256) > 32)
    v = v + ROLE(z);
    }
    PictBuf(x, y + xHeight) = v;
    }
    }
    }
    } private void BtnSendPicture_Click()
    {
    bool bOK = false;
    ProgStruct[] ProgList = new ProgStruct[10];
    int w = 0;
    int h = 0;
    int i = 0;
    w = (Pict.Width + 14) / 15;
    h = (Pict.Height + 14) / 15;
    PictToBuff(Pict, w, h, LedWidth, LedHeight, LedColor);
    bOK = CL2005.ComInitial(ComPort, ComBaudRate, ComDelay);
    if (bOK)
    bOK = CL2005.SetLEDProperty(CardType, LedNum, LedWidth, LedHeight, LedColor, 0);
    // 发送图片
    if (bOK)
    bOK = CL2005.SendPicture(0, VarPtr(PictBuf(0, 0)));
    // 发送图片的语句也可用下列语句替换
    // If bOK Then
    // i = 0
    // Do While bOK And (i < CL2005.GetPictureSendTimes)
    // bOK = bOK And CL2005.SendPictureEx(0, i, VarPtr(PictBuf(0, 0)))
    // i = i + 1
    // Loop
    // End If
    ProgList(0).PictIndex = 0;
    // 图片0的播放属性
    ProgList(0).Enter = 0;
    // 进入方式0
    ProgList(0).Leave = 2;
    // 退出方式2
    ProgList(0).Speed = 12;
    // 速度
    ProgList(0).StayTime = 5;
    // 停留时间
    ProgList(0).bFollowFlag = 0;
    // 非紧随模式
    ProgList(0).bShowTimer = 0;
    // 非整页时钟项
    ProgList(0).TimerMode = 0;
    // 不显示日期时间
    ProgList(0).bTimerPlay = 0;
    // 非定时播放项 ProgList(1).PictIndex = 0;
    // 图片0的播放属性
    ProgList(1).Enter = 1;
    // 进入方式1
    ProgList(1).Leave = 1;
    // 退出方式1
    ProgList(1).Speed = 0;
    // 速度
    ProgList(1).StayTime = 5;
    // 停留时间
    ProgList(1).bFollowFlag = 0;
    // 非紧随模式
    ProgList(1).bShowTimer = 0;
    // 非整页时钟项
    ProgList(1).TimerMode = 0;
    // 不显示日期时间
    ProgList(1).bTimerPlay = 0;
    // 非定时播放项 if (bOK)
    bOK = CL2005.SendProgList(2, VarPtr(ProgList(0).PictIndex));
    CL2005.CloseCL2005();
    if (bOK) {
    bOK = Interaction.MsgBox("发送成功", Constants.vbOKOnly, "发送图片");
    } else {
    bOK = Interaction.MsgBox("发送失败", Constants.vbOKOnly, "发送图片");
    }
    }
    private void StringToByte(ref string S, ref byte[] ByteBuf)
    {
    int i = 0;
    int j = 0;
    int v = 0;
    int xv = 0;
    long Lv = 0;
    j = 0;
    for (i = 0; i <= Strings.Len(S) - 1; i++) {
    v = Strings.Asc(Strings.Mid(S, i + 1, 1));
    //取一个16位字符
    //普通字符
    if (v > 0) {
    ByteBuf(j) = v;
    j = j + 1;
    //小于0则为中文字,实际是大于等于32768
    } else {
    Lv = 65536 + v;
    xv = Lv / 256;
    ByteBuf(j) = xv;
    j = j + 1;
    xv = Lv % 256;
    ByteBuf(j) = xv;
    j = j + 1;
    }
    }
    ByteBuf(j) = 0;
    //CL2005Ocx 控件是C语言编写的,字符串必须以0结尾
    }private void BtnReset_Click()
    {
    bool bOK = false;
    bOK = CL2005.ComInitial(ComPort, ComBaudRate, ComDelay);
    if (bOK)
    bOK = CL2005.SetLEDProperty(CardType, LedNum, LedWidth, LedHeight, LedColor, 0);
    if (bOK)
    bOK = CL2005.Reset;
    CL2005.CloseCL2005();
    if (bOK) {
    bOK = Interaction.MsgBox("发送成功", Constants.vbOKOnly, "复位控制卡");
    } else {
    bOK = Interaction.MsgBox("发送失败", Constants.vbOKOnly, "复位控制卡");
    }
    }private void BtnSendText_Click()
    {
    string S = null;
    byte[] TxtBuf = new byte[1024];
    bool bOK = false;
    S = "`02绿`01红`03黄";
    StringToByte(S, TxtBuf);
    bOK = CL2005.ComInitial(ComPort, ComBaudRate, ComDelay);
    if (bOK)
    bOK = CL2005.SetLEDProperty(CardType, LedNum, LedWidth, LedHeight, LedColor, 0);
    if (bOK)
    bOK = CL2005.ShowString(0, LedWidth - 3 * 16 - 1, 0, 1, VarPtr(TxtBuf(0)));
    if (bOK)
    bOK = CL2005.SwitchToBank(0);
    CL2005.CloseCL2005();
    if (bOK) {
    bOK = Interaction.MsgBox("发送成功", Constants.vbOKOnly, "显示文字");
    } else {
    bOK = Interaction.MsgBox("发送失败", Constants.vbOKOnly, "显示文字");
    }
    }
      

  3.   

    教给你个办法,把它编译好再用Refactor反编译出来