| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
代码分享,请高手指点#include<stdio.h>
#include<stdlib.h>
#define htons( val ) ( ( (val & 0xFF00) >> 8) | ( (val & 0xFF) << 8 ) )
#define htonl( val ) ( ( (val & 0xFF) << 24 ) | ( val & 0xFF00 ) << 8 | ( val & 0xFF0000 ) >> 8 | ( val & 0xFF000000 ) >> 24 )
/* calculate CRC checksum */
unsigned short crc16( unsigned char *str, int len )
{
unsigned short crc = 0xFFFF;
unsigned char *p = str, flag, c;
for( ; len--; p++ ) {
crc ^= *p;
for( c=8; c--; ) {
flag = 0;
if( crc & 0x1 )
flag = 1;
crc >>= 1;
if( flag )
crc ^= 0xA001;
}
}
return crc;
}
/*
The Modbus send:
<SlaveAddress, 1 Byte> <Function, 1 Byte> <Start Address, 2 Bytes> <NumberofBytes, 2 Bytes> <Checksum, 2 Bytes>
*/
#define MODBUS_MAX_XMIT 100
int modbus_xmit( unsigned char slave_addr, unsigned char func, unsigned short start_addr, unsigned short bytesnum )
{
static unsigned char buff[ MODBUS_MAX_XMIT ];
//printf( "%x,%x,%x,%x\n", slave_addr, func, start_addr, bytesnum );
unsigned char *p_uint8 = buff;
unsigned short *p_uint16;
*p_uint8++ = slave_addr;
*p_uint8++ = func;
p_uint16 = ( unsigned short * ) p_uint8;
*p_uint16++ = htons(start_addr);
*p_uint16++ = htons(bytesnum);
*p_uint16++ = crc16( buff, 6 );
//printf( "\nCRC:%X\n", crc16( buff, 6 ) );
p_uint8 = ( unsigned char * ) p_uint16;
*(p_uint8) = '\0';
for( p_uint8=buff; p_uint8<buff+8; p_uint8++ ){
printf( "%02X", *p_uint8 );
}
printf( "\n" );
return 0;
}
/*
Modbus receive:
<SlaveAddress,1Byte> <Function,1Byte> <NumberofBytes,1Byte> <DataIEEE32,xByte> <Checksum,2Bytes>
02040841CC0000477F2100DF85
*/
#define MODBUS_MAX_RECV 100
int modbus_recv( unsigned char *str )
{
static unsigned char data[MODBUS_MAX_RECV];
unsigned char *p;
unsigned char i, len=0;
char tmp[3] = { 0, };
for( i=0; i<128 && str[i]; i+=2 ){
tmp[0] = str[i];
tmp[1] = str[i+1];
data[len++] = strtoul( tmp, (char **)NULL, 16 );
}
p = data;
unsigned short crc = * ((unsigned short * ) (p+len-2) );
if( crc != crc16( p, len-2 ) ){
printf( "CRC_ERROR\n" );
return -1;
}
unsigned char numofbytes = *(p+2);
numofbytes /= 4;
float *pf;
p += 3; // move to floats
pf = ( float * ) p;
for( i=0; i<numofbytes; i++, pf++, p+=4 ){
int *val = ( int * ) p;
*val = htonl( *val );
pf = ( float * ) val;
if( i )
printf( "," );
printf( "%.1f", *pf );
}
printf( "\n" );
return 0;
}
int main()
{
int slave_addr, func, start_addr, bytesnum;
char buff[128];
while( scanf( "%d,%d,%d,%d", &slave_addr, &func, &start_addr, &bytesnum ) == 4 ){
modbus_xmit( slave_addr, func, start_addr, bytesnum );
scanf( "%s", buff );
modbus_recv( buff );
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator