web串口通訊

最近項目需要讀取串口數據,就研究了下。剛開始用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的方法和細節

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章