2010-03-15 86 views
14

我正在C#中构建基本的销售点(POS)系统,该系统需要打印到收据打印机并打开收银机。我必须使用Microsoft Point of Service SDK吗?写作POS系统的最佳实践

我一直在玩打印到我的三星打印机使用它随附的Windows驱动程序,它似乎很好。我假设其他打印机可​​能没有Windows驱动程序,然后我会卡住?或者我能否简单地使用通用/文本驱动程序打印到支持它的任何打印机?

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

我在这里走错了路吗?

+11

我有很多POS系统有史以来一天的工作! – ChaosPandion 2010-03-15 16:42:48

+1

过去5年发布的打印机是否没有Windows驱动程序? – jmucchiello 2010-04-06 15:18:48

回答

0

从快速浏览的MS销售点系统基于Window Embedded,这实际上只是一种降低单位成本和缩小Windows操作系统许可证的方法。看起来有一些特定于POS的API,但您似乎想要推出自己的API,您仍可能想要以某种方式使用Windows Embedded。安全将可能是工作1.

1

我从来没有以编程方式处理你所问的,但我有一些经验,当涉及到POS系统可以帮助你。

您对打印和收银机所做的工作高度依赖于您正在使用的硬件。那里有各种各样的硬件。

在每一个POS系统,我所看到的,也有针对每一个可以想象的收据打印机和钱箱驱动器的群众,所以,除非你正在开发一个完全成熟的系统,只是专注于你要具体的硬件与...合作。即便如此,也要尽可能将代码考虑在内,以便最大化战略模式的优势。如果您使用的设备类型不止一种,那么稍后您会感谢您以这种方式实施。


印刷,有3种基本类型的打印机,你可能会遇到:

    只能打印文本(过时,但仍然存在)
  1. 凭条打印机
  2. 凭条打印机,可以打印图形
  3. 打印8.5" ×11" 的整版发票/贷记凭证的标准打印机(容易,“这份厚礼说)

我相信大部分(如果不是全部的话)现代收据打印机属于第2类,但您可以使用第1类打印机运行到旧系统。

对于类别#2,您应该能够使用标准的.NET打印界面。唯一的问题可能是在适当的时间发送控制代码以激活切割机构(如果配备的话);或者,打印机驱动程序可能会根据打印算法中指定的纸张长度自动执行此操作。再次,我从来没有尝试过这种方式,但如果您有权使用收据打印机,那么您应该能够快速掌握这些内容。

如果您正在处理的是拥有#1类打印机的单个客户端,那么您可以很好地争辩说,购买类别#2中的新打印机将比购买新款打印机便宜得多开发一个死锁的驱动程序来打印他们现有的硬件。


对于钱箱,我比用打印机不太熟悉,但我知道的两个选项,只要通信和硬件配置:

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

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

6

这可能是一个稍微不同的答案,你正在寻找(!)...

与“外部接口”(例如打印机,点钞机等绘制)总是抽象的事物工作时。您可能想实施策略 - Pattern Strategy

您为现金抽奖的接口

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实现。随着时间的推移,您可能会有多种方式与不同的外部设备进行连接。客户可能会得到一个新的现金抽奖等等等。

这是明确的,我可以充实我的意思,如果你想,但你可能会得到我的漂移。

您的应用程序在启动时将自己设置为相应的实现,您可能还想看看Dependency injection以及如果使用container来解析类型,您会发现更容易。

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

PK :-)