以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  串口代码  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=29368)

--  作者:zhchn888
--  发布时间:2013/3/5 14:58:00
--  串口代码
 下面是一段串口的读数据代码。狐表中,数据类型没有variant类型,是否用object类型?如何将读到的数据写入数组?下面这段vb代码如何改成狐表的代码?谢谢
Private Sub MSComm1_OnComm() \'串口的消息响应函数
Select Case MSComm1.CommEvent \'串口事件
    Case comEvReceive \'接收到数据
    Dim Buffer As Variant \'存储数据的缓冲区
    Dim StringBuf(8) As String \'数据数组
  
    Buffer = MSComm1.Input \'清理接收缓冲区,此时,接收的字节数已经为0
    Dim I As Integer
    Dim CardNumber As Long \'卡号
    Dim CardNumber1 As Long
    Dim CardNumber2 As Long
    Dim CardNumber3 As Long
    Dim CardNumber4 As Long
    
    CardNumber3 = CDec(Buffer(4)) * 2 ^ 16 + (Buffer(5) * 2 ^ 8) + Buffer(6)
    CardNumber2 = (Buffer(5) * 2 ^ 8) + Buffer(6)
    CardNumber1 = CDec(Buffer(6))
    For I = 0 To 7
        StringBuf(I) = DecToHex(CDec(Buffer(I))) \'转换成十六进制
    Next

    If CDec(Buffer(3)) > 127 Then
        \'Buffer(3) = Buffer(3) And &HF
        Buffer(3) = Buffer(3) - &H70
        CardNumber4 = CDec(Buffer(3)) * 2 ^ 24 + CDec(Buffer(4)) * 2 ^ 16 + (Buffer(5) * 2 ^ 8) + Buffer(6)
        Text1.Text = "读卡日期:" & Date & Chr(13) & Chr(10) & _
                 "读卡时间:" & Time() & Chr(13) & Chr(10) & _
                 "十六进制数:" & StringBuf(2) & StringBuf(3) & StringBuf(4) & StringBuf(5) & StringBuf(6) & Chr(13) & Chr(10) & _
                 "4字节十进制卡号:" & "-" & Str(Trim(CardNumber4)) & Chr(13) & Chr(10) & _
                 "3字节十进制卡号:" & Str(CardNumber3) & Chr(13) & Chr(10) & _
                 "2字节十进制卡号:" & Str(CardNumber2) & Chr(13) & Chr(10) & _
                 "1字节十进制卡号:" & Str(CardNumber1) & Chr(13) & Chr(10)
    Else
        CardNumber4 = CDec(Buffer(3)) * 2 ^ 24 + CDec(Buffer(4)) * 2 ^ 16 + (Buffer(5) * 2 ^ 8) + Buffer(6)
        \'CardNumber4 = CDec(Buffer(3)) * 2 ^ 24 + CDec(Buffer(4)) * 2 ^ 16 + (Buffer(5) * 2 ^ 8) + Buffer(6)
        Text1.Text = "读卡日期:" & Date & Chr(13) & Chr(10) & _
                     "读卡时间:" & Time() & Chr(13) & Chr(10) & _
                     "十六进制数:" & StringBuf(2) & StringBuf(3) & StringBuf(4) & StringBuf(5) & StringBuf(6) & Chr(13) & Chr(10) & _
                     "4字节十进制卡号:" & Str(CardNumber4) & Chr(13) & Chr(10) & _
                     "3字节十进制卡号:" & Str(CardNumber3) & Chr(13) & Chr(10) & _
                     "2字节十进制卡号:" & Str(CardNumber2) & Chr(13) & Chr(10) & _
                     "1字节十进制卡号:" & Str(CardNumber1) & Chr(13) & Chr(10)
    End If
End Select

End Sub
Function DecToHex(DecNumber As Integer) As String \'转换成十六进制
        If DecNumber <= 15 Then
            DecToHex = "  0" & Hex(DecNumber)
        Else: DecToHex = "  " & Hex(DecNumber)
        End If
End Function


--  作者:狐狸爸爸
--  发布时间:2013/3/5 15:27:00
--  

是的,用object,不过vb.net已经提供了更简单的串口数据读取方法,你可以看看foxtable的帮助。


--  作者:zhchn888
--  发布时间:2013/3/5 15:56:00
--  
 帮助里我都仔细看了,读出来老是错误。传给label倒是没问题,关键要把它切割,转换时老出错。谢谢
--  作者:zhchn888
--  发布时间:2013/3/5 15:59:00
--  
也就是说,读出来的数据我怎么给他转换成16进制?我在摸索一下,感觉快出来了


--  作者:狐狸爸爸
--  发布时间:2013/3/5 16:04:00
--  

既然能读取数据就好办,至于转换出错,可以慢慢调试分析。

上面那些代码中用到的函数,vb.ne和foxtable都有。


--  作者:zhchn888
--  发布时间:2013/3/5 16:14:00
--  
 
图片点击可在新窗口打开查看此主题相关图片如下:未命名.bmp
图片点击可在新窗口打开查看


--  作者:zhchn888
--  发布时间:2013/3/5 16:14:00
--  
什么意思呢?


--  作者:狐狸爸爸
--  发布时间:2013/3/5 16:18:00
--  

if s isnot nothing then

    output.show(s.length)

end if


--  作者:zhchn888
--  发布时间:2013/3/5 16:25:00
--  
这回貌似对了,命令窗口中的程序
Dim s As object
s=ports("com7").ReadExisting()\'Forms("窗口1").Controls("Label1").text =
If s IsNot Nothing Then
    output.show(s.length)
End If
刷一下卡,出上图提示,确定,不管他
按执行,输出8,表示8个字节?

--  作者:zhchn888
--  发布时间:2013/3/5 16:26:00
--  

Dim cnt As Integer = Ports("COM2").BytesToRead
If
cnt > 0 Then \'缓冲区是否有数据
    Dim
Val(cnt - 1) As Byte
   
Ports("COM2").Read(val,0,cnt)
End If

您的意思要这么搞?