/** * @sn int SendData(char *data, int data_len) * @brief the data is formated to transmition protocol STR + DATA LENGTH(2 bytes) + DATA(LLVAR) + ETX + LRC(STR...ETX) * end sent at the end. * @param data : the data to be transmited * @param data_len : the length of the data to be transmited * @return @li FAIL * @li SUCC * @sa */ int SendData(char *data, int data_len) { char buffer[PACK_BUF_LEN]; if((data_len < 0) || (data_len > (PACK_BUF_LEN - 5))) { return FAIL; } memset(buffer, 0, sizeof(buffer)); //pack the data phase //add buffer[0] = TLVP_STX; // Add data length buffer[1] = ByteToBcd(data_len/100); buffer[2] = ByteToBcd(data_len%100); //Add data memcpy(&buffer[3], data, data_len); //Add ETC buffer[3 + data_len] = TLVP_ETX; //Add LRC buffer[4 + data_len] = LRC(buffer, 4 + data_len); if(portwrite(AUX1, 5 + data_len, buffer) != SUCC) { return FAIL; } return SUCC; }
/* * @sn int ReceiveData(char * data,int * data_len) * @brief receive data and peel off the ransmition protocol * @param data : store the received data * @param data_len : store the length of the data * @return @li FAIL * @li SUCC * @sa */ int ReceiveData(char * data, int * data_len) { int dataLen = 0, received_len = 0; char buffer[PACK_BUF_LEN]; memset(buffer, 0, sizeof(buffer)); //read STX if(portread(AUX1, 1, buffer, TLVP_TIMEOUT) != 1) { return FAIL; } if(buffer[0] != TLVP_STX) { return FAIL; } received_len += 1; //read DATA_LEN if((portread(AUX1, 2, &buffer[received_len], TLVP_TIMEOUT) != 2)) { return FAIL; } dataLen = 100*BcdToByte(buffer[1]) + BcdToByte(buffer[2]); if((dataLen < 0) || (dataLen > (PACK_BUF_LEN - 5))) { return FAIL; } received_len += 2; //read DATA if(portread(AUX1, dataLen, &buffer[received_len], TLVP_TIMEOUT) != dataLen) { return FAIL; } received_len += dataLen; //read ETX if(portread(AUX1, 1, &buffer[received_len], TLVP_TIMEOUT) != 1) { return FAIL; } if(buffer[received_len] != TLVP_ETX) { return FAIL; } received_len += 1; //read LRC if(portread(AUX1, 1, &buffer[received_len], TLVP_TIMEOUT) != 1) { return FAIL; } if(buffer[received_len] != LRC(buffer, received_len))//check LRC { return FAIL; } received_len += 1; memcpy(data, &buffer[3], dataLen); *data_len = dataLen; return SUCC; }
int main(int argc, char *argv[]){ unsigned char addr, fc, data[256], crc[2]; int datalen; char inport[100], outport[100]; int i, j, len, err; int port; struct modbus_pdu *pdu; int cnt1, cnt2; strcpy(inport,"/dev/ttyUSB2"); strcpy(outport,"/dev/ttyUSB0"); for (i=1;i<argc;i++) { if (strcmp(argv[i], "-inport") == 0) { len = strlen(argv[i+1]); if (len > 100) { printf("Error: Port name must be less then 100 characters long.\n"); return(-1); }; strncpy(inport, argv[i+1],len); i++; printf("INFO: Input port = %s\n", inport); } else if (strcmp(argv[i], "-outport") == 0) { len = strlen(argv[i+1]); if (len > 100) { printf("Error: Port name must be less then 100 characters long.\n"); return(-1); } strncpy(outport, argv[i+1],len); i++; } else { printf("ERROR: Illegal argument (%s)\n", argv[i]); printf("Usage: %s -inport /dev/ttyXX -outport /dev/ttyYY\n", argv[0]); return (-1); } } port = openport(outport); if (port < 0) { return (port); } printf("open %s ok port = %d\n", outport, port); char *str; unsigned char lrc, top, bottom; addr = (unsigned char) 0x04; fc = (unsigned char) 0x03; int cnt = 1; while(1){ for(cnt1=0x48; cnt1<0xff; cnt1++){ for(cnt2=0xbf; cnt2<0xff; cnt2++){ datalen = 19; data[0] = 0x12; data[1] = 0x10; data[2] = 0x00; data[3] = 0x0e; data[4] = 0x00; data[5] = 0x0c; data[6] = 0x4c; data[7] = 0x00; data[8] = 0x00; data[9] = 0x00; data[10] = 0x00; data[11] = 0x00; data[12] = 0x00; data[13] = 0x00; data[14] = 0x00; data[15] = cnt2; data[16] = cnt1; data[17] = 0x00; data[18] = 0x00; str = malloc(datalen + 2); str[0] = addr; str[1] = fc; memcpy(str+2, data, datalen); lrc = LRC(str,datalen+2); free(str); byte2ascii(lrc, &top, &bottom); //crc[0] = 0x34; // crc[1] = 0x39; crc[0] = top; crc[1] = bottom; pdu = mkpdu(addr, fc, data, datalen, crc); sendmodbus_ascii(port, pdu); freepdu(pdu); printf("number is %d\n", cnt++); sleep(1); } } } }
int main(int argc, char *argv[]){ unsigned char addr, fc, data[256], crc[2]; int datalen; char inport[100], outport[100]; int i, j, len, err; int port; struct modbus_pdu *pdu; int cnt1 = 0, cnt2 = 0x0, cnt; strcpy(inport, "/dev/ttyUSB2"); strcpy(outport, "/dev/ttyUSB0"); for(i=1; i<argc; i++){ if(strcmp(argv[i], "-inport") == 0){ len = strlen(argv[i+1]); if(len > 100){ printf("Error: Port name must be less than 100 characters long.\n"); return(-1); } strncpy(inport, argv[i+1], len); i++; printf("INFO: Input port = %s\n", inport); } else if(strcmp(argv[i], "-outport") == 0){ len = strlen(argv[i+1]); if(len > 100){ printf("Error: Port name must be less than 100 characters long.\n"); return(-1); } strncpy(outport, argv[i+1],len); i++; }else{ printf("ERROR: Illegal arguments (%s)\n", argv[i]); printf("Usage: %s -inport /dev/ttyXX -outport /dev/ttyYY\n", argv[0]); return (-1); } } port = openport(outport); if(port < 0) return (port); printf("open %s ok port = %d\n", outport, port); char *str; unsigned char lrc, top, bottom; addr = (unsigned char) 0x4; //fc =0x01 read coil, while(1){ cnt1 = 0; for(cnt1=0; cnt1<100; cnt1++){ fc = (unsigned char) 0x01; datalen = 19; data[0] = 0x00; data[1] = 0x00; data[2] = 0x00; data[3] = 0x00; data[4] = 0x00; data[5] = 0x00; data[6] = 0x00; data[7] = 0x00; data[8] = 0x00; data[9] = 0x00; data[10] = 0x00; data[11] = 0x00; data[12] = 0x00; data[13] = 0x00; data[14] = 0x00; data[15] = 0x00; data[16] = 0x00; data[17] = 0x00; data[18] = 0x00; str = malloc(datalen+2); str[0] = addr; str[1] = fc; memcpy(str+2, data, datalen); lrc = LRC(str, datalen+2); free(str); byte2ascii(lrc, &top, &bottom); crc[0] = top; crc[1] = bottom; pdu = mkpdu(addr, fc, data, datalen, crc); sendmodbus_ascii(port, pdu); freepdu(pdu); printf("number is %d\n", cnt1); sleep(1); } for(cnt1=0; cnt1<100; cnt1++){ fc = (unsigned char) 0x01; datalen = 19; data[0] = 0xff; data[1] = 0xff; data[2] = 0xff; data[3] = 0xff; data[4] = 0xff; data[5] = 0xff; data[6] = 0xff; data[7] = 0xff; data[8] = 0xff; data[9] = 0xff; data[10] = 0xff; data[11] = 0xff; data[12] = 0xff; data[13] = 0xff; data[14] = 0xff; data[15] = 0xff; data[16] = 0xff; data[17] = 0xff; data[18] = 0xff; str = malloc(datalen+2); str[0] = addr; str[1] = fc; memcpy(str+2, data, datalen); lrc = LRC(str, datalen+2); free(str); byte2ascii(lrc, &top, &bottom); crc[0] = top; crc[1] = bottom; pdu = mkpdu(addr, fc, data, datalen, crc); sendmodbus_ascii(port, pdu); freepdu(pdu); printf("number is %d\n", cnt1); sleep(1); } //fc = 0x02 Read Discrete Inputs, not implement excode = 01 fc = (unsigned char)0x02; for(cnt1=0; cnt1<100; cnt1++){ datalen = 19; data[0] = 0x00; data[1] = 0x00; data[2] = 0x00; data[3] = 0x00; data[4] = 0x00; data[5] = 0x00; data[6] = 0x00; data[7] = 0x00; data[8] = 0x00; data[9] = 0x00; data[10] = 0x00; data[11] = 0x00; data[12] = 0x00; data[13] = 0x00; data[14] = 0x00; data[15] = 0x00; data[16] = 0x00; data[17] = 0x00; data[18] = 0x00; str = malloc(datalen+2); str[0] = addr; str[1] = fc; memcpy(str+2, data, datalen); lrc = LRC(str, datalen+2); free(str); byte2ascii(lrc, &top, &bottom); crc[0] = top; crc[1] = bottom; pdu = mkpdu(addr, fc, data, datalen, crc); sendmodbus_ascii(port, pdu); freepdu(pdu); printf("number is %d\n", cnt); sleep(1); } for(cnt1=0; cnt1<100; cnt1++){ fc = (unsigned char) 0x02; datalen = 19; data[0] = 0xff; data[1] = 0xff; data[2] = 0xff; data[3] = 0xff; data[4] = 0xff; data[5] = 0xff; data[6] = 0xff; data[7] = 0xff; data[8] = 0xff; data[9] = 0xff; data[10] = 0xff; data[11] = 0xff; data[12] = 0xff; data[13] = 0xff; data[14] = 0xff; data[15] = 0xff; data[16] = 0xff; data[17] = 0xff; data[18] = 0xff; str = malloc(datalen+2); str[0] = addr; str[1] = fc; memcpy(str+2, data, datalen); lrc = LRC(str, datalen+2); free(str); byte2ascii(lrc, &top, &bottom); crc[0] = top; crc[1] = bottom; pdu = mkpdu(addr, fc, data, datalen, crc); sendmodbus_ascii(port, pdu); freepdu(pdu); printf("number is %d\n", cnt1); sleep(1); } //fc = 0x03 Read Holding Registers, not implement excode = 01 fc = 0x03; for(cnt1=0; cnt1<100; cnt1++){ datalen = 19; data[0] = 0x00; data[1] = 0x00; data[2] = 0x00; data[3] = 0x00; data[4] = 0x00; data[5] = 0x00; data[6] = 0x00; data[7] = 0x00; data[8] = 0x00; data[9] = 0x00; data[10] = 0x00; data[11] = 0x00; data[12] = 0x00; data[13] = 0x00; data[14] = 0x00; data[15] = 0x00; data[16] = 0x00; data[17] = 0x00; data[18] = 0x00; str = malloc(datalen+2); str[0] = addr; str[1] = fc; memcpy(str+2, data, datalen); lrc = LRC(str, datalen+2); free(str); byte2ascii(lrc, &top, &bottom); crc[0] = top; crc[1] = bottom; pdu = mkpdu(addr, fc, data, datalen, crc); sendmodbus_ascii(port, pdu); freepdu(pdu); printf("numb is %d\n", cnt1); sleep(1); } for(cnt1=0; cnt1<100; cnt1++){ fc = (unsigned char) 0x03; datalen = 19; data[0] = 0xff; data[1] = 0xff; data[2] = 0xff; data[3] = 0xff; data[4] = 0xff; data[5] = 0xff; data[6] = 0xff; data[7] = 0xff; data[8] = 0xff; data[9] = 0xff; data[10] = 0xff; data[11] = 0xff; data[12] = 0xff; data[13] = 0xff; data[14] = 0xff; data[15] = 0xff; data[16] = 0xff; data[17] = 0xff; data[18] = 0xff; str = malloc(datalen+2); str[0] = addr; str[1] = fc; memcpy(str+2, data, datalen); lrc = LRC(str, datalen+2); free(str); byte2ascii(lrc, &top, &bottom); crc[0] = top; crc[1] = bottom; pdu = mkpdu(addr, fc, data, datalen, crc); sendmodbus_ascii(port, pdu); freepdu(pdu); printf("number is %d\n", cnt1); sleep(1); } //fc = 0x04 Read Input Registers, not implement excode = 01 fc = 0x04; for(cnt1=0; cnt1<100; cnt1++){ len = 19; data[0] = 0x00; data[1] = 0x00; data[2] = 0x00; data[3] = 0x00; data[4] = 0x00; data[5] = 0x00; data[6] = 0x00; data[7] = 0x00; data[8] = 0x00; data[9] = 0x00; data[10] = 0x00; data[11] = 0x00; data[12] = 0x00; data[13] = 0x00; data[14] = 0x00; data[15] = 0x00; data[16] = 0x00; data[17] = 0x00; data[18] = 0x00; str = malloc(datalen+2); str[0] = addr; str[1] = fc; memcpy(str+2, data, datalen); lrc = LRC(str, datalen+2); free(str); byte2ascii(lrc, &top, &bottom); crc[0] = top; crc[1] = bottom; pdu = mkpdu(addr, fc, data, datalen, crc); sendmodbus_ascii(port, pdu); freepdu(pdu); printf("number is %d\n", cnt1); sleep(1); } for(cnt1=0; cnt1<100; cnt1++){ fc = (unsigned char) 0x04; datalen = 19; data[0] = 0xff; data[1] = 0xff; data[2] = 0xff; data[3] = 0xff; data[4] = 0xff; data[5] = 0xff; data[6] = 0xff; data[7] = 0xff; data[8] = 0xff; data[9] = 0xff; data[10] = 0xff; data[11] = 0xff; data[12] = 0xff; data[13] = 0xff; data[14] = 0xff; data[15] = 0xff; data[16] = 0xff; data[17] = 0xff; data[18] = 0xff; str = malloc(datalen+2); str[0] = addr; str[1] = fc; memcpy(str+2, data, datalen); lrc = LRC(str, datalen+2); free(str); byte2ascii(lrc, &top, &bottom); crc[0] = top; crc[1] = bottom; pdu = mkpdu(addr, fc, data, datalen, crc); sendmodbus_ascii(port, pdu); freepdu(pdu); printf("number is %d\n", cnt1); sleep(1); } //fc = 0x18, read FIFO fc = 0x18; for(cnt1=0; cnt1<100; cnt1++){ len = 19; data[0] = 0x00; data[1] = 0x00; data[2] = 0x00; data[3] = 0x00; data[4] = 0x00; data[5] = 0x00; data[6] = 0x00; data[7] = 0x00; data[8] = 0x00; data[9] = 0x00; data[10] = 0x00; data[11] = 0x00; data[12] = 0x00; data[13] = 0x00; data[14] = 0x00; data[15] = 0x00; data[16] = 0x00; data[17] = 0x00; data[18] = 0x00; str = malloc(datalen+2); str[0] = addr; str[1] = fc; memcpy(str+2, data, datalen); lrc = LRC(str, datalen+2); free(str); byte2ascii(lrc, &top, &bottom); crc[0] = top; crc[1] = bottom; pdu = mkpdu(addr, fc, data, datalen, crc); sendmodbus_ascii(port, pdu); freepdu(pdu); printf("number is %d\n", cnt1++); sleep(1); } for(cnt1=0; cnt1<100; cnt1++){ fc = (unsigned char) 0x18; datalen = 19; data[0] = 0xff; data[1] = 0xff; data[2] = 0xff; data[3] = 0xff; data[4] = 0xff; data[5] = 0xff; data[6] = 0xff; data[7] = 0xff; data[8] = 0xff; data[9] = 0xff; data[10] = 0xff; data[11] = 0xff; data[12] = 0xff; data[13] = 0xff; data[14] = 0xff; data[15] = 0xff; data[16] = 0xff; data[17] = 0xff; data[18] = 0xff; str = malloc(datalen+2); str[0] = addr; str[1] = fc; memcpy(str+2, data, datalen); lrc = LRC(str, datalen+2); free(str); byte2ascii(lrc, &top, &bottom); crc[0] = top; crc[1] = bottom; pdu = mkpdu(addr, fc, data, datalen, crc); sendmodbus_ascii(port, pdu); freepdu(pdu); printf("number is %d\n", cnt1++); sleep(1); } } }
int main(int argc, char *argv[]){ unsigned char addr, fc, data[256], crc[2]; int datalen; char inport[100], outport[100]; int i, j, len, err; int port; struct modbus_pdu *pdu; int cnt = 0x0; int id = 0x0; strcpy(inport,"/dev/ttyUSB0"); strcpy(outport,"/dev/ttyUSB2"); for (i=1;i<argc;i++) { if (strcmp(argv[i], "-inport") == 0) { len = strlen(argv[i+1]); if (len > 100) { printf("Error: Port name must be less then 100 characters long.\n"); return(-1); }; strncpy(inport, argv[i+1],len); i++; printf("INFO: Input port = %s\n", inport); } else if (strcmp(argv[i], "-outport") == 0) { len = strlen(argv[i+1]); if (len > 100) { printf("Error: Port name must be less then 100 characters long.\n"); return(-1); } strncpy(outport, argv[i+1],len); i++; } else { printf("ERROR: Illegal argument (%s)\n", argv[i]); printf("Usage: %s -inport /dev/ttyXX -outport /dev/ttyYY\n", argv[0]); return (-1); } } port = openport(outport); if (port < 0) { return (port); } printf("open %s ok port = %d\n", outport, port); char *str; unsigned char lrc, top, bottom; while(1){ for(cnt=0x01; cnt<=0x04; cnt++){ for(id=0x00; id<=0xff; id++){ addr = (unsigned char) 0x07; fc = (unsigned char) 0x2b; datalen = 3; data[0] = 0x0e; //MEI type data[1] = cnt; // ID code data[2] = id; //object ID str = malloc(datalen + 2); str[0] = addr; str[1] = fc; memcpy(str+2, data, datalen); lrc = LRC(str,datalen+2); free(str); byte2ascii(lrc, &top, &bottom); crc[0] = top; crc[1] = bottom; pdu = mkpdu(addr, fc, data, datalen, crc); sendmodbus_ascii(port, pdu); freepdu(pdu); printf("number is %d\n", cnt); sleep(4); } } } }