chenbin 4 роки тому
батько
коміт
d34fd22212

+ 12 - 1
src/small_modbus_port_linux.c

@@ -1,4 +1,4 @@
-/*
+/*
  * Change Logs:
  * Date           Author       Notes
  * 2021-06     		chenbin      small_modbus_port_linux.c  for linux
@@ -12,8 +12,19 @@
 
 int _modbus_debug(small_modbus_t* smb, int level, const char* fmt, ...)
 {
+    static char log_buf[256];
+    if (level <= smb->debug_level)
+    {
+        va_list args;
+        va_start(args, fmt);
+        vsnprintf(log_buf, 256, fmt, args);
+        va_end(args);
+        puts(log_buf);
+    }
     return 0;
 }
 
+
+
 #endif
 

+ 18 - 27
src/small_modbus_port_rtthread.c

@@ -130,21 +130,19 @@ static int _modbus_rtdevice_close(small_modbus_t *smb)
 static int _modbus_rtdevice_write(small_modbus_t *smb,uint8_t *data,uint16_t length)
 {
 	small_modbus_port_rtdevice_t *smb_port_device = (small_modbus_port_rtdevice_t*)smb->port;
-	//rt_enter_critical();
-	
+
 	if(smb_port_device->rts_set)
 			smb_port_device->rts_set(1);
 	
-	rt_enter_critical();
+	rt_enter_critical(); // poll write start
 	
 	rt_device_write(smb_port_device->device,0,data,length);
 	
-	rt_exit_critical();
+	rt_exit_critical(); // poll write end
 	
 	if(smb_port_device->rts_set)
 			smb_port_device->rts_set(0);
 	
-	//rt_exit_critical();
 	return length;
 }
 
@@ -160,10 +158,7 @@ static int _modbus_rtdevice_flush(small_modbus_t *smb)
 	small_modbus_port_rtdevice_t* smb_port_device = (small_modbus_port_rtdevice_t*)smb->port;
 	
 	int rc = rt_device_read(smb_port_device->device,0,smb->read_buff,MODBUS_MAX_ADU_LENGTH);
-	if(rc > 0)
-	{
-		
-	}
+	
 	rt_sem_control(&(smb_port_device->rx_sem), RT_IPC_CMD_RESET, RT_NULL);
 	return rc;
 }
@@ -329,18 +324,7 @@ static int _modbus_rtsocket_close(small_modbus_t *smb)
 static int _modbus_rtsocket_write(small_modbus_t *smb,uint8_t *data,uint16_t length)
 {
 	small_modbus_port_rtsocket_t *smb_port_socket = (small_modbus_port_rtsocket_t *)smb->port;
-
-	struct timeval tv = {
-			smb->timeout_frame / 1000,
-			(smb->timeout_frame % 1000) * 1000
-	};
-
-	if (tv.tv_sec < 0 || (tv.tv_sec == 0 && tv.tv_usec <= 0)){
-			tv.tv_sec = 0;
-			tv.tv_usec = 1000*10;
-	}
-	setsockopt(smb_port_socket->socket_fd, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv,sizeof(struct timeval));
-
+	
 	send(smb_port_socket->socket_fd, data, length, 0);
 
 	return length;
@@ -392,18 +376,24 @@ static int _modbus_rtsocket_wait(small_modbus_t *smb,int timeout)
 	setsockopt(smb_port_socket->socket_fd, SOL_SOCKET, SO_RCVTIMEO, (void *)&tv, sizeof(struct timeval));
 
 	rc = recv(smb_port_socket->socket_fd, smb_port_socket->rx_temp, sizeof(smb_port_socket->rx_temp), 0);
-	if(rc <= 0)
+	if(rc == 0) //socket wait_close
 	{
+		modbus_debug_error(smb,"rtsocket[%d] recv rc:%d wait_close\n",smb_port_socket->socket_fd, rc);
+		rc = MODBUS_ERROR_READ;
+	}else
+	if(rc < 0) //socket error
+	{
+		slen = sizeof(socket_status);
 		getsockopt(smb_port_socket->socket_fd, SOL_SOCKET, SO_ERROR, (void *)&socket_status , &slen );
 		
-		if(!(socket_status == EINTR || socket_status == EWOULDBLOCK || socket_status == EAGAIN))
-		{
-				modbus_debug_error(smb,"rtsocket[%d] recv err(%d)\n", smb_port_socket->socket_fd, socket_status);
-				rc = MODBUS_ERROR_READ;
-		}else
+		if((socket_status == 0 ||socket_status == EINTR || socket_status == EWOULDBLOCK || socket_status == EAGAIN))
 		{
 				//rt_kprintf("rtsocket timeout :%d\n",rc);
 				rc = MODBUS_TIMEOUT;
+		}else
+		{
+				modbus_debug_error(smb,"rtsocket[%d] recv err(%d)\n", smb_port_socket->socket_fd, socket_status);
+				rc = MODBUS_ERROR_READ;
 		}
 	}else
 	{
@@ -494,6 +484,7 @@ int modbus_tcp_status(small_modbus_t *smb)
 	
 	if( (port_socket) && (port_socket->socket_fd >= 0) )
 	{
+		slen = sizeof(socket_status);
 		getsockopt(port_socket->socket_fd, SOL_SOCKET, SO_ERROR, (void *)&socket_status , &slen );
 	}
 	return socket_status;

+ 0 - 15
src/small_modbus_rtu.c

@@ -26,19 +26,10 @@ static int _rtu_build_response_header(small_modbus_t *smb,uint8_t *buff,int slav
     buff[1] = fun;
     return _MODBUS_RTU_PRESET_RSP_LENGTH;
 }
-#if (SMALL_MODBUS_CRC_BYTE_SWAP)
-static inline uint16_t bswap_16(uint16_t x)
-{
-    return (x >> 8) | (x << 8);
-}
-#endif
 
 static int _rtu_check_send_pre(small_modbus_t *smb,uint8_t *buff,int length)
 {
     uint16_t crc = modbus_crc16(buff,length);
-#if (SMALL_MODBUS_CRC_BYTE_SWAP)
-    crc = bswap_16(crc);
-#endif
     buff[length++] = crc & 0x00FF; //LOW BYTE 
     buff[length++] = crc >> 8;   //HIGH BYTE
     return length;
@@ -48,9 +39,6 @@ static int _rtu_check_wait_request(small_modbus_t *smb,uint8_t *buff,int length)
 {
     uint16_t crc_recv = ( (uint16_t)(buff[length - 2]&0x00FF) + (uint16_t)(buff[length - 1] << 8) ); //LOW BYTE HIGH BYTE
     uint16_t crc_cal = modbus_crc16(buff, length - 2);
-#if (SMALL_MODBUS_CRC_BYTE_SWAP)
-    crc_cal = bswap_16(crc_cal);
-#endif
     if (crc_cal != crc_recv)
     {
         modbus_debug_error(smb,"crc  0x%04X != 0x%04X\n", crc_cal, crc_recv );
@@ -68,9 +56,6 @@ static int _rtu_check_wait_response(small_modbus_t *smb,uint8_t *buff,int length
 {
     uint16_t crc_recv = ( (uint16_t)(buff[length - 2]&0x00FF) + (uint16_t)(buff[length - 1] << 8) ); //LOW BYTE HIGH BYTE
     uint16_t crc_cal = modbus_crc16(buff, length - 2);
-#if (SMALL_MODBUS_CRC_BYTE_SWAP)
-    crc_cal = bswap_16(crc_cal);
-#endif
     if (crc_cal != crc_recv)
     {
         modbus_debug_error(smb, "crc  0x%04X != 0x%04X\n", crc_cal, crc_recv);

+ 0 - 339
src/small_modbus_utils.c

@@ -8,81 +8,6 @@
 #include "stdint.h"
 #include "string.h"
 
-///* Table of CRC values for high-order byte */
-//static const uint8_t table_crc_hi[] = {
-//    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
-//    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
-//    0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
-//    0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
-//    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
-//    0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
-//    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
-//    0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
-//    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
-//    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
-//    0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
-//    0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
-//    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
-//    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
-//    0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
-//    0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
-//    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
-//    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
-//    0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
-//    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
-//    0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
-//    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
-//    0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
-//    0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
-//    0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
-//    0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
-//};
-
-///* Table of CRC values for low-order byte */
-//static const uint8_t table_crc_lo[] = {
-//    0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
-//    0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
-//    0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
-//    0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
-//    0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
-//    0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
-//    0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
-//    0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
-//    0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
-//    0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
-//    0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
-//    0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
-//    0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
-//    0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
-//    0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
-//    0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
-//    0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
-//    0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
-//    0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
-//    0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
-//    0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
-//    0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
-//    0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
-//    0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
-//    0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
-//    0x43, 0x83, 0x41, 0x81, 0x80, 0x40
-//};
-
-//uint16_t modbus_crc16(uint8_t *buffer, uint16_t buffer_length)
-//{
-//    uint8_t crc_hi = 0xFF; /* high CRC byte initialized */
-//    uint8_t crc_lo = 0xFF; /* low CRC byte initialized */
-//    unsigned int i; /* will index into CRC lookup */
-
-//    /* pass through message buffer */
-//    while (buffer_length--) {
-//        i = crc_hi ^ *buffer++; /* calculate the CRC  */
-//        crc_hi = crc_lo ^ table_crc_hi[i];
-//        crc_lo = table_crc_lo[i];
-//    }
-//    return (crc_hi << 8 | crc_lo);
-//}
-
 uint16_t modbus_crc16(uint8_t *buffer, uint16_t buffer_length)
 {
 	uint16_t CRC= 0XFFFF;
@@ -244,267 +169,3 @@ void modbus_reg_m2h(void *dest_host,void *source_modbus_reg,int reg_num)
 		dest_host_u16++;
 	}while(--reg_num);
 }
