C# 通过MODBUS与串行IP通信?

C# 通过MODBUS与串行IP通信?,c#,winforms,sockets,serial-port,modbus,C#,Winforms,Sockets,Serial Port,Modbus,这是一个奇怪的问题,我们有一个带有IP的打印机设置和它监听的端口,然后我们需要将打印作业发送到打印机 我已成功连接到打印机,但每当我传输任何内容时,打印机就会超时,或者它只是坐在那里无所事事 我知道我可以和打印机对话,因为它显示在日志中 到目前为止,我有以下几点: _Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); _Socket.Connect("192.168.1.52",

这是一个奇怪的问题,我们有一个带有IP的打印机设置和它监听的端口,然后我们需要将打印作业发送到打印机

我已成功连接到打印机,但每当我传输任何内容时,打印机就会超时,或者它只是坐在那里无所事事

我知道我可以和打印机对话,因为它显示在日志中

到目前为止,我有以下几点:

_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
_Socket.Connect("192.168.1.52", 2123);
byte Enq = 0x05;
byte Ack = 0x06;
byte[] tran;
tran = new byte[] { Enq };
_Socket.Send(tran, 1, SocketFlags.None);

tran = new byte[] { 0x30 };
_Socket.Send(tran, 1, SocketFlags.None);

tran = new byte[] { 0x00, 0x01 };
_Socket.Send(tran, 2, SocketFlags.None);

tran = new byte[] { 0xFF };
_Socket.Send(tran, 1, SocketFlags.None);
send 1 byte Identifier 30h
send 2 bytes length 00h, 01h
send data (action to be performed) 1 byte FFh
根据手册,我需要执行以下操作:

_Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
_Socket.Connect("192.168.1.52", 2123);
byte Enq = 0x05;
byte Ack = 0x06;
byte[] tran;
tran = new byte[] { Enq };
_Socket.Send(tran, 1, SocketFlags.None);

tran = new byte[] { 0x30 };
_Socket.Send(tran, 1, SocketFlags.None);

tran = new byte[] { 0x00, 0x01 };
_Socket.Send(tran, 2, SocketFlags.None);

tran = new byte[] { 0xFF };
_Socket.Send(tran, 1, SocketFlags.None);
send 1 byte Identifier 30h
send 2 bytes length 00h, 01h
send data (action to be performed) 1 byte FFh
正如你可能看到的,我不知道如何实现这一点,所以欢迎任何人的帮助

Edit
一些附加信息,打印机没有附带驱动程序,因此从我可以告诉你的情况来看,我需要将原始数据传输到打印机,打印机有一个串行连接到它,但是对于串行电缆来说它太远,因此在那里有以太网连接(我相信它是通过以太网串行连接的)

对话的一般原则 计算机发送ENQ(1字节)打印机发送ACK(1字节) 计算机发送数据(标识1字节|长度2字节|数据0到n字节|校验和1字节) 打印机发送确认(1字节)

当我过去使用串行时,我在端口上使用写函数来发送数据,将数据放入缓冲区,一旦完成接收,检查缓冲区,但我不知道如何在IP上执行此操作

Identifier (1 hexadecimal byte)
Specific to each command.
 Length (2 hexadecimal bytes)
The length is a hexadecimal value representing the number of bytes present after the
two length bytes and not including the check byte (Checksum).
In general, the maximum value is 2044 bytes or 07h FCh.
For transmission of a message for printing, the maximum value is 4092 bytes or 0Fh
FCh.
Note: The check byte is not checked by the printer if b7 of the first length byte is set
to 1. In this case the data in the frame received is not checked.
Data (0 to n bytes)
Zero bytes for a general request from the computer to the printer.
n bytes representing the instructions needed to define a function.
Checksum (1 hexadecimal byte)
This corresponds to an exclusive OR of all preceding bytes (identifier, length and data
bytes

我将系统改为使用TCPClass而不是插座,现在它可以按预期工作,他们的技术人员没有用,但至少他们的首席销售人员来帮助解决打印机的其他问题,最终成功实现了目标。所有这些都归结为文档中缺少的信息

“winforms”、“modbus”或“串行端口”与这个问题有什么关系?我可以看到,也许您有一个通过TCP实现的串行协议,我可以想象您的程序可能恰好是基于WinForms的,但Modbus从何而来?我从来没有听说过Modbus打印机,你肯定没有实现Modbus协议。为什么你自己处理所有这些低级通信?为什么你称这一个为“奇怪的一个”?@Gabe我相信这是Modbus与我有限的经验,但我不确定,因此?@DuSijun,因为我需要,这对我来说是一个奇怪的一个为什么你发送0x05,如果手册没有提到它?您确定协议类型是IP而不是TCP吗?您确定SocketType是Stream而不是Dgram吗?我不知道如果没有手册,怎么会有人回答这个问题。