覺得能力就這樣了,想想別的辦法。就去搜帖子,查到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的方法和細節