14

我正在用 C# 构建一个基本的销售点 (POS) 系统,该系统需要打印到收据打印机并打开现金抽屉。我是否必须使用 Microsoft 服务点 SDK?

我一直在尝试使用随附的 Windows 驱动程序打印到我的三星打印机,它似乎工作得很好。我假设其他打印机可​​能不附带 Windows 驱动程序,然后我会被卡住?或者我可以简单地使用通用/文本驱动程序打印到任何支持它的打印机吗?

对于现金抽屉,我需要将代码直接发送到 COM 端口,这对我来说很好,如果这样可以省去帮助客户在系统上设置 OPOS 驱动程序的麻烦。

我在这里走错路了吗?

4

4 回答 4

6

这可能与您正在寻找的答案略有不同(!)......

当使用“外部接口”(例如打印机、现金提取等)时,总是抽象的东西。您可能想要实施策略——模式策略

您为现金提取制作了一个界面:

public interface ICashDrawer
{
    void Open();
}

提供的实现:

  • 一种策略是使用 COM 打开抽奖的类
  • 另一个是简单的Debug.WriteLine调用类,因此您在开发过程中不需要将现金提取连接到您的 PC

例如

public class ComPortCashDrawer : ICashDrawer
{
    public void Open()
    {
        // open via COM port etc
    }
}

public class DebugWriterCashDrawer : ICashDrawer
{
    public void Open()
    {
        Debug.WriteLine("DebugWriterCashDrawer.Open() @ " + DateTime.Now);
    }
}

同样对于打印,您有一个打印接口来获取数据:

public interface IRecieptPrinter
{
    bool Print(object someData);
}

然后你做一个或多个实现。

  • 基本打印机
  • 专业标签打印机
  • 一种基于文本的保存到文件的...

例如

public class BasicRecieptPrinter : IRecieptPrinter
{
    public bool Print(object someData)
    {
        // format for a basic A4 print
        return true; // e.g. success etc
    }
}

public class SpecificXyzRecieptPrinter : IRecieptPrinter
{
    public bool Print(object someData)
    {
        // format for a specific printer
        return true; // e.g. success etc
    }
}

public class PlainTextFileRecieptPrinter : IRecieptPrinter
{
    public bool Print(object someData)
    {
        // Render the data as plain old text or something and save 
         // to a file for development or testing.
        return true; // e.g. success etc
    }
}

关于 SDK,如果您发现出于某种原因需要它,您可以使用 SDK 编写实现。随着时间的推移,您最终可能会通过多种方式与不同的外部设备进行交互。客户可能有一天会获得新的现金提款等。

这清楚吗,如果你愿意,我可以充实我的意思,但你可能明白我的意思。

您的应用程序在启动时设置了各自的实现,您可能还想看看依赖注入,如果您使用容器来解析类型,您会发现事情更容易。

var printer = container.Resolve<IRecieptPrinter>();

PK :-)

于 2010-03-24T05:15:24.507 回答
1

我从来没有以编程方式处理过您的要求,但是在可能对您有所帮助的 POS 系统方面,我确实有一些经验。

您为打印和收银机所做的工作在很大程度上取决于您使用的硬件。那里有各种各样的硬件。

在我见过的每一个 POS 系统中,每一个可以想象的收据打印机和现金抽屉都有大量驱动程序,所以除非你正在开发一个成熟的系统,否则只需专注于你将要使用的特定硬件。即使这样,也要尝试很好地分解您的代码,以便最大限度地利用策略模式的好处。如果您正在使用不止一种类型的设备,您稍后会感谢自己以这种方式实现它。


对于打印,您可能会遇到 3 种基本类型的打印机:

  1. 只能打印文本的收据打印机(过时,但仍然存在)
  2. 可以打印图形的收据打印机
  3. 打印 8.5" x 11" 整页发票/贷项通知单的标准打印机(简单,'nuff 说)

我相信大多数(如果不是全部)现代收据打印机都属于第 2 类,但您可能会使用第 1 类的打印机遇到遗留系统。

对于类别 #2,您应该能够使用标准的 .NET 打印接口。唯一的问题可能是在适当的时间发送控制代码以激活切割机构(如果配备);或者,打印机驱动程序可能会根据打印算法中指定的纸张长度自动执行此操作。再说一次,我从来没有试过这个,但如果你可以使用收据打印机,你应该能很快弄清楚这些东西。

如果您正在与拥有#1 类打印机的单个客户打交道,那么您可以提出一个很好的论点,即购买#2 类新打印机的成本会低于为开发一个死机而支付的费用。 -end 驱动程序在其现有硬件上打印。


对于现金抽屉,我不像打印机那么熟悉,但就通信和硬件安排而言,我知道两种选择:

  1. 通过打印机通过 LPT 端口连接。(电缆链:电脑 --> 打印机 --> 钱箱)
  2. 通过 COM/LPT 端口或现代的 USB 直接连接到计算机。

第一种通过向打印机端口发送控制代码(打印机希望忽略并且不会吐出整卷收据纸)来操作,而第二种则需要进行 COM 端口通信。在任何一种情况下,控制代码都是依赖于硬件的。大多数时候它们都可以在用户手册中找到,但有时技术作家那天感觉特别糟糕,你必须去网上挖掘。

于 2010-03-24T04:28:18.953 回答
0

只需快速浏览一下,MS 销售点系统就基于 Window Embedded,这实际上只是一种获得更低单位成本和更小的 Windows 操作系统许可证的方法。似乎有一些特定于 POS 的 API,但您似乎想推出自己的 API,您可能仍然希望以某种方式使用 Windows Embedded。安全可能是工作 1。

于 2010-03-17T02:08:35.557 回答
0

要直接控制收据打印机,请阅读ESC/POS 命令。这些命令将允许您打开现金抽屉并在收据上打印条形码和图像。

但是,由于您使用 C#,使用Microsoft Point of Service 类库可能更容易。

于 2010-03-24T22:30:14.177 回答