栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 3754 模拟Modbus协议

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 3754 模拟Modbus协议

#include<stdio.h>#define  dataStart 6unsigned int CRC;char inputStr[100];//字符转为16进制整数unsigned int ChangeTo16(char ch){    if(ch-'9'<=0)        return ch-'0';    else        return ch-'A'+10;}//一轮CRC转化void CRC_Change(unsigned int data){    int i;    CRC^=data;    for(i=0;i<8;i++)    {        if(CRC&0x0001)        { CRC>>=1; CRC^=0xA001;        }        else CRC>>=1;    }}int main(){    unsigned int slaAddr,func,staAddr,numOfbyte;    unsigned int temp,tempCRC;    unsigned int i,len;    unsigned long floatData;    unsigned long *longAddr;    float *floatAddr;    while(scanf("%u,%u,%u,%u",&slaAddr,&func,&staAddr,&numOfbyte)!=EOF)    {        CRC=0xFFFF;        CRC_Change(slaAddr);        CRC_Change(func);        CRC_Change(staAddr>>8);        CRC_Change(staAddr&0x00ff);        CRC_Change(numOfbyte>>8);        CRC_Change(numOfbyte&0x00ff);        temp=CRC&0x00ff;        temp<<=8;        CRC=(CRC>>8)|temp;        printf("%02X%02X%04X%04X%Xn",slaAddr,func,staAddr,numOfbyte,CRC);        scanf("%s",&inputStr);        CRC=0xFFFF;        CRC_Change(ChangeTo16(inputStr[0])*16+ChangeTo16(inputStr[1]));        CRC_Change(ChangeTo16(inputStr[2])*16+ChangeTo16(inputStr[3]));        len=ChangeTo16(inputStr[4])*16+ChangeTo16(inputStr[5]);        CRC_Change(len);        for(i=0;i<len*2;i+=2) CRC_Change(ChangeTo16(inputStr[i+dataStart])*16+ChangeTo16(inputStr[i+1+dataStart]));        temp=CRC&0x00ff;        temp<<=8;        CRC=(CRC>>8)|temp;        tempCRC=ChangeTo16(inputStr[i+dataStart])*0x1000         +ChangeTo16(inputStr[i+1+dataStart])*0x0100         +ChangeTo16(inputStr[i+2+dataStart])*0x0010         +ChangeTo16(inputStr[i+3+dataStart]);        if(CRC!=tempCRC)        { printf("CRC_ERRORn"); continue;        }        for(i=0;i<len*2;i+=8)        { floatData=ChangeTo16(inputStr[i+dataStart])*0x10000000  +ChangeTo16(inputStr[i+1+dataStart])*0x01000000  +ChangeTo16(inputStr[i+2+dataStart])*0x00100000  +ChangeTo16(inputStr[i+3+dataStart])*0x00010000  +ChangeTo16(inputStr[i+4+dataStart])*0x00001000  +ChangeTo16(inputStr[i+5+dataStart])*0x00000100  +ChangeTo16(inputStr[i+6+dataStart])*0x00000010  +ChangeTo16(inputStr[i+7+dataStart]); longAddr=&floatData floatAddr=(float*)longAddr;  if(i>0)     printf(","); printf("%.1f",*floatAddr);        }        printf("n");    }    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/378566.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号