Hellmessage 发表于 2016-12-3 14:50:31

【HTML+JS控制Arduino】HTML+JS连接串口/wifi 实现控制Arduino

本帖最后由 Hellmessage 于 2016-12-3 14:58 编辑

不多说什么 直接上图:


其实呢 原理很简单 通过html调用系统组件:MSCOMM32.OCX
然后设置参数
<OBJECT id="MSComm1" CLASSID="clsid:648A5600-2C6E-101B-82B6-000000000014" codebase="MSCOMM32.OCX" type="application/x-oleobject"style="left:54px;top:14px" >
        <PARAM   NAME="CommPort"   VALUE="15"/><!--串口号 -->
        <PARAM   NAME="DataBits"   VALUE="8"/>
        <PARAM   NAME="StopBits"   VALUE="1"/>
        <PARAM   NAME="BaudRate"   VALUE="9600"/> <!-- 波率 -->
        <PARAM   NAME="Settings"   VALUE="9600,N,8,1"/><!-- 波率 -->
        <PARAM   NAME="RTSEnable"   VALUE="1"/>
        <PARAM   NAME="DTREnable"   VALUE="1"/>
        <PARAM   NAME="Handshaking"   VALUE="0"/>
        <PARAM   NAME="NullDiscard"   VALUE="0"/>
        <PARAM   NAME="ParityReplace"   VALUE="?"/>
        <PARAM   NAME="EOFEnable"   VALUE="0"/>
        <PARAM   NAME="InputMode"   VALUE="0"/>
        <PARAM   NAME="InBufferSize"   VALUE="1024"/>
        <PARAM   NAME="InputLen"   VALUE="0"/>
        <PARAM   NAME="OutBufferSize"   VALUE="512"/>
        <PARAM   NAME="SThreshold"   VALUE="0"/>
        <PARAM   NAME="RThreshold"   VALUE="1"/>
</OBJECT>

接着 声明一个function 用来接收和发送数据

<SCRIPT ID=clientEventHandlersJS LANGUAGE=javascript>
      function MSComm1_OnComm(){      
                switch(MSComm1.CommEvent){
                        case 1:{ window.alert("Send OK!"); break;}
                        case 2: { Receive();break;} //接收事件
                        default: alert("Event Raised!"+MSComm1.CommEvent);;
                }      
      }
</SCRIPT>
//每次执行完MSComm1 都会调用一次MSComm1_OnComm();
<SCRIPT LANGUAGE=javascript FOR=MSComm1 EVENT=OnComm>
      MSComm1_OnComm();
</SCRIPT>

然后js控制开关串口
<script type="text/javascript">      var Serial = $("#SerialName");
      var Begin = $("#SerialBegin");
      var ThisBtn = $("#openSerial");
      function OpenPort() {
                try {
                        var SerialName = Serial.val();
                        var SerialBegin = Begin.val();
                        if (SerialName == "" || isNaN(SerialName)) {
                              Serial.focus().val("");
                              return false;
                        }
                        if (SerialBegin == "" || isNaN(SerialBegin)) {
                              Begin.focus().val("");
                              return false;
                        }
                        MSComm1.CommPort = SerialName;
                        MSComm1.BaudRate = SerialBegin;
                        MSComm1.Settings = SerialBegin + ",N,8,1";
                        MSComm1.OutBufferCount = 0;
                        MSComm1.InBufferCount = 0;
                        MSComm1.PortOpen = true;
                        ThisBtn.addClass("openSerialBtnOn").val("关闭串口");
                        Serial.attr("disabled", "true");
                        Begin.attr("disabled", "true");
                } catch(ex) {
                        alert(ex.message);
                }
      }
      function ClockPort() {
                try {
                        MSComm1.OutBufferCount = 0;
                        MSComm1.InBufferCount = 0;
                        MSComm1.PortOpen = false;
                        ThisBtn.removeClass("openSerialBtnOn").val("打开串口");
                        Serial.removeAttr("disabled");
                        Begin.removeAttr("disabled");
                } catch(ex) {
                        alert(ex.message);
                }
      }
</script>


Log输出 和输入窗口代码:

<p class="center title">串口输出</p><textarea disabled="true" spellcheck="false" id="OnLog"></textarea>
<p class="center title">串口输入</p>
<textarea disabled="true" spellcheck="false" id="Tolog"></textarea>

<script type="text/javascript">      function Receive() {
                document.getElementById("OnLog").value += hexToString(MSComm1.Input) + "\n";
                document.getElementById('OnLog').scrollTop = document.getElementById('OnLog').scrollHeight;
      }
      function SendLog(data) {
                document.getElementById("Tolog").value += data + "\n";
                document.getElementById('Tolog').scrollTop = document.getElementById('OnLog').scrollHeight;
      }
</script>


js转码:

function stringToHex(str) {//字符串转16进制
    var val = "";
    for (var i = 0; i < str.length; i++) {
      if (val == ""){
            val = "0x"+str.charCodeAt(i).toString(16);
      } else {
            val += ",0x" + str.charCodeAt(i).toString(16);
      }
    }
    return val;
}

function hexToString(str) {//16进制转字符串 
    var val = "";
    var arr = str.split(",");
    for (var i = 0; i < arr.length; i++) {
      var now = arr.replace("0x","");
      val += String.fromCharCode(parseInt(now,16));//16进制先转成10进制 再用String.fromCharCode()转成字符串

    }
    return val;
}




Arduino 测试代码:

void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
if (Serial.available() > 0) {
      Serial.print(char(Serial.read()));
   }
}

有什么问题可以联系的QQ:617494454


源码下载地址(有些东西还没写好,后面会更新):链接:http://pan.baidu.com/s/1gfxAFHD 密码:ylsc


wetnt 发表于 2016-12-5 09:29:35

没太搞明白,有没有个数据流的框图?
页: [1]
查看完整版本: 【HTML+JS控制Arduino】HTML+JS连接串口/wifi 实现控制Arduino