您的位置:首页 > 编程语言 > C语言/C++

C++ Builder如何使用蓝牙打印机

2015-07-04 12:17 806 查看
Android作为一个面向手机和平板的操作系统,主要擅长娱乐和通信方面的应用,由于接口方面的限制,对于其它外部设备的支持不是很强,而且多数外设生产厂商也不支持Android系统。

    所幸的是,几乎所有智能手机都带有蓝牙功能,只要遵循特定的通信协议,我们可以通过蓝牙功能,调用所有支持蓝牙的外部设备。

    打印机是最常见的外部设备,而其中的小票打印机,广泛应用于超市收银、票据、回执打印,是商务应用不可或缺的组成部分。下面就以群索QS5803蓝牙热敏小票打印机为例,说明C++ Builder XE7如何调用它进行打印。



一、与打印机进行配对
    与任何蓝牙设备进行通讯之前,必须与其进行配对。打开群索QS5803打印机电源,在Android系统中点“设置->蓝牙”,可以搜索到该设备的名称QSPrinter,选择,输入配对密码,默认为“0000”,具体可参看说明书。

二、获取系统中已经配对的蓝牙设备

  1. 打开C++ Builder XE7,新建一个Android工程,添加头文件以支持蓝牙功能
    #include <System.Bluetooth.hpp>

  2. 通过蓝牙管理器对象,获取本机已配对的蓝牙设备

    放置一个组合框ComboEdit1和一个按钮Button1,用于填充蓝牙设备名称

[cpp] view
plaincopy

void __fastcall TMainForm::Button1Click(TObject *Sender)  

{  

    TBluetoothManager *FBluetoothManager = TBluetoothManager::Current; //得到本机蓝牙管理器  

    TBluetoothAdapter *FAdapter = FBluetoothManager->CurrentAdapter; //得到本机蓝牙设备  

  

    if(FBluetoothManager->ConnectionState == TBluetoothConnectionState::Connected) //如果有并且打开了蓝牙设备  

    {  

        Memo1->Lines->Add(L"得到本机蓝牙设备: '" + FBluetoothManager->CurrentAdapter->AdapterName + L"'");  

  

        ComboEdit1->Clear();  

        TBluetoothDeviceList *FPairedDevices = FBluetoothManager->GetPairedDevices(); //得到已配对设备列表  

        if(FPairedDevices->Count > 0)  

        {  

            for(int i = 0; i < FPairedDevices->Count; i++)  

            {  

                ComboEdit1->Items->Add(FPairedDevices->Items[i]->DeviceName);  

            }  

            if(ComboEdit1->Count > 0)  

                ComboEdit1->ItemIndex = 0;  

        }  

        else  

        {  

            Memo1->Lines->Add(L"无配对设备");  

        }  

    }  

    else //无蓝牙设备或者未打开  

    {  

        Memo1->Lines->Add(L"本机没有或未打开蓝牙设备");  

    }  

}  

三、获取设备中提供的服务

    每个蓝牙设备都提供有一个或若干个服务,用不同的UUID字符串表示。需要获取该服务,才能与蓝牙设备通讯。

    放置第二个组合框ComboEdit2和一个按钮Button2,用于填充该设备的服务名称

[cpp] view
plaincopy

void __fastcall TMainForm::Button2Click(TObject *Sender)  

{  

    ComboEdit2->Clear();  

    if(ComboEdit1->ItemIndex > -1)  

    {  

        TBluetoothDevice * LDevice = FPairedDevices->Items[ComboEdit1->ItemIndex];  

        TBluetoothServiceList * LServices = LDevice->GetServices(); //获取该已配对设备提供的服务  

        for(int i=0; i<LServices->Count; i++)  

        {  

            ComboEdit2->Items->Add(GUIDToString(LServices->Items[i].UUID));  

        }  

        if(ComboEdit2->Count > 0)  

            ComboEdit2->ItemIndex = 0;  

    }  

    else  

    {  

        ShowMessage(L"请在已配对列表中选择一个设备");  

    }  

}  

四、连接打印机

[cpp] view
plaincopy

UnicodeString strServiceGUID = ComboEdit2->Items->Strings[ComboEdit2->ItemIndex]; //服务GUID  

  

TBluetoothDevice * LDevice = FPairedDevices->Items[ComboEdit1->ItemIndex];  

Memo1->Lines->Add(L"准备连接服务:" + strServiceGUID);  

Memo1->GoToTextEnd();  

  

FSocket = LDevice->CreateClientSocket(StringToGUID(strServiceGUID), false); //建立与蓝牙设备的Socket通讯  

if(FSocket != NULL)  

{  

    try  

    {  

        FSocket->Connect();  //连接  

  

        BluetoothReadTH = new TBluetoothReadTH(false, FSocket); //创建读数据线程  

  

        Memo1->Lines->Add(L"连接Socket成功!");  

        Memo1->GoToTextEnd();  

    }  

    catch(...)  

    {  

        delete FSocket;  

        FSocket = NULL;  

  

        Memo1->Lines->Add(L"连接Socket失败!");  

        Memo1->GoToTextEnd();  

    }  

  

}  

else  

{  

    ShowMessage(L"发送超时(15秒)");  

}  

五、发送数据并打印

    根据该打印机的通讯协议,发送要打印的内容和控制命令

[cpp] view
plaincopy

//发送打印内容  

TBytes ToSend = TEncoding::ANSI->GetBytes(AnsiString(Edit1->Text));  

FSocket->SendData(ToSend);  

Memo1->Lines->Add(L"发送数据:" + Edit1->Text);  

Memo1->GoToTextEnd();  

  

//打印并走纸一行命令  

TBytes bt;  

bt.set_length(1);  

bt[0]=0x0D;  

FSocket->SendData(bt);  

六、关于打印图像

    需要将图片转换成yuv数组,其中只取y部分组成新的数组,其中数组的内容转换成0,1,大于0的部分全是1,小于零的部分全是0,将数组进行打包,通过左移操作,每八个转换成一个新的byte字节组成新的数组,打印内容每行576个像素(80mm打印机,如果是58mm打印机则为384像素),其中通过左移操作,每八个转成一个字节实际上每行也就成为48个byte,其中在打印每行的时候需要加入头数组,头数组为4个字节,加入头数组
    bytehead[0] = (byte) 0x1f;
    bytehead[1] = (byte) 0x10;
    bytehead[2] = (byte) (mWidth / 8); //其中mWidth为宽度576
    bytehead[3] = (byte) 0x00; //将新生成的数组通过蓝牙传递给打印机。

七、总结

    打印操作是一个比较耗时的过程,上面代码只是简单示例,在实际应用中,应该将读写蓝牙数据放在线程中进行。具体内容详见示例程序:
    http://download.csdn.net/detail/realbay/8689849

    打印机网址:
    http://detail.1688.com/offer/36926154653.html?spm=a2615.2177701.0.0.UcjyXR

    示例程序效果如下:



转载:http://blog.csdn.net/realbay/article/details/45666701
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ Builder XE