zoukankan      html  css  js  c++  java
  • Windows Mobile 5.0下蓝牙移动打印测试

    项目硬件:针式移动便携式打印机(含蓝牙模块),一台手机(多普达S1)

    项目原理:首先让手机和打印机蓝牙连接后,在手机端为打印机建立一个发送端口,默认为 COM6,然后通过C#操作串口,向串口发送打印的数据(含打印机厂商内置的指令集)

    项目步骤:

    1.首先让手机和打印机蓝牙连接上,并建立发送端口,下面是转载的图:

        进入蓝牙设备管理界面,点击新建,用ppc搜索附近的蓝牙设备

        这时ppc便能搜索到处于待机状态的蓝牙打印适配器。

        接下来要做的工作大家十分熟悉,就是输入密匙进行匹配

        由于蓝牙打印适配器是通过虚拟串口与ppc之间建立连接的,所以ppc端会提示是否为打印适配器产生一个蓝牙串行端口

    智能手机无线打印完全攻略(三)

        输入蓝牙设备的名称后,整个匹配过程完成。

        然后我们要详细地设置蓝牙串口的传入和传出端口,对于打印,我们只要设置传出端口就行了,我就点击新建传出端口

        然后选择绑定到该端口的设备,当然就是我们前面刚刚匹配的蓝牙打印适配器了

        设置ppc上的传出端口为com6,当然你也可以设置成其他的端口号,只要你自己记得就行了。是不是安全连接倒不是很重要,可选可不选。

        设置完成后我们就在蓝牙com口的管理窗口中看到已经绑定在com6上的蓝牙打印适配器了

     

    2.接下来就是程序了,使用.net2.0 cf 里自带的一个类SerialPort,接下来是操作的串口的类了(下面有部分代码是打印机厂商提供的指令,不同厂商有不同的指令吧?):

     

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using System.IO.Ports;

    namespace BluetoothTest
    {
        
    public class Printer
        {
            SerialPort server 
    = new SerialPort();
            
    private string _portName = "COM6";//蓝牙一般默认为com6


            
    /// <summary>
            
    /// 获取或设置端口名称
            
    /// </summary>
            public string PortName
            {
                
    get 
                {
                    _portName 
    = server.PortName;
                    
    return _portName; 
                }
                
    set 
                {
                    _portName 
    = value;
                    server.PortName 
    = _portName;
                }
            }
            
    /// <summary>
            
    /// 端口是否已经打开
            
    /// </summary>
            public bool IsOpen
            {
                
    get 
                {
                    
    return server.IsOpen;
                }
            }
            
    /// <summary>
            
    /// 构造方法初始化串口参数
            
    /// </summary>
            public Printer()
            {
    //初始化各个参数
                server.BaudRate = 9600;//波特率
                server.Parity = 0;//校检位
                server.DataBits = 8;//数据位
                server.StopBits = StopBits.One;//停止位
                server.PortName = _portName;//端口名称
                server.WriteTimeout = -1;//超时时间
                server.ReadTimeout = -1;//超时时间
            }
            
    /// <summary>
            
    /// 打开端口
            
    /// </summary>
            
    /// <returns></returns>
            public bool OpenPort()
            {
                
    try
                {
                    
    if (!server.IsOpen)
                    {
    //关闭的
                        server.Open();
                    }
                    
    else
                    {
    //打开的
                        
    //server.Close();
                        
    //server.Open();
                    }
                    
    return true;
                }
                
    catch(Exception ex)
                { 
    return false; }
            }
            
    /// <summary>
            
    /// 发送数据
            
    /// </summary>
            
    /// <param name="str"></param>
            
    /// <returns></returns>
            public bool SendDataToPort(string str,out string mes)
            {
                
    try
                {
                    
    byte[] OutBuffer;//数据

                    
    int BufferSize;
                    Encoding targetEncoding;

                    



                    
    //将[UNICODE编码]转换为[GB码],仅使用于简体中文版mobile
                    targetEncoding = Encoding.GetEncoding(0);    //得到简体中文字码页的编码方式,因为是简体中文操作系统,参数用0就可以,用936也行。
                    BufferSize = targetEncoding.GetByteCount(str); //计算对指定字符数组中的所有字符进行编码所产生的字节数           
                    OutBuffer = new byte[BufferSize];
                    OutBuffer 
    = targetEncoding.GetBytes(str);       //将指定字符数组中的所有字符编码为一个字节序列,完成后outbufer里面即为简体中文编码

                    
    byte[] cmdData = new byte[BufferSize+100];

                    
    //初始化打印机
                    cmdData[0= 0x1B;
                    cmdData[
    1= 0x40;
                    
    //设置字符顺时旋转180度
                    cmdData[2= 0x1B;
                    cmdData[
    3= 0x56;
                    cmdData[
    4= 0;


                    
    for (int i = 0; i < BufferSize; i++)
                    {
                        cmdData[
    5 + i] = OutBuffer[i];
                    }


                    
    //向打印机发送[GB码]数据
                    server.Write(cmdData, 0, BufferSize + 5);
                    
    //server.WriteLine(str);

                    
    //初始化指令1B 40
                    cmdData[0= 0x1B;
                    cmdData[
    1= 0x40;
                    
    //打印并走纸指令
                    cmdData[2= 0x1B;
                    cmdData[
    3= 0x64;
                    cmdData[
    4= 0x02;

                    server.Write(cmdData, 
    05);
                    mes 
    = "";
                    
    return true;
                }
                
    catch(Exception ex)
                {
                    mes 
    = ex.Message;
                    
    return false;
                }
            }
            
    /// <summary>
            
    /// 十六进制转换字节数组
            
    /// </summary>
            
    /// <param name="s"></param>
            
    /// <returns></returns>
            private byte[] HexStringToByteArray(string s)
            {
                s 
    = s.Replace(" """);
                
    byte[] buffer = new byte[s.Length / 2];
                
    for (int i = 0; i < s.Length; i += 2)
                    buffer[i 
    / 2= (byte)Convert.ToByte(s.Substring(i, 2), 16);
                
    return buffer;
            }
            
    /// <summary>
            
    /// 字节数组转换十六进制
            
    /// </summary>
            
    /// <param name="data"></param>
            
    /// <returns></returns>
            private string ByteArrayToHexString(byte[] data)
            {
                StringBuilder sb 
    = new StringBuilder(data.Length * 3);
                
    foreach (byte b in data)
                    sb.Append(Convert.ToString(b, 
    16).PadLeft(2'0').PadRight(3' '));
                
    return sb.ToString().ToUpper();
            }

            
    public void ClosePort()
            {
                server.Close();            
            }
            
        }
    }

    3.接下在项目窗体上的使用,看看下面的代码:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace BluetoothTest
    {
        
    public partial class frmMain : Form
        {
            
    public frmMain()
            {
                InitializeComponent();
            }
            Printer printer 
    = new Printer();
            
    private void menuItem4_Click(object sender, EventArgs e)
            {
                
    //退出
                printer.ClosePort();
                Application.Exit();
            }

            
    private void menuItem2_Click(object sender, EventArgs e)
            {
                
    //打印
                if (tbxBody.Text.Length == 0)
                    
    return;

                setEnabled(
    false);
                
    if (!printer.IsOpen)//只有在端口关闭的时候才能设置
                    printer.PortName = drpPort.GetItemText(drpPort.SelectedItem);
                
    if (!printer.OpenPort())
                {
                    MessageBox.Show(
    "无法打开端口" + drpPort.GetItemText(drpPort.SelectedItem)); 
                }
                
    string mes = "";
                
    if (!printer.SendDataToPort(tbxBody.Text,out mes))
                {
                    MessageBox.Show(
    "发送数据失败" + drpPort.GetItemText(drpPort.SelectedItem) + "  " + mes); 
                }
                
                setEnabled(
    true);
                
            }
            
    private void setEnabled(bool b)
            {
                menuItem1.Enabled 
    = b;
                menuItem3.Enabled 
    = b;
            }
            
    private void frmMain_Load(object sender, EventArgs e)
            {
                
    //初始化
                drpPort.SelectedIndex = 1;
            }
        }
    }

    4.好了,在模拟器里生成,复制到手机里去,测试下。。。格式还要调试,郁闷,指令集都是以0x开通的,看起来头昏眼花的,等待下一步吧.....

  • 相关阅读:
    springcloud配置eureka后启动application失败原因Error starting Tomcat context. Exception: org.springframework.beans.factory.UnsatisfiedDependencyException. Message: Error creating bean with name 'trace
    Parameter index out of range (1 > number of parameters, which is 0
    mysql返回某月份的第一天
    mybatisplus的自定义sql使用方法及VO的使用
    mysql截取地址为城市名
    mybatisplus多表查询及自定义查询
    mybatisplus条件构造器wrapper
    HTTP 【值得你看个究竟】
    Kafka 【入门一篇文章就够了】
    notepad++ 删除末尾换行符
  • 原文地址:https://www.cnblogs.com/yunxizfj/p/1401698.html
Copyright © 2011-2022 走看看