解决Invalid return value 0 for stream protocol

如果不使用文件作为输入,而是使用自定义的(内存)输入流,会看到此运行时警告。

解决方法:在读取函数中  如果输入流(内存数据),读取完毕返回-1。出现Invalid return value 0 for stream protocol的原因就是无有效数据时,返回的时0.

int read(void *opaque, unsigned char *buf, int buf_size)
{
    // 如果输入流(内存数据),读取完毕返回-1
    // 如果还未到输入流结尾,则返回实际读取数据长度!
}

 

好的,以下是一个使用Python实现Modbus TCP通信的示例类: ```python import socket class ModbusTCP: def __init__(self, ip_address, port): self.ip_address = ip_address self.port = port self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.socket.connect((self.ip_address, self.port)) def read_coils(self, start_address, quantity): # Modbus function code for reading coils is 0x01 function_code = 0x01 # Build Modbus request message message = bytearray([0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, (start_address >> 8) & 0xFF, start_address & 0xFF, (quantity >> 8) & 0xFF, quantity & 0xFF]) # Send Modbus request message and receive response response = self._send_message(message, function_code) # Extract coil states from response and return as list of booleans coil_states = [bool(response[9 + i//8] & (1 << (i % 8))) for i in range(quantity)] return coil_states def write_coil(self, address, value): # Modbus function code for writing a single coil is 0x05 function_code = 0x05 # Convert value to 0xFF00 or 0x0000 value = 0xFF00 if value else 0x0000 # Build Modbus request message message = bytearray([0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x05, (address >> 8) & 0xFF, address & 0xFF, (value >> 8) & 0xFF, value & 0xFF]) # Send Modbus request message and receive response self._send_message(message, function_code) def _send_message(self, message, function_code): # Modbus transaction identifier is just set to 0x00 transaction_id = 0x00 # Modbus protocol identifier is 0x0000 for Modbus TCP protocol_id = 0x0000 # Length of message is length of message field plus 6 bytes for header length = len(message) + 6 # Build Modbus TCP header header = bytearray([transaction_id >> 8, transaction_id & 0xFF, protocol_id >> 8, protocol_id & 0xFF, length >> 8, length & 0xFF, 0x00, 0x00, 0x00, 0x00, function_code]) # Concatenate header and message to form complete Modbus TCP packet packet = header + message # Send packet to server and receive response self.socket.send(packet) response = self.socket.recv(1024) # Verify Modbus TCP header if len(response) < 9: raise Exception('Invalid Modbus TCP response') response_transaction_id = (response[0] << 8) | response[1] response_protocol_id = (response[2] << 8) | response[3] response_length = (response[4] << 8) | response[5] response_unit_id = response[6] response_function_code = response[7]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值