c# - POS协议(protocol)串口通讯

标签 c# embedded serial-port

我有一个收银机,我试图通过 C# 进行通信(我没有使用 .NET 的 POS)。
基本上我想让它从我的应用程序数据库中提取项目。

于是收银机通过串口将这个字符串发送到应用主机:
• 命令:项目搜索包

Command Short Description:          "Searches PC for a PLU code" 

Data Send Example Format:           ?/1234567890123/

“/”是数据包字段分隔符。数字是要搜索的项目的条形码。 “?”是个
数据包描述符,表示这是一个请求项目信息的数据包。

我必须回复一个回复数据包
Reply Packet Format:    "1/ITEM DESCRIPTION/1200.00/0.00/1/" if the item exists in the host database

或者
"0/"  if it does not exist in which it will search its internal memory for it

并且协议(protocol)规定了通信规则:
ECR/POS    HOST COMPUTER

Idle    
               Idle
Enquire(ENQ)    
               Acknowledge(ACK) 
Packet("?/1234567890123/")  
               Acknowledge(ACK) 
               Packet("1/ITEM DESCRIPTION/1200.00/0.00/1/")
Acknowledge(ACK)    
Idle    
               Idle

ENQ、ACK 是 ASCII 控制码。如果数据包没有正确制作,我会返回 NAK。

字段规范如下:
==== Field 1:       Found flag
Type:           FLAG
Length:         1
Notes:          This flag must be zero when item could not be found
            in the database, else (if found) it must be set to
            one. In the 1st case, the rest of the fields must
            not be sent. 

==== Field 2:       Item description
Type:           STRING
Length:         Variable, 1-20 characters
Notes:          The PLU description for the requested code

==== Field 3:       Item unit price
Type:           AMOUNT
Length:         Default
Notes:          This is the unit price for the requested code

==== Field 4:       Item discount amount
Type:           AMOUNT
Length:         Default
Notes:          This is an auto-discount value for this PLU

==== Field 5:       Department
Type:           INTEGER
Length:         1
Notes:                  It is the department index which the PLU belongs

我希望它从主机应用程序中获取价格。
问题是寄存器接受我的响应数据包是有效的(它通过串行端口发回 ACK)但在它自己的 LCD 屏幕上我得到“错误:不存在的项目”。好像我已经发送了一个“0”标志。我不知道问题是什么。我很绝望。

事情是收银机向主机询问价格,如果找不到,它会查询它自己的内部存储器(最多可存储 4000 个项目)。如果我在内部存储器中手动存储一个项目,我可以从主机应用程序更改它的属性(价格、描述等)。

我什至无法以编程方式在内部存储器中添加项目,尽管我也从串行协议(protocol)通信中获得了“OK”(ACK)。这样我就可以以编程方式添加项目并让它从自己的内部存储器中提取它们。

我可以手动存储每个项目,然后如果它存在于内部存储器中,我可以更改它,但是我希望从主机应用程序(更改价格、描述等)。然后它可以得到我在内部存储器中为它设置的价格。不过这真的很乏味。我最初必须手动存储一次所有内容,并且我有 2 个相同类型的收银机。我想要的是在内部不存储任何内容,而是从主机中提取所有内容。

请帮忙。我没主意了。

编辑:这是我嗅出的数据包捕获
#      TIME          PORT      DATA                                            ASCII
000044 13:52:03.437  COM2   >> 05                                              .
000045 13:52:03.437  COM2   << 06                                              .
000046 13:52:03.453  COM2   >> 02 30 31 2F 30 31 2F 32 2F 30 30 2F 3F 2F 39 39 .01/01/2/00/?/99
                               39 20 20 20 20 20 20 20 20 20 20 2F 31 2F 34 38 9          /1/48
                               03 06                                           ..
000049 13:52:03.453  COM2   << 06 02 30 31 2F 30 31 2F 32 2F 30 30 2F 31 2F 54 ..01/01/2/00/1/T
                               45 53 54 20 49 54 45 4D 20 2F 30 30 30 30 2E 36 EST ITEM /0000.6
                               36 2F 30 2E 30 30 2F 31 2F 33 36 03             6/0.00/1/36.

“01/01/2/00/”部分是在线数据包头,包括机器索引号,职员等。每个数据包以0x02(STX)开始,以0x03(ETX)结束。 last 之前的字段是数据包校验和编号,如果我弄错了,它会发回 NAK。

即使我弄错了字段,它似乎也会发回 ACK。它只是检查校验和。
协议(protocol)在这里 https://rapidshare.com/files/1772287788/DL_Protocol.doc

* 更新:*

它的行为似乎很奇怪。我可以写入其内部存储器(存储项目)并修改任何现有项目的字段,但项目的条形码除外。我只存储我想要的 4000 个索引中的任何一个。
但是,如果我从外部(从它自己的键盘)进入收银机的菜单到项目存储子菜单,请按“存储新项目”,然后在“销售”屏幕上返回,而实际上根本没有存储任何东西,只是一直取消,它实际上存储了下一次的每个字段。也就是说,它还存储我给它的下一个 Set_PLU() 命令的条形码(与之前未能存储条形码的命令完全相同),无论它是新记录还是修改旧记录(基本上是我给出的索引位置它)。

有趣的是,当我进入“商店新项目菜单”时,它会给我一个新的条形码来输入。如果我键入一个,它会自动将其存储在下一个可用索引中。我只是取消而不输入任何内容。下一个 Set_PLU() 命令适用于我选择的任何索引,即使它不是下一个可用的索引。可以是较旧的,在这种情况下,它会修改所有内容或大于下一个。

每次我需要存储产品时都必须这样做真的很烦人。这是什么?

最佳答案

在阅读了您的规范和数据后,我认为最后缺少斜线。在您的规范中,您写道:

Reply Packet Format:    "1/ITEM DESCRIPTION/1200.00/0.00/1/" if the item exists in the host database

但是在您在线上的裸数据中,我会看到:
1/TEST ITEM /0000.66/0.00/1/36

所以也许最后一个斜线根本就不见了。最后一个参数是PLU所属的部门索引。也许这个数字对收银机显示的内容也有一些影响。

更新

好吧,这只是一个尝试。现在我唯一想到的就是一个问题:“你有一个系统能够正确地将某些东西传输到寄存器吗?”如果是,您可以将其连接到机器的第二个串行端口并编写一个小程序,该程序仅在两个 com 端口之间传输数据并将它们另外写入文件。因此,您可以检查其他系统正在发送的数据,或者制造商有一个演示应用程序,您可以从中嗅探它发送的确切数据。

最后但并非最不重要的一点是向制造商寻求一些指导,因为他应该知道数据必须看起来准确(也许通过给你一个例子?)。

顺便说一句,你已经嗅探了一些串行数据,所以你应该有一个应用程序。我最喜欢的是Free Serial Port Monitor .

关于c# - POS协议(protocol)串口通讯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8299761/

相关文章:

javascript - 如何在每个动态创建的 ImageButton 周围包裹一个超链接? Visual Studio

c# - 使用ajax的跨服务器web服务

c# - 发送表格彼此相邻的 outlook 电子邮件

c# - 添加 Controller 时无法检索模型的元数据

c - C 中的位设置/清除?

linux - 连接到 STN1110

c++ - usleep vs std::this_thread::sleep_for,在 linux 串行端口上写入/读取时

c - 在 C 中匹配(几个)字符串的最有效方法?

c - 如何将 C 代码制作成 MISRA C :2012 compliance?

c# - 串行端口事件的可视化工具(用于发送和接收的数据)