最近帮一个老师收尾一个射频卡项目,主要是应用层的,就是使用串口和单片机通信。但是这个要求很变态,需要使用Web来读写串口,但是我考虑自己写一个 ActiveX控件,但是用C++写一个纯COM+麻烦,后来看到有任用.NET来写ActiveX,但是要求客户端要装.NET FX,抓狂之下,找到了 MSCOMM32.OCX
![]()
Code
1
<html>
2
<head>
3
<title>JavaScript串口测试</title>
4
<meta http-equiv="Content-Type" content="text/html; charset=GB2312" />
5
6![]()
<SCRIPT ID=clientEventHandlersJS LANGUAGE=javascript>
7
<!--
8
function MSComm1_OnComm()
9![]()
{
10
switch(MSComm1.CommEvent)
11![]()
{
12![]()
case 1:
{ window.alert("Send OK!"); break;} //发送事件
13![]()
case 2:
{ Receive();break;} //接收事件
14
default: alert("Event Raised!"+MSComm1.CommEvent);;
15
}
16
}
17
//-->
18
19
</SCRIPT>
20
21![]()
<SCRIPT LANGUAGE=javascript FOR=MSComm1 EVENT=OnComm>
22
<!--
23
// MSComm1控件每遇到 OnComm 事件就调用 MSComm1_OnComm()函数
24
MSComm1_OnComm()
25
//-->
26
</SCRIPT>
27
28![]()
<script language="JavaScript" type="text/JavaScript">
29
<!--
30![]()
31![]()
String.prototype.Blength = function()
{
32
var arr = this.match(/[^\x00-\xff]/ig);
33
return arr == null ? this.length : this.length + arr.length;
34
}
35![]()
36
function OperatePort()
37![]()
{
38
if(MSComm1.PortOpen==true)
39![]()
{
40![]()
try
{MSComm1.PortOpen=false;
41
document.getElementById("OperateButton").value="打开串口";
42
}catch(ex)
43![]()
{alert(ex.message);}
44
}
45![]()
else
{
46![]()
try
{ MSComm1.PortOpen=true;
47
document.getElementById("OperateButton").value="关闭串口";
48
}catch(ex)
49![]()
{alert(ex.message);}
50
}
51
}
52
53
function ConfigPort()
54![]()
{
55
if(MSComm1.PortOpen==false)
56![]()
{
57![]()
try
{
58
MSComm1.CommPort=document.getElementById("ComName").value;
59
MSComm1.Settings=document.getElementById("BaudRate").value.toString()+
60
","+document.getElementById("CheckBit").value.toString()+
61
","+document.getElementById("DataBits").value.toString()+
62
","+document.getElementById("StopBits").value.toString();
63
MSComm1.OutBufferCount =0; //清空发送缓冲区
64
MSComm1.InBufferCount = 0; //滑空接收缓冲区
65
alert("已配置串口COM"+MSComm1.CommPort+"\n 参数:"+MSComm1.Settings);
66![]()
}catch(ex)
{alert(ex.message);}
67
}
68![]()
else
{ alert("请先关闭串口后再设置!");}
69
}
70
71
function Send()
72![]()
{
73
//alert(document.getElementById("txtSend").value);
74
var orgstr=document.getElementById("txtSend").value;
75
var newstr="";
76
var hexflag=document.getElementById("isSendHex").checked;
77
if(hexflag&&orgstr!="")
78![]()
{
79
if(orgstr.substr(0,2)=="0x"||orgstr.substr(0,2)=="0X") orgstr=orgstr.substring(2,orgstr.length);
80
if(orgstr.length%2!=0) orgstr="0"+orgstr;
81![]()
if((newstr=str2hex(orgstr,16))=="")
{alert("错误的16进制数");return false;}
82
}
83![]()
try
{
84
MSComm1.Output=hexflag?newstr:orgstr;
85
}catch(ex)
86![]()
{alert(ex.message);}
87
}
88
89
function Receive()
90![]()
{
91
//alert("InBufferCount::"+MSComm1.InBufferCount);
92
document.getElementById("txtReceive").value += MSComm1.Input;
93
//alert("InBufferCount::"+MSComm1.InBufferCount);
94
}
95
96
function ClearReceived()
97![]()
{
98
document.getElementById("txtReceive").innerText="";
99
}
100
101
-->
102![]()
103
</script>
104
105
</head>
106
<body>
107![]()
108
<form name="form1">
109![]()
110![]()
111
<fieldset style="width:200px;height:250px;text-align:center;">
112
<legend>配置串口</legend>
113
<div style="float:left;width:200px">
114
<br/>
115
<span>串口号:</span>
116
<select name="ComName" id="ComName" style="width:75px" >
117
<option value="1" >COM1</option>
118
<option value="2" >COM2</option>
119
<option value="3" selected >COM3</option>
120
<option value="4" >COM4</option>
121
</select>
122
<br/>
123
<span>波特率:</span>
124
<select name="BaudRate" id="BaudRate" style="width:75px" >
125
<option value="9600" selected >9600</option>
126
<option value="57600" >57600</option>
127
<option value="115200" >115200</option>
128
</select>
129
<br/>
130
131
<span>校验位:</span>
132
<select name="CheckBit" id="CheckBit" style="width:75px" >
133
<option value="N" selected >无NONE</option>
134
<option value="O" >奇ODD</option>
135
<option value="E" >偶EVEN</option>
136
</select>
137
<br/>
138
139
<span>数据位:</span>
140
<input type=text id="DataBits" name="DataBits" value=8 style="width:75px;height:20px">
141
<br/>
142
143
<span>停止位:</span>
144
<input type=text id="StopBits" name="StopBits" value=1 style="width:75px;height:20px">
145
<br/>
146
<br/>
147
<input type="button" id="ConfigButton" style="width:80px;height:30px;font-size:13px" name="ConfigButton" value="配置串口" onClick="ConfigPort()">
148
<input type="button" id="OperateButton" style="width:80px;height:30px;font-size:13px" name="OperateButton" value="打开串口" onClick="OperatePort()">
149
</div>
150
</fieldset>
151![]()
152![]()
153![]()
154
<fieldset style="width:200px;height:250px;text-align:center;">
155
<legend>发送区域</legend>
156
<div style="float:left;">
157
<textarea id="txtSend" name="txtSend" style="width:200px;height:160px"></textarea>
158
<br/>
159
<span><input id="isSendHex" name="isSendHex" type="checkbox" checked="0" />16进制</span>
160
<input type="button" id="SendButton" style="width:100px;height:30px" name="SendButton" value="发送" onClick="Send()">
161
</div>
162
</fieldset>
163![]()
164
<fieldset style="width:200px;height:250px;text-align:center;">
165
<legend>接收区域</legend>
166
<div style="float:left;">
167
<textarea id="txtReceive" READONLY=TRUE name="txtReceive" style="width:200px;height:160px"></textarea>
168
<br/>
169
<span><input id="isReceiveHex" name="isReceiveHex" type="checkbox" />16进制</span>
170
<input type="button" id="ClearButton" style="width:100px;height:30px" name="ClearButton" value="清空" onClick="ClearReceived()">
171
</div>
172
</fieldset>
173![]()
174![]()
175![]()
176![]()
177
</form>
178
179
<OBJECT id=MSComm1 CLASSID="clsid:648A5600-2C6E-101B-82B6-000000000014"
180
codebase="MSCOMM32.OCX" type="application/x-oleobject" style="LEFT:54px;TOP:14px" >
181
<PARAM NAME="CommPort" VALUE="3"/>
182
<PARAM NAME="DataBits" VALUE="8"/>
183
<PARAM NAME="StopBits" VALUE="1"/>
184
<PARAM NAME="BaudRate" VALUE="9600"/>
185
<PARAM NAME="Settings" VALUE="9600,N,8,1"/>
186![]()
187
<PARAM NAME="RTSEnable" VALUE="1"/>
188
<PARAM NAME="DTREnable" VALUE="1"/>
189
<PARAM NAME="Handshaking" VALUE="0"/>
190
<PARAM NAME="NullDiscard" VALUE="0"/>
191
<PARAM NAME="ParityReplace" VALUE="?"/>
192
193
<PARAM NAME="EOFEnable" VALUE="0"/>
194
<PARAM NAME="InputMode" VALUE="0"/>
195
<PARAM NAME="InBufferSize" VALUE="1024"/>
196
<PARAM NAME="InputLen" VALUE="0"/>
197
<PARAM NAME="OutBufferSize" VALUE="512"/>
198
199
<PARAM NAME="SThreshold" VALUE="0"/>
200
<PARAM NAME="RThreshold" VALUE="1"/>
201![]()
202
</OBJECT>
203
204
205
</body>
206
</html>
![]()
Code
1 <script language="JavaScript">
2
3 var share1=String.fromCharCode(0xFF);
4
5 </script>
6
7
8
9 <script language="VBScript">
10
11 sub vbsend
12
13 Dim s(0)
14
15 s(0)=&HEE
16
17 MSComm1.Output=CHRW(&HFF)
18
19 end sub
20
21 </script>
22
23 <input type="button" onclick="vbscript:vbsend" value="VBTest" >
简单的HTML+JS代码:


