【问题标题】:Why can't opos find my cash drawer using common controls?为什么 opos 无法使用常用控件找到我的钱箱?
【发布时间】:2015-10-10 07:47:15
【问题描述】:

this guy was having a problem 大致相同,我遇到了类似的问题...

我的钱箱通过一个 RJ11(我认为它是 11...)连接到我的打印机,这是一个 Partner RP-600 Thermal Printer

我的打印机工作正常,但我无法打开钱箱。

基本上我对这应该如何工作的想法(基于我有限的理解是这样的:

  1. 打开打印机
  2. 索赔打印机
  3. 启用打印机
  4. 打开钱箱
  5. 领取现金抽屉
  6. 启用钱箱
  7. 打开硬件抽屉

我尝试了多种方法,但出现以下错误:

OPOS_E_CLOSED = 101,但最常见
OPOS_E_NOEXIST = 109

如果我将它设置为drawer.Open("rp-600 printer"),我会得到OPOS_E_ILLEGAL = 106

我的代码如下:

    using OPOSCONSTANTSLib;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using OposPOSPrinter_CCO;
    using OposCashDrawer_CCO;

    namespace PosPrinterTest
    {
        public partial class Form1 : Form
        {
        private OPOSPOSPrinterClass printer = null;
        private OPOSCashDrawerClass drawer = null;
        public Form1()
        {
            InitializeComponent();

            printer = new OPOSPOSPrinterClass();
            drawer = new OPOSCashDrawerClass();

            _IOPOSPOSPrinterEvents_StatusUpdateEventEventHandler SUEH =
                new _IOPOSPOSPrinterEvents_StatusUpdateEventEventHandler(
                    PrinterStatusUpdateHandler);
            printer.StatusUpdateEvent += SUEH;

            _IOPOSCashDrawerEvents_StatusUpdateEventEventHandler DSUEH = new _IOPOSCashDrawerEvents_StatusUpdateEventEventHandler(CashDrawerStatusUpdateHandler);
            drawer.StatusUpdateEvent += DSUEH;
        }

        private void AddList(object listline)
        {
            listBox1.Items.Add(listline);
            listBox1.SelectedIndex = listBox1.Items.Count - 1;
        }

        private void OpenCashDrawer()
        {
            AddList("+Open drawer");

            int Result = drawer.Open("rpd");
            AddList(String.Format("  1-Open drawer: RC = {0}", Result));
            Result = drawer.ClaimDevice(1000);
            AddList(String.Format("  2-Claim drawer: RC = {0}", Result));
            drawer.DeviceEnabled = true;
            Result = drawer.ResultCode;
            AddList(String.Format("  3-Enable drawer: RC = {0}", Result));
            Result = drawer.OpenDrawer();
            AddList(String.Format("  4-Open drawer: RC = {0}", Result));

            AddList(String.Format("-Open drawer: {0}", ((Result == (int)OPOS_Constants.OPOS_SUCCESS) ? "Succeeded" : "Failed")));
            AddList(String.Empty);
        }

        private void CloseCashDrawer()
        {
            AddList("+Close drawer");

            int Result = drawer.ReleaseDevice();
            AddList(String.Format("  Release drawer: RC = {0}", Result));
            AddList("-Release drawer: " + ((Result == (int)OPOS_Constants.OPOS_SUCCESS) ? "Succeeded" : "Failed"));

            Result = drawer.Close();
            AddList(String.Format("  Close drawer: RC = {0}", Result));
            AddList("-Close drawer: " + ((Result == (int)OPOS_Constants.OPOS_SUCCESS) ? "Succeeded" : "Failed"));
            AddList(String.Empty);
        }

        private void Print()
        {
            AddList("+Print");

            int Result = printer.PrintNormal(2, "\x1B|cA\x1B|2COPOS POSPrinter\x1B|1C\nvia Microsoft.NET\n\n");

            AddList(String.Format("  Print: BC = {0}", Result));
            AddList(String.Format("-Print: {0}", ((Result == (int)OPOS_Constants.OPOS_SUCCESS) ? "Succeeded" : "Failed")));

            Result = printer.CutPaper(100);
            AddList(String.Format("  Cut: BC = {0}", Result));
            AddList(String.Format("-Cut: {0}", ((Result == (int)OPOS_Constants.OPOS_SUCCESS) ? "Succeeded" : "Failed")));
            AddList(String.Empty);
        }

        private void OpenPrinter()
        {
            AddList("+Open printer");

            int Result = printer.Open("rp-600 printer");
            AddList(String.Format("  Open: RC = {0}", Result));

            if (Result == (int)OPOS_Constants.OPOS_SUCCESS)
            {
                Result = printer.ClaimDevice(1000);
                AddList(String.Format("  Claim printer: RC = {0}", Result));

                if (Result == (int)OPOS_Constants.OPOS_SUCCESS)
                {
                    printer.DeviceEnabled = true;
                    Result = printer.ResultCode;
                    AddList(String.Format("  Enable printer: RC = {0}>", Result));
                }
            }
            AddList(String.Format("-Open: {0}", ((Result == (int)OPOS_Constants.OPOS_SUCCESS) ? "Succeeded" : "Failed")));
            AddList(String.Empty);
        }

        private void ClosePrinter()
        {
            AddList("+Close printer");

            int Result = printer.ReleaseDevice();
            AddList(String.Format("  Release printer: RC = {0}", Result));
            AddList("-Release printer: " + ((Result == (int)OPOS_Constants.OPOS_SUCCESS) ? "Succeeded" : "Failed"));

            Result = printer.Close();
            AddList(String.Format("  Close printer: RC = {0}", Result));
            AddList("-Close printer: " + ((Result == (int)OPOS_Constants.OPOS_SUCCESS) ? "Succeeded" : "Failed"));
            AddList(String.Empty);
        }

        private void PrinterStatusUpdateHandler(int nStatus)
        {
            AddList("  P StatusUpdate: " + nStatus);
        }

        private void CashDrawerStatusUpdateHandler(int nStatus)
        {
            AddList(String.Format("  CD Status Update: {0}", nStatus));
        }

        private void btnTender_Click_1(object sender, EventArgs e)
        {
            //OpenPrinter();
            //Print();
            //ClosePrinter();

            OpenCashDrawer();
            CloseCashDrawer();
        }
    }
}

如您所见,我在 OpenCashDrawer() 中指定的设备名称与我在 opos 中设置的设备名称相同。

那么我做错了什么导致 opos 无法找到钱箱?

【问题讨论】:

  • 抽屉和打印机是独立的设备,您无需打开/领取打印机即可使用抽屉。此外,如果您还没有安装,请尝试安装常用控件对象(位于此处:monroecs.com/oposccos_current.htm)。
  • @JoshAnderson 澄清一下,您知道现金抽屉没有连接到电脑,而是连接到打印机,对吧?因为我仍然收到 109 错误代码
  • 我知道,那些钱箱可能很讨厌。刚刚看到您的最新编辑,我以为您使用的是 Microsoft 的 .Net POS,而不是直接使用公共控件类。我对它们不太熟悉,但是有没有一种方法可以枚举每个已安装的特定类型的设备,看看它是否出现?也可能是 _drawer.Open() 方法需要一个服务对象名称,而不是逻辑设备名称。
  • 看起来在 OPOSCashDrawerClass 中没有这样的方法

标签: c# opos


【解决方案1】:

您的屏幕截图显示现金抽屉 LDN 是“rp-cashdrawer”,但您的代码使用的是“rpd”。

drawer.Open("rpd");

您应该使用已配置的 LDN 打开设备,例如:

drawer.Open("rp-cashdrawer");

【讨论】:

  • 虽然这是一个有效的观点,但无法打开现金抽屉的原因是因为我需要一个特定的现金抽屉驱动程序。一旦我明白了,代码就起作用了(在我在 .Open() 方法中定位正确的设备之后。
猜你喜欢
  • 2023-03-24
  • 2018-07-03
  • 2017-04-06
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多