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开通的,看起来头昏眼花的,等待下一步吧.....

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值