硬件環境:RS232轉USB串口線*1windows
電子秤*1(本人採用G&G E600Y-C型號稱重儀)瀏覽器
電子秤原裝RS232數據線*1安全
計算機*1網站
軟件環境:RS232轉USB串口線驅動(這個能夠在串口線生產廠商官網網站下載,我用的是UNITEK生產的)編碼
windows7 (32位)spa
MSCOMM32控件(這個在網上能夠找到)事件
實現步驟:1,安裝MSCOMM32控件get
2,安裝RS232轉USB串口線驅動input
3,連接硬件(這裏注意:須要電子秤先連接原裝串口線,再用RS232轉USB串口線連接原裝串口線和電腦)cmd
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瀏覽器的安全設置問題,這個網上不少參考,這裏就不贅述了。