串口发送4000来个数据的文件,发第一次行,发第二次为什么就不行了呢?要关了重新运行程序才能在发(不过发些小的数据可以多次发送,不用重新运行程序)这是为什么呢?

解决方案 »

  1.   


    下面是我串口通讯的代码:
    Private Sub Form_Load()
        MSComm1.CommPort = 1
        MSComm1.InBufferSize = 1024
        MSComm1.OutBufferSize = 1024
        MSComm1.Settings = "9600,n,8,1"
        MSComm1.RThreshold = 1                                         '设置接收一个字节就产生OnComm事件
        MSComm1.InputMode = comInputModeBinary                          '采用二进制传输*****
        MSComm1.PortOpen = True
        Text1 = ""
        Text2 = ""
        Text3 = ""
        Text4 = ""
        Text5 = ""
        Text6 = ""
        Text7 = ""
        Timer1.Enabled = False
        Timer1.Interval = 10
    End SubPrivate Sub Command1_Click()       '发送
        Dim NextLine As String
        Dim Txt_sj As String
        Dim yTemp() As Byte
        ReDim yTemp((Len(Text1) + 24) / 2 - 1)
        Dim i As Integer
        yTemp(0) = &H97
        yTemp(1) = &H0
        yTemp(2) = &H1
        yTemp(3) = &HFF
        yTemp(4) = &HB1
        yTemp(5) = "&H" & Hex(Combo1.ListIndex + 1)
        yTemp(6) = "&H" & Hex(Combo2.ListIndex + 1)
        yTemp(7) = "&H" & Hex(Combo3.ListIndex + 1)
        yTemp(8) = "&H" & Hex(Text4)
        yTemp(9) = &H0
        yTemp(11) = &H0
        yTemp(12) = &H0
        For i = 1 To Len(Text1) Step 2
            yTemp((i - 1) / 2 + 12) = "&H" & Mid(Text1, i, 2) '0X**
        Next    Ulen = UBound(yTemp)
        Llen = LBound(yTemp)
        Yu_sum = (Ulen + 1) Mod 128
        for_Sum = (Ulen + 1) \ 128
        Picture1.Print "字节长= "; Ulen + 1; "循环次数= "; for_Sum; "余数= "; Yu_sum   '格式:[对象.]Print[表达式表][,l;]
        ReDim sj(Ulen)
        For i = 0 To Ulen
        sj(i) = yTemp(i)
        Next
        If for_Sum > 0 Then
           Timer1.Enabled = True
           j = Timer
           'j.Refresh
           
        ElseIf for_Sum = 0 Then
             MSComm1.Output = yTemp
        End If
    End Sub
    Private Sub Timer1_Timer()                                         'timer控制节奏发送
        Static sum As Long
        Dim i As Integer
        ReDim dataSend(127) As Byte
        For i = 0 To 127
            If sum >= for_Sum Then
                Exit For
            End If
            dataSend(i) = sj(i + sum * 128)
        Next
        MSComm1.Output = dataSend
        sum = sum + 1
        If sum >= for_Sum Then
            'Cmd_Fsend                                                    '发送剩余字节
            Text2 = " " & Mid((Timer - j), 1, 5) & "  秒"
            Text2.Refresh
            Timer1.Enabled = False                                         '关闭定时器
            
            '发送yu_sum         If Yu_sum > 0 Then
                ReDim dataSend(Yu_sum - 1)
                For i = 0 To Yu_sum - 1
                  dataSend(i) = sj(128 * for_Sum + i)
                Next
               MSComm1.Output = dataSend
            End If
       End If
    End Sub
      

  2.   

    LZ:原我提供的代码是解决控制发送节奏的,并未考虑多次发送的问题,今天仔细研究了我给出的代码,已经找到出错的地方.现将修改代码附下:
    Option Explicit
        Dim strData As String
        Dim bytInput() As Byte
        Dim dataSend() As Byte
        Dim yTemp() As Byte
        Dim SJ() As Byte
        Dim i As Long
        Dim Ulen  As Long
        Dim Llen  As Long
        Dim for_Sum  As Long
        Dim Yu_sum As Integer
        Dim strfFleName As String
        Dim sum As Integer '将sum定义从过程中取消,放窗体声明处Private Sub cmdOpen_Click()
        Dim str1 As String
        Dim NextLine As String
        Dim Txt_sj As String
        Dim yTemp() As Byte
        CommonDialog1.ShowOpen
        Text1 = ""
        Text2 = ""
        Text3 = ""
        Text4 = ""
        Text5 = ""
        Text6 = ""
        strData = ""
        str1 = ""
        DoEvents
        strfFleName = CommonDialog1.FileName
        Text6 = Timer
        Text6.Refresh
        Open strfFleName For Input As #1
            Do While Not EOF(1)
                Input #1, str1
                strData = strData & Right(str1, 2) '& Chr(13) & Chr(10)
            Loop
        Close
        Text1 = strData
        ReDim yTemp(Len(strData) / 2 - 1)
        Dim i As Integer
        For i = 1 To Len(strData) Step 2
            yTemp((i - 1) / 2) = "&H" & Mid(strData, i, 2)
        Next
        Ulen = UBound(yTemp)
        Llen = LBound(yTemp)
        Yu_sum = (Ulen + 1) Mod 256
        for_Sum = (Ulen + 1) \ 256
        Print "字节长= "; Ulen + 1; "循环次数= "; for_Sum; "余数= "; Yu_sum
        ReDim SJ(Ulen)
        For i = 0 To Ulen
            SJ(i) = yTemp(i)
        Next
        sum = 0 '开始发送时将Sum初始化为0
        If for_Sum > 0 Then
           Timer1.Enabled = True
           Text2 = Timer
           Text2.Refresh
        ElseIf for_Sum = 0 Then
            Cmd_Dsend
        End If
    End SubPrivate Sub Form_Load()
        MSComm1.CommPort = 1
        MSComm1.InBufferSize = 1024
        MSComm1.OutBufferSize = 1024
        MSComm1.Settings = "9600,n,8,1"
        MSComm1.PortOpen = True
        Text1 = ""
        Text2 = ""
        Text3 = ""
        Text4 = ""
        Text5 = ""
        Text6 = ""
        Timer1.Enabled = False
        Timer1.Interval = 100
    End SubPrivate Sub Timer1_Timer() '大数据包分解为多个小数据包
        Dim i As Integer
        ReDim dataSend(255) As Byte
        For i = 0 To 255
            If sum >= for_Sum Then
                Exit For
            End If
            dataSend(i) = SJ(i + sum * 256)
        Next
        MSComm1.Output = dataSend
        sum = sum + 1
        If sum >= for_Sum Then
            Cmd_Fsend '发送剩余字节
            Text3 = Timer
            Text3.Refresh
            Timer1.Enabled = False
        End If
    End SubPrivate Sub Cmd_Dsend()
        ReDim dataSend(Yu_sum - 1)
        For i = 0 To Yu_sum - 1
            dataSend(i) = yTemp(i)
        Next
        MSComm1.Output = dataSend
    End SubPrivate Sub Cmd_Fsend()
            Text4 = Timer
            Text4.Refresh
        If Yu_sum > 0 Then
            ReDim dataSend(Yu_sum - 1)
            For i = 0 To Yu_sum - 1
                dataSend(i) = SJ(256 * for_Sum + i)
            Next
            MSComm1.Output = dataSend
        End If
        Text5 = Timer
        Text5.Refresh
    End Sub
      

  3.   

    修改不妥处:Private Sub cmdOpen_Click()
        Dim str1 As String
        Dim NextLine As String
        Dim Txt_sj As String
        Dim yTemp() As Byte
        Text1 = "" '以下8行都执行初始数据
        Text2 = ""
        Text3 = ""
        Text4 = ""
        Text5 = ""
        Text6 = ""
        strData = ""
        str1 = ""
        DoEvents
        CommonDialog1.ShowOpen
        strfFleName = CommonDialog1.FileName
        Text6 = Timer
        Text6.Refresh
        Open strfFleName For Input As #1
            Do While Not EOF(1)
                Input #1, str1
                strData = strData & Right(str1, 2) '& Chr(13) & Chr(10)
            Loop
        Close
        Text1 = strData
        ReDim yTemp(Len(strData) / 2 - 1)
        Dim i As Integer
        For i = 1 To Len(strData) Step 2
            yTemp((i - 1) / 2) = "&H" & Mid(strData, i, 2)
        Next
        Ulen = UBound(yTemp)
        Llen = LBound(yTemp)
        Yu_sum = (Ulen + 1) Mod 256
        for_Sum = (Ulen + 1) \ 256
        Print "字节长= "; Ulen + 1; "循环次数= "; for_Sum; "余数= "; Yu_sum
        ReDim SJ(Ulen)
        For i = 0 To Ulen
            SJ(i) = yTemp(i)
        Next
        sum = 0 '开始发送时将Sum初始化为0
        If for_Sum > 0 Then
           Timer1.Enabled = True
           Text2 = Timer
           Text2.Refresh
        ElseIf for_Sum = 0 Then
            Cmd_Dsend
        End If
    End Sub