-
-static inline uint16_t bswap_16(uint16_t x)
-{
-    return (x >> 8) | (x << 8);
-}
-
-static inline uint32_t bswap_32(uint32_t x)
-{
-    return (bswap_16(x & 0xffff) << 16) | (bswap_16(x >> 16));
-}
-
-#define modbus_ntohl(x)     (x)
-#define modbus_htonl(x)     (x)
-/* Sets many bits from a single byte value (all 8 bits of the byte value are
-   set) */
-void modbus_set_bits_from_byte(uint8_t *dest, int idx, const uint8_t value)
-{
-    int i;
-
-    for (i=0; i < 8; i++) {
-        dest[idx+i] = (value & (1 << i)) ? 1 : 0;
-    }
-}
-
-/* Sets many bits from a table of bytes (only the bits between idx and
-   idx + nb_bits are set) */
-void modbus_set_bits_from_bytes(uint8_t *dest, int idx, unsigned int nb_bits,const uint8_t *tab_byte)
-{
-    unsigned int i;
-    int shift = 0;
-
-    for (i = idx; i < idx + nb_bits; i++) {
-        dest[i] = tab_byte[(i - idx) / 8] & (1 << shift) ? 1 : 0;
-        /* gcc doesn't like: shift = (++shift) % 8; */
-        shift++;
-        shift %= 8;
-    }
-}
-
-/* Gets the byte value from many bits.
-   To obtain a full byte, set nb_bits to 8. */
-uint8_t modbus_get_byte_from_bits(const uint8_t *src, int idx,unsigned int nb_bits)
-{
-    unsigned int i;
-    uint8_t value = 0;
-
-    if (nb_bits > 8) {
-        nb_bits = 8;
-    }
-
-    for (i=0; i < nb_bits; i++) {
-        value |= (src[idx+i] << i);
-    }
-
-    return value;
-}
-
-/* Get a float from 4 bytes (Modbus) without any conversion (ABCD) */
-float modbus_get_float_abcd(const uint16_t *src)
-{
-    float f;
-    uint32_t i;
-
-    i = modbus_ntohl(((uint32_t)src[0] << 16) + src[1]);
-    memcpy(&f, &i, sizeof(float));
-
-    return f;
-}
-
-/* Get a long from 4 bytes (Modbus) without any conversion (ABCD) */
-long modbus_get_long_abcd(const uint16_t *src)
-{
-    long l;
-    uint32_t i;
-
-    i = modbus_ntohl(((uint32_t)src[0] << 16) + src[1]);
-    memcpy(&l, &i, sizeof(long));
-
-    return l;
-}
-
-/* Get a float from 4 bytes (Modbus) in inversed format (DCBA) */
-float modbus_get_float_dcba(const uint16_t *src)
-{
-    float f;
-    uint32_t i;
-
-    i = modbus_ntohl(bswap_32((((uint32_t)src[0]) << 16) + src[1]));
-    memcpy(&f, &i, sizeof(float));
-
-    return f;
-}
-
-/* Get a long from 4 bytes (Modbus) in inversed format (DCBA) */
-long modbus_get_long_dcba(const uint16_t *src)
-{
-    long l;
-    uint32_t i;
-
-    i = modbus_ntohl(bswap_32((((uint32_t)src[0]) << 16) + src[1]));
-    memcpy(&l, &i, sizeof(long));
-
-    return l;
-}
-
-/* Get a float from 4 bytes (Modbus) with swapped bytes (BADC) */
-float modbus_get_float_badc(const uint16_t *src)
-{
-    float f;
-    uint32_t i;
-
-    i = modbus_ntohl((uint32_t)(bswap_16(src[0]) << 16) + bswap_16(src[1]));
-    memcpy(&f, &i, sizeof(float));
-
-    return f;
-}
-
-/* Get a long from 4 bytes (Modbus) with swapped bytes (BADC) */
-long modbus_get_long_badc(const uint16_t *src)
-{
-    long l;
-    uint32_t i;
-
-    i = modbus_ntohl((uint32_t)(bswap_16(src[0]) << 16) + bswap_16(src[1]));
-    memcpy(&l, &i, sizeof(long));
-
-    return l;
-}
-
-/* Get a float from 4 bytes (Modbus) with swapped words (CDAB) */
-float modbus_get_float_cdab(const uint16_t *src)
-{
-    float f;
-    uint32_t i;
-
-    i = modbus_ntohl((((uint32_t)src[1]) << 16) + src[0]);
-    memcpy(&f, &i, sizeof(float));
-
-    return f;
-}
-
-/* Get a long from 4 bytes (Modbus) with swapped words (CDAB) */
-long modbus_get_long_cdab(const uint16_t *src)
-{
-    long l;
-    uint32_t i;
-
-    i = modbus_ntohl((((uint32_t)src[1]) << 16) + src[0]);
-    memcpy(&l, &i, sizeof(long));
-
-    return l;
-}
-
-/* DEPRECATED - Get a float from 4 bytes in sort of Modbus format */
-float modbus_get_float(const uint16_t *src)
-{
-    float f;
-    uint32_t i;
-
-    i = (((uint32_t)src[1]) << 16) + src[0];
-    memcpy(&f, &i, sizeof(float));
-
-    return f;
-}
-
-
-/* Set a float to 4 bytes for Modbus w/o any conversion (ABCD) */
-void modbus_set_float_abcd(float f, uint16_t *dest)
-{
-    uint32_t i;
-
-    memcpy(&i, &f, sizeof(uint32_t));
-    i = modbus_htonl(i);
-    dest[0] = (uint16_t)(i >> 16);
-    dest[1] = (uint16_t)i;
-}
-
-/* Set a long to 4 bytes for Modbus w/o any conversion (ABCD) */
-void modbus_set_long_abcd(long l, uint16_t *dest)
-{
-    uint32_t i;
-
-    memcpy(&i, &l, sizeof(uint32_t));
-    i = modbus_htonl(i);
-    dest[0] = (uint16_t)(i >> 16);
-    dest[1] = (uint16_t)i;
-}
-
-/* Set a float to 4 bytes for Modbus with byte and word swap conversion (DCBA) */
-void modbus_set_float_dcba(float f, uint16_t *dest)
-{
-    uint32_t i;
-
-    memcpy(&i, &f, sizeof(uint32_t));
-    i = bswap_32(modbus_htonl(i));
-    dest[0] = (uint16_t)(i >> 16);
-    dest[1] = (uint16_t)i;
-}
-
-/* Set a long to 4 bytes for Modbus with byte and word swap conversion (DCBA) */
-void modbus_set_long_dcba(long l, uint16_t *dest)
-{
-    uint32_t i;
-
-    memcpy(&i, &l, sizeof(uint32_t));
-    i = bswap_32(modbus_htonl(i));
-    dest[0] = (uint16_t)(i >> 16);
-    dest[1] = (uint16_t)i;
-}
-
-/* Set a float to 4 bytes for Modbus with byte swap conversion (BADC) */
-void modbus_set_float_badc(float f, uint16_t *dest)
-{
-    uint32_t i;
-
-    memcpy(&i, &f, sizeof(uint32_t));
-    i = modbus_htonl(i);
-    dest[0] = (uint16_t)bswap_16(i >> 16);
-    dest[1] = (uint16_t)bswap_16(i & 0xFFFF);
-}
-
-/* Set a long to 4 bytes for Modbus with byte swap conversion (BADC) */
-void modbus_set_long_badc(long l, uint16_t *dest)
-{
-    uint32_t i;
-
-    memcpy(&i, &l, sizeof(uint32_t));
-    i = modbus_htonl(i);
-    dest[0] = (uint16_t)bswap_16(i >> 16);
-    dest[1] = (uint16_t)bswap_16(i & 0xFFFF);
-}
-
-/* Set a float to 4 bytes for Modbus with word swap conversion (CDAB) */
-void modbus_set_float_cdab(float f, uint16_t *dest)
-{
-    uint32_t i;
-
-    memcpy(&i, &f, sizeof(uint32_t));
-    i = modbus_htonl(i);
-    dest[0] = (uint16_t)i;
-    dest[1] = (uint16_t)(i >> 16);
-}
-
-/* Set a long to 4 bytes for Modbus with word swap conversion (CDAB) */
-void modbus_set_long_cdab(long l, uint16_t *dest)
-{
-    uint32_t i;
-
-    memcpy(&i, &l, sizeof(uint32_t));
-    i = modbus_htonl(i);
-    dest[0] = (uint16_t)i;
-    dest[1] = (uint16_t)(i >> 16);
-}
-
-/* DEPRECATED - Set a float to 4 bytes in a sort of Modbus format! */
-void modbus_set_float(float f, uint16_t *dest)
-{
-    uint32_t i;
-
-    memcpy(&i, &f, sizeof(uint32_t));
-    dest[0] = (uint16_t)i;
-    dest[1] = (uint16_t)(i >> 16);
-}
-