web串口通讯

来源:互联网 发布:hash算法有哪些 编辑:程序博客网 时间:2024/06/13 07:14
最近项目需要读取串口数据,就研究了下。刚开始用java ,java提供的javacomm20-win32工具读取串口数据,不晓得怎么回事,我的电脑往串口发送数据后死活接收不到数据,后来在网上搜了下,有一款开源的java读取串口的框架RXTX,地址:http://users.frii.com/jarvi/rxtx/download.html。后来发现这样不行,我们的软件是B/S的,需要在页面上串口通讯,就想到用applet,试了试,总是报错,可能自己的技术不过关。找了些帖子和例子,好是好了,但总是不稳定,而且我的电脑可以,别人的电脑总不行。

觉得能力就这样了,想想别的办法。就去搜帖子,查到Windows自带的控件mscomm32.ocx控件可以用js进行串口通讯,就去网上找资料和例子。但是这样还是遇到好多问题,页面上不能正确加载mscomm32.ocx,找不到对象,通过修改ie设置、删除了原来的注册表信息重新注册和一些其他的操作,费了好大劲才搞定,可以正常打开端口和监听oncomm事件了。但是在发送和接收数据时遇到问题了,我们用的设备传输和接收都是十六进制字节流的,而在js中mscomm1.output只能用字符串,接收input也是字符串,导致我一直接收不到准确的数据(我发送的什么,串口给返回什么)。不晓得为什么,可能数据就没发送到串口就直接返回来了,自己这样理解的不知道正确不。可是怎么传输字节呢(在java中用的是字节数组传输的),在一哥们的帖子中看到希望..(http://anole1982.iteye.com/blog/905403)。于是自己就安装了vb,生成了ocx控件,又搜了打包cab的资料,终于搞成了,加入页面,但是结果还是一样。当时那个郁闷啊,而这时项目有赶得紧,怎么办了。

一想,既然能自己写控件为何不自己做一个调comm的ocx控件呢,于是开始找资料。参考别人的例子自己做了个ocx。代码贴上

Public resultData As String
Public flag As Integer
 
Public Function MsCommUtil(commPort, settings, params) 
resultData = ""
flag = 0 
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False '关闭端口 
End If 
MSComm1.commPort = commPort ' 设置通信端口号为COM1 
MSComm1.settings = settings ' 设置串口1参数 
MSComm1.InBufferSize = 1024 '设置MSComm1接收缓冲区为1024字节 
MSComm1.OutBufferSize = 1024 '设置MSComm1发送缓冲区为1024字节 
MSComm1.InputMode = comInputModeBinary ' 0 接收文本型数据 1 字节数据 
MSComm1.InputLen = 0 '设置Input 一次从接收缓冲读取全部字节数 
MSComm1.SThreshold = 1 '设置发送完所有产生OnComm事件 
MSComm1.InBufferCount = 0 '清除接收缓冲区 
MSComm1.OutBufferCount = 0 '清除发送缓冲区 
MSComm1.RThreshold = 1 '设置接收缓冲区每收到一个字符都会使 MSComm 控件触发OnComm 事件 
MSComm1.RTSEnable = True
MSComm1.DTREnable = True
MSComm1.PortOpen = True ' 打开通信端口1 
MSComm1.Output = senddata(params) 
'MSComm1.PortOpen = False '通信结束,关闭端口 
MsCommUtil = "1"
End Function
 
'把A1 01 0D 转成字节数组发给mscomm 
Public Function senddata(ss) 
Dim arr() As Byte
Dim s, i, leng 
leng = Len(ss) \ 3 
s = Split(ss, " ") 
ReDim arr(leng) As Byte
For i = 0 To leng 
arr(i) = Val("&H" & s(i)) 
Next i 
senddata = arr 
End Function
'MSComm 的 OnComm 事件程序 
'由 CommEvent 属性值的不同,将各自的程序代码写入相关的子程序中 
'只要 RThresold 中的设定字符数到达时便会使得 CommEvent 属性值变成 comEvReceive 
'因此接收的子程序便会被执行 
Private Sub MSComm1_OnComm() 
Select Case MSComm1.CommEvent 
Case comEvReceive 
Dim send() As Byte
send() = MSComm1.Input '接收 
Dim i As Integer
Dim s As String
For i = 0 To UBound(send()) 
tmpHex = Hex(send(i)) 
s = s & IIf(send(i) < &H10, "0" & tmpHex, tmpHex) & " "
Next i 
resultData = resultData & s 
Case comEvEOF 
flag = 1 
'MSComm1.PortOpen = False 
Exit Sub
End Select
End Sub

当然,写的不怎么好,不过解决了燃眉之急,后面的再说优化了。

发送和接受都是十六进制。后面有打包cab的方法和细节

 

原创粉丝点击