小程序蓝牙打印

做小程序连接蓝牙打印机一块,最后打印这块网上找了很多都没碰到我遇到的问题。可能是大家都没遇到过吧hhh,主要遇到以下几个问题。

  1. 蓝牙打印中文乱码
  2. 不能一次传输完所有包,比如说一行“123456789” 部分机型能够全部传输完成,而有的机型传到“7”就不会传,打印出来的结果就是“1234567”,不能完全打印完整
  3. 蓝牙不能打印,调用API成功无报错

第一个问题的答案,经过我查找相关资料,以及询问蓝牙厂商那边主要是由于编码问题。我这边蓝牙打印机仅支持GB2312编码,以下上代码。

//混杂
function hexStringToBuff(str){ //str='中国:WXHSH'
  const buffer = new ArrayBuffer((sumStrLength(str)) + 1)
  const dataView = new DataView(buffer)
  var data=str.toString();
  var p = 0;  //ArrayBuffer 偏移量
  for(var i=0;i 8) { //大于8
    for (var i = 0; (i * 8) < str.length; i++) {
      var temp = str.substring(i * 8, 8 * i + 8);
      arr.push(temp)
    }
    return arr;
  }else{
    return str
  }
}

//不带有汉字
function hexStringToArrayBufferstr(str){
  let val = ""
  for (let i = 0; i < str.length; i++) {
    if (val === '') {
      val = str.charCodeAt(i).toString(16)
    } else {
      val += ',' + str.charCodeAt(i).toString(16)
    }
  }
  val += "," + "0x0a";
  console.log(val)
  // 将16进制转化为ArrayBuffer
  return new Uint8Array(val.match(/[\da-f]{2}/gi).map(function (h) {
    return parseInt(h, 16)
  })).buffer
}

第一个方法混杂解决问题,有个主意的地方冒号为英文状态下的冒号。否则将会解析成中文状态就不在某个编码的行列,会造成乱码。第一个方法主要的构造是逐字符解析,中文就调用GBK方法,转成GBK然后转十六进制放进arraybuffer,否则不进行处理直接转十六进制然后放进arraybuffer。第二个第三个都是我中途实验的方法也采用了网上的一些,对于某些打印机可以直接调用第三个方法。

 

第二个问题是在解决第一个问题后,测试的时候不同的机型出现的。按照我们嵌入式开发工程师这边说的,机型传输包的长度不一致,就回导致传输不完整造成。

//开始打印数据  data  需要打印的数据
function send(data,callback){
  var arr = subString(data);
  for(var j=0;j

在发送数据的时候,八个字符为一次发送。发送完成之后,最后调用了一次发送“0X0A”的方法。

第三个问题在最开始就遇到了,小程序给我的回调是成功了的,但是蓝牙打印机没有任何打印。最后询问嵌入式开发同事,告诉我加上0x0a就会打印。实际上数据已经发送出去,只是没有打印。0x0a换行,具体缘由不了解 略过略过略过...会用就行

 

以上特别感谢我公司嵌入式开发同事的帮助。

如果有其他朋友正好碰到以上问题,希望能够帮到你们。

蓝牙连接打印机等以上代码就不上了,网上有很多例子~

gbk转码文件附上,但是有个问题就是必须要分。这个我控制不了~我想免费的没办法

https://download.csdn.net/download/qq_36479244/11146541

你可能感兴趣的:(微信小程序)