1

2

3

4

5

6



7

8

9



10

11



12



13



14

15

16

17

18

19

20

21



22

23

24

25

26

27

28



29

30

31



32

33

34

35

36

37



38

39



40



41

42

43



44

45



46



47

48

49



50

51

52

53

54



55

56



57



58

59

60

61

62

63

64

65

66



67

68



69

70

71

72



73

74

75

76

77

78



79

80

81



82

83



84

85

86



87

88

89

90



91

92

93

94

95

96

97



98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

但是有一个问题,使用脚本的方式调用MSCOMM32 ,发送单字节的 数据不能超过 7FH,这个问题如果在强类型的 VB中,可以以字节数组的方式发送,凡是在script中,都是弱类型的,尝试了各种办法,甚至还Javascript和VBsvript混合使用,使用 VBS的各种 字符串操作函数,最终没有解决。
如果大家找到方法,请告诉我啊!
测试代码:


1 <script language="JavaScript">
2
3 var share1=String.fromCharCode(0xFF);
4
5 </script>
6
7
8
9 <script language="VBScript">
10
11 sub vbsend
12
13 Dim s(0)
14
15 s(0)=&HEE
16
17 MSComm1.Output=CHRW(&HFF)
18
19 end sub
20
21 </script>
22
23 <input type="button" onclick="vbscript:vbsend" value="VBTest" >