mscomm,JavaScript 控制 MSComm

首先想到的是直接发送,但二进制似乎是有点问题,先尝试基本的asc字符发送,如果可以的话,就电脑InputMode用0,外设的用1,也就是电脑不用二进制,外设用二进制,基于中间过程没有数据类型,什么数据都可以传输。后来发现,大于127的字符不可以发送或接收,那就只可以从二进制那里着手。
二进制先尝试接收,测试的时候两台电脑连接,一台电脑模拟外设,在电脑上运行 sscom ,本机就用控件来进行接收。很快发现,接收的时候分两次?且在alert显示时没有东西,在input处却看得到?一次显示大的“口”,另一次是空?
code:
strInput = MSComm1.Input;
if (strInput == "") {return false;}
alert("r:" + strInput + "; Type:" + typeof(strInput));//这里显示不了东西,就是 r:;后面是空的
fldWeight.value = strInput;//到了这里却可以得到一次大“口”,还连续接接收了两次,但第二次为空?
POINT:经过这里首先明白到,因为文本框控件的特性,能将十六进制数转换成Unicode!
由于外面传进来的数据进入javascript环境的时候,接收了MSComm.Input并用typeof来检测其类型时,显示的是“unknow”,所以事情更加一头露水。
想到利用Unicode,就用escape把转过来的数据转换成Unicode来看看,可以得到输入的值
输入:5A A5;escape编码后:%uA55A
输入:5A A5 01;escape编码后:%uA55A%01
到这里,已可以实现基本的数据接收了。再来研究数据发送。
数据发送原本也想可以举一反三,但结果有点出我意外。如果我想外设接收到5A A5的话,我用"\uA55A"发送应该可以了吧?可 sscom 那里却显示 3F!又是一阵苦恼。试了几下,发现直接用asc码里面的东西发,sscom那边可以顺利变成对应的16进制数,可一量asc超过128的话,就不行了,要用Unicode的显示方式,更要命的是,sscom 那边发A5过来,这边网页显示“¥”,编码后是%A5 ,可用相同东西“\xA5”发过去 sscom 那边显示 A3 A4,这应该是javascript这边的问题,把“¥”和“¥”同化了?但想了一下不对,记事本可以显示不同的格式,那为什么网页那边编辑的时候不可以,想起来我的工具是EditPlus,可能问题就出现在这里?也不对那为什么“\xA5”也不可以?晕了!
后来也试过用vbscript来看看能不能解决问题,可是超过7f的话就返回25,也是不可以突破。
最后只有外设那边改协议,所有的东西都不可以超过7F。
期间的练习代码,以供参考:
<HTML>
<HEAD>
<TITLE></TITLE>
<SCRIPT LANGUAGE="JavaScript">
function OpenPort(){
if (!MSComm1.PortOpen){
MSComm1.PortOpen = true;
}else{
alert("Port already opened !");
}
}
function ClosePort(){
if (MSComm1.PortOpen){
MSComm1.PortOpen = false;
}else{
alert("Port already closed !");
}
}
//把十进制数换成相应的16进制转
function d2x(x)
{
var temp = 0;
var ftable = new Array("0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F");
x = x.split(" ");
for (var i = 0; i < x.length; i++)
{
temp = parseInt(x);
x = ftable[Math.floor(temp / 16)] + ftable[temp % 16];
}
return x.join(" ");
}
function d2xs(x)
{
var temp = 0;
var ftable = new Array("0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F");
temp = parseInt(x);
x = ftable[Math.floor(temp / 16)] + ftable[temp % 16];
return x;
}
//接收用,字符串转成十六进制展示
function string2x(str)
{
var temp = "";
//str = str.split(" ");
for(var i = 0; i < str.length; i++)
{
if (isAsc(str.charAt(i)))
{
temp += d2xs(str.charCodeAt(i)) + " ";
}else{
temp += esca(str.charAt(i)) + " ";
}
}
//alert(temp);
temp = temp.slice(0,-1);
//temp = d2x(temp);
return temp;
}
function isAsc(str)
{
var reg = /[\x00-\x7F]/g;
return (str.match(reg) != null);
}
function esca(cha)
{
var c = escape(cha);
c = c.replace("%u","");
c = c.charAt(2) + c.charAt(3) + " " + c.charAt(0) + c.charAt(1);
return c;
}
function Send(){
//var v = eval("0x" + frmView.txtWeight.value) + "";
var v = frmView.txtWeight.value;
//alert(eval("0x" + frmView.txtWeight.value) + "")
MSComm1.Output = unescape(v);
//alert("设置了发送资料:" + v);
//alert(MSComm1.RThreshold);
}
var data = {
//计算穴位 0x59 0x58 0x01 0x02 时间(7B) SUM
//时间 7B \x02\x00\x00\x07\x09\x06\x09\x45
//返回穴位 0x41 0x42 穴位号(1B,范围=0-59) SUM 如 %
cp:"%59%58%01%02",
rp:"%u4241",
//开始治疗 0x59 0x58 0x03 0x04 强度(1B,范围=1-9) 时间(1B,单位=分钟) SUM
startMsg:"%59%58%03%04",
startStrength:new Array("%01","%02","%03","%04","%05","%06","%07","%08","%09"),
//startTime:
//终止治疗 0x59 0x58 0x05 0x06
endMsg:"\x59\x58\x05\x06",
//查询状态 0x59 0x58 0x07 0x08
check:"\x59\x58\x07\x08",
checkInfoBegin:"%u4241",//状态号(1B) SUM 如:%u0001
dateGet:function (y,m,d,h){
y = "%0" + y.charAt(0) + "%0" + y.charAt(1) + "%0" + y.charAt(2) + "%0" + y.charAt(3);
m = "%" + (m.length == 1)?"0" + m:m;
d = "%" + (d.length == 1)?"0" + d:d;
h = "%" + (h.length == 1)?"0" + h:h;
return y+m+d+h
},
sumList:function (str){
str = str.split("%");
var sum = 0;
for (var i=1; i < str.length; i++)
{
sum += parseInt(str);
}
return "%" + d2xs(sum % 100) + "" + d2xs(Match.floor(sum / 100));
}
}
function MSComm1_OnComm(vv) {
var fldWeight = frmView.txtWeight ;
var strInput = fldWeight.value;
switch (MSComm1.CommEvent)
{
case 1:
break;
case 2:
strInput = MSComm1.Input;
if (strInput == "") {return false;}
te.value = strInput;
if (te.va != ""){
te.v = te.value;
}else{
te.value = te.v;
}
alert(string2x(te.value));
vv(string2x(te.value));
fldWeight.focus();
break;
}
}
function a(v){alert(v + " IN a");}
</SCRIPT>
<SCRIPT LANGUAGE=javascript FOR=MSComm1 EVENT=OnComm>
<!--
MSComm1_OnComm(a);
//-->
</SCRIPT>
</HEAD>
<BODY>
<input type="text" style="display:none" id="te" >
<OBJECT CLASSID="clsid:648A5600-2C6E-101B-82B6-000000000014"
id=MSComm1 codebase="MSCOMM32.OCX" type="application/x-oleobject"
style="LEFT: 54px; TOP: 14px" style="display:none" >
<PARAM NAME="_ExtentX" VALUE="1005">
<PARAM NAME="_ExtentY" VALUE="1005">
<PARAM NAME="_Version" VALUE="393216">
<PARAM NAME="CommPort" VALUE="1">
<PARAM NAME="DTREnable" VALUE="-1">
<PARAM NAME="Handshaking" VALUE="0">
<PARAM NAME="InBufferSize" VALUE="1024">
<PARAM NAME="InputLen" VALUE="0">
<PARAM NAME="NullDiscard" VALUE="0">
<PARAM NAME="OutBufferSize" VALUE="512">
<PARAM NAME="ParityReplace" VALUE="63">
<PARAM NAME="RThreshold" VALUE="1">
<PARAM NAME="RTSEnable" VALUE="0">
<PARAM NAME="BaudRate" VALUE="9600">
<PARAM NAME="ParitySetting" VALUE="0">
<PARAM NAME="DataBits" VALUE="7">
<PARAM NAME="StopBits" VALUE="0">
<PARAM NAME="SThreshold" VALUE="0">
<PARAM NAME="EOFEnable" VALUE="-1">
<PARAM NAME="Settings" VALUE="9600,N,8,1">
<PARAM NAME="InputMode" VALUE="1"></OBJECT>
<FORM action="" method=post id=frmView name=frmView>
<P>
<INPUT id=txtWeight name=txtWeight style="LEFT: 50px; TOP: 17px"></P>
<P> </P>
<P>
<BUTTON _disibledevent=>
<BUTTON _disibledevent=>
<BUTTON _disibledevent=>
</P>
<P>
</P>
</FORM>
</BODY>
</HTML>
Tags:  mscomm1 mscomm32 mscomm控件 mscomm

延伸阅读

最新评论

发表评论