1. 程式人生 > >[轉]js串列埠通訊 呼叫MSCOMM32控制元件 連結電子秤

[轉]js串列埠通訊 呼叫MSCOMM32控制元件 連結電子秤

本文轉自:https://www.cnblogs.com/x-j-p/p/7819724.html

硬體環境:RS232轉USB串列埠線*1

     電子秤*1(本人採用G&G E600Y-C型號稱重儀)

     電子秤原裝RS232資料線*1

     計算機*1

軟體環境:RS232轉USB串列埠線驅動(這個可以在串列埠線生產廠商官網網站下載,我用的是UNITEK生產的)

     windows7 (32位)

     MSCOMM32控制元件(這個在網上可以找到)

實現步驟:1,安裝MSCOMM32控制元件

       2,安裝RS232轉USB串列埠線驅動

       3,連結硬體(這裡注意:需要電子秤先連結原裝串列埠線,再用RS232轉USB串列埠線連結原裝串列埠線和電腦)

       4,開始編碼

編碼細節:

1,使用js初始化MSCOMM32控制元件

$(function(){
  initActiveX(); // 初始化控制元件方法
})
function initActiveX(){
  try {
    msComm1 = new ActiveXObject("MSCOMMLib.MSComm.1"); // 初始化MSCOMM控制元件
  }catch (err) {
     console.log(err); // 初始化失敗,列印錯誤
  }
  if ((typeof (msComm1) == "undefined") || (msComm1 == null)) { // 未初始化成功
    alert("msComm1 is null");
    return false;
  }else{ // 初始化成功
    configPort(); // 配置埠資訊
    searchAndOpenPort(); // 自動搜尋埠並開啟埠
    return false;
  }
}
2,配置串列埠資訊


function configPort(){ // 配置埠方法
  msComm1.settings = '9600,n,8,1'; // 9600:波特率 n:奇偶位 8:資料位 1:校驗位
  msComm1.OutBufferCount =0; //清空傳送緩衝區
  msComm1.InBufferCount = 0; //滑空接收緩衝區
  msComm1.RThreshold=14; //這個引數很重要,這個引數配置要符合硬體裝置 該引數表示接收硬體裝置多少位資料的時候觸發onComm事件
}
3,自動搜尋計算機串列埠並開啟串列埠(如果計算機連線兩個硬體,參考思路即可)
自動索搜計算機串列埠的思路:一般電腦最多隻有16個串列埠,依次遍歷所有串列埠,並向串列埠傳送訊息(我所用的裝置:要求稱重儀傳送一次資料,
傳送十進位制"27112"即可),如果接收到資料,那麼說明該串列埠是我們需要尋找的串列埠。
var com = 0; // 埠變數
var res = ''; // 接收硬體
function searchAndOpenPort(){
  if(msComm1.PortOpen == true){
    toggglePort(); // 關閉或者開啟埠
  }
  if(com > 16){ // 一般電腦只有16個埠
    com = 0;
    alert("未連線稱重儀!")
    return;
  }
  if(res != ''){ // res為接收到稱重儀的資料 後面會講到如何接收
    msComm1.CommPort = com - 1; // 設定串列埠為搜尋到的串列埠
    toggglePort();
    return;
  }
  msComm1.CommPort = com; // 設定串列埠
  var b = toggglePort(); // 開啟串列埠 並返回開啟結果
  if(b){
    send('27,112'); // 向串列埠傳送資訊
  }
  com += 1;
  setTimeout('searchAndOpenPort()', 500); // 間隔500ms等待接收資料 並實現迴圈,如果不間隔時間,受程式碼執行順序影響,將接受不到資料
}
4,開啟/關閉串列埠

說明:
msComm1.PortOpen = true; 表示開啟串列埠 如果等於false表示關閉串列埠
var statu = msComm1.PortOpen 表示獲取串列埠當前開關的狀態; statu == true表示當前開啟; statu == false表示當前關閉
function toggglePort(){
  if(msComm1.PortOpen == false){
    try {
      msComm1.PortOpen = true; // 開啟串列埠
      bindEvent(); //開啟串列埠後繫結串列埠收發事件
      return true;
    }catch(ex){
      console.log(ex);
      return false;
    }
  }else{
    try {
      msComm1.PortOpen = false; // 關閉串列埠
      return true;
    }catch(ex){
      alert(ex.message);
      return false;
    }
  }
}
5,接收/傳送串列埠訊息事件繫結
var bindEvent = function () {
  function msComm1::OnComm(){
    msComm1_event(); // 觸發收發事件後的處理方法
  }
}
6, 串列埠收發事件
function msComm1_event(){
  //console.log(msComm1.CommEvent); // 這個是在觸發收發事件後返回的標誌 1:表示傳送;
                       // 2:表示接受 
                       // 其他的標識線變等資訊(線變具體資訊需要參照MSCOMM的API)
  if(msComm1.CommEvent == 1){
    alert("Send OK!");
  }else if(msComm1.CommEvent == 2){
    Receive(); // 接收串列埠資訊方法
  }
}
7,接收串列埠資訊方法
function Receive() {
  var inputvalue = msComm1.Input; // 接收串列埠資訊
  // console.log("input:::" + inputvalue);
  if(inputvalue.indexOf("g")>0){ // 如果返回資料包含g
    res = $.trim(inputvalue.split("g")[0]); // 取得重量並賦值給res
  }
}
8,向串列埠傳送訊息
說明:串列埠不能接受十進位制資料,而js中又沒有char型別的資料,這裡我們用String.fromCharCode()方法將十進位制資料轉為char型別
function send(str){
  var cmd_send = '';
  try{
    var results = str.split(',');
    for(var i=0;i<results.length;i++) {
      cmd_send += String.fromCharCode(results[i]); // 十進位制轉char
    }
    msComm1.Output=cmd_send; // 向串列埠傳送訊息
  }catch(ex){
    console.log(ex.message);
  }
}
9,點選獲取稱重儀資料的方法
function getWeight(){
  if(com == '0'){
    alert("未連線稱重儀!")
  }else{
    send('27,112'); // 向串列埠傳送一次請求
    setTimeout("auto_weight_once()", 200); // 200ms後接收資料,這裡設定200ms後再獲取很有必要,這個是執行順序問題
  }
}
function auto_weight_once(){
  $("#weight").val(res); // 填充獲取的資料到頁面
}
10,稱重儀持續輸出資料的方法
function auto_weight(){
  // if(!continue_auto_weight){ // 這裡是結束持續輸出的標誌,至於什麼時候結束, 可根據專案而定
  // return;
  // }
  $("#weight").val(res);
  send('27,112');
  setTimeout("auto_weight()", 200);
}
小結:關於goole如何連線稱重儀,有時間再寫帖子。
最後:如果還不能解決問題,那麼就可能是ie瀏覽器的安全設定問題,這個網上很多參考,這裡就不贅述了。