以文本方式查看主题
- 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 您的意思要这么搞?
|