我必须使用类似于Arduino的TI Launchpad板来实现Modbus TCP。我有以下代码段。
MbmByteArray[0] = 0x00;
MbmByteArray[1] = 0x01;
MbmByteArray[2] = 0x00;
MbmByteArray[3] = 0x00;
MbmByteArray[4] = 0x00;
MbmByteArray[5] = 0x0B;
MbmByteArray[6] = 0x01;
MbmByteArray[7] = 0x10;
MbmByteArray[8] = 0x00;
MbmByteArray[9] = 0x00;
MbmByteArray[10] = 0x00;
MbmByteArray[11] = 0x02;
MbmByteArray[12] = 0x04;
MbmByteArray[13] = 0x00;
MbmByteArray[14] = 0x08;
MbmByteArray[15] = 0x00;
MbmByteArray[16] = 0x00;
Serial.println("Written:");
for(int i=0;i<MbmByteArray[5]+6;i++) {
int a=0;
a = MbmClient.write(MbmByteArray[i]);
if(a)
{
// if something is written to the client I check what it is !
Serial.println(MbmByteArray[i]);
}
}
您可以看到不会连续接收字节。但我的整个数组就像是对客户端的命令。无论如何都有这样的方式:
2016-06-17 14:28:00.252:会话已创建
2016-06-17 14:28:00.254:会议开幕
2016-06-17 14:28:00.256:收到17个字节
00 01 00 00 00 0B 01 10 00 00 00 02 04 00 07 00 00
2016-06-17 14:28:00.269:发送12个字节
&LT; 00 01 00 00 00 06 01 10 00 00 00 02
请帮忙!
答案 0 :(得分:1)
通常,在任何给定的行,文件或媒体上进行通信时,您可能会分散数据。以太网实际上具有可以/将要不间断地传送的包大小(MTU)。但这是另一个故事。如果你处理这个问题,无论是协议,硬件还是平台,它会更好。 (或者至少要注意它。)
当您阅读ModbusTCP时,您应该使用以下伪代码:
//read all ModbusTCP header
while less than 6 bytes received and not timed out and not error
read bytes
//read data
data_length = modbustcp_header position 5 and 6
while less than data_length and not timed out and not error
read bytes
上述功能将在将“释放”到发动机之前收集整个包裹。该算法适用于您的设置的两个方面。 (德克萨斯州的hw和PC都有。)
您也可能(很可能)摆弄TI TCP堆栈并使其返回更大的块。我想这就是你要求的。但同样,我不建议走那条路。
答案 1 :(得分:0)
谢谢Illishar!
我找到了办法。在Arduino中有一个客户端函数,它可以发送整个数组而不会一次发送一个值。
byte command[17] = {0x00,0x01,0x00,0x00,0x00,0x0B,0x01,0x10,0x00,0x00,0x00,0x02,0x04,0x00,0x07,0x00,0x00};
MbmClient.write(command,17);
这个client.write(缓冲区,元素数量)帮助我在一个数据包中发送整个内容。它就像一个魅力:)