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的方法和细节
- web串口通讯
- 串口通讯
- 串口通讯
- 串口通讯
- 串口通讯
- 串口通讯
- 串口通讯
- 串口通讯
- 串口通讯
- 串口通讯
- 串口通讯
- 串口通讯
- 串口通讯
- 串口通讯
- 通讯串口
- 串口通讯
- 串口通讯
- 串口通讯
- C++ string类常用函数
- Oracle数据库系统中实例名(即instance_name)和ORACLE_SID的区别
- Hadoop Namenode 无法启动 总结一
- 【LeetCode】Trapping Rain Water 2013年美团网校园招聘研发工程师笔试题
- CODE 96: Sudoku Solver
- web串口通讯
- android面试题:请描述下Activity的生命周期
- 生活中的两个经济学原理
- ActionBar(2) 标题和渐变背景设置
- 快速排序(quick sort)
- Iphone 手机助手 Plist 文件详解 (一)
- c++ 根据输入动态声明数组(一维,二维)
- RETE算法介绍
- 军报宣传我核潜艇部队重提甲午海战和致远号