实习工作小结第七天
时间:10-02
整理:3721RD
点击:
今天的工作毫无进展,并不是说什么也没有做,而是说我几乎做了我想到的一切了,然而对于问题的解决毫无帮助!现在我就像是发明灯泡之前的爱迪生,对他而言是找到下一种材料,对我而言是找到我思维的死角!但是今天并不是一无所获。至少是知道了一点常识! 1、程序下载和串口的配置是没有关系的,也就是说,能够下载程序,并不意味着你的串口配置是正确的(当然也不能说明是错的!)。但是下载程序和晶振是有关系的,但是确切的关系我并不是很清楚!
真的只是一点,再多一点都没有了!
昨天说的会在下面写上CRC的校验代码和将得到的校验HEX码转换成ASCII码的代码:
#define POLY 0x8005
//参数 *Pushdata 需要校验的字符串
//参数 length 字符串的长度可用strlen()函数获得
unsigned short CRC16_ModBus(unsigned char *Pushdata, unsigned char length) {
unsigned short Reg_CRC = 0xffff;
unsigned char Temp_reg = 0x00;
unsigned char i, j;
for (i = 0; i<length; i++) {
Reg_CRC ^= *Pushdata++;
for (j = 0; j<8; j++) {
if (Reg_CRC & 0x0001) {
Reg_CRC = Reg_CRC >> 1 ^ 0xA001;
}
else {
Reg_CRC >>= 1;
}
}
}
// Temp_reg=Reg_CRC>>8;
// return (Reg_CRC<<8|Temp_reg); //ModBusCRC低位在前
return (Reg_CRC); //ModBusCRC高位在前
}
//参数HEX是计算出来的HEX码,长度为2个字节
//参数是传入的用来接收校验码的数组,长度为4个字节
void HEX_to_ASCII(unsigned short HEX, unsigned char* ASCII) {
unsigned char tempASCII[4] = {'\0','\0','\0','\0'};
unsigned char index = 0;
tempASCII[0] = (HEX & 0xF000) >> 12;
tempASCII[1] = (HEX & 0x0F00) >> 8;
tempASCII[2] = (HEX & 0x00F0) >> 4;
tempASCII[3] = (HEX & 0x000F) >> 0;
for (index = 0; index < 4; index++) {
switch (tempASCII[index]) {
case 0:*(ASCII + index) = '0'; break;
case 1:*(ASCII + index) = '1'; break;
case 2:*(ASCII + index) = '2'; break;
case 3:*(ASCII + index) = '3'; break;
case 4:*(ASCII + index) = '4'; break;
case 5:*(ASCII + index) = '5'; break;
case 6:*(ASCII + index) = '6'; break;
case 7:*(ASCII + index) = '7'; break;
case 8:*(ASCII + index) = '8'; break;
case 9:*(ASCII + index) = '9'; break;
case 10:*(ASCII + index) = 'A'; break;
case 11:*(ASCII + index) = 'B'; break;
case 12:*(ASCII + index) = 'C'; break;
case 13:*(ASCII + index) = 'D'; break;
case 14:*(ASCII + index) = 'E'; break;
case 15:*(ASCII + index) = 'F'; break;
default:break;
}
}
}
两个函数,应该还算是通俗易懂了!好了今天就到这里!明天如果有新的进展我会写出新的新的,最近回家之后在学习C51,写个小时钟。明天看写多少,尽量公布代码!第一次打算写个简单的时钟!
真的只是一点,再多一点都没有了!
昨天说的会在下面写上CRC的校验代码和将得到的校验HEX码转换成ASCII码的代码:
#define POLY 0x8005
//参数 *Pushdata 需要校验的字符串
//参数 length 字符串的长度可用strlen()函数获得
unsigned short CRC16_ModBus(unsigned char *Pushdata, unsigned char length) {
unsigned short Reg_CRC = 0xffff;
unsigned char Temp_reg = 0x00;
unsigned char i, j;
for (i = 0; i<length; i++) {
Reg_CRC ^= *Pushdata++;
for (j = 0; j<8; j++) {
if (Reg_CRC & 0x0001) {
Reg_CRC = Reg_CRC >> 1 ^ 0xA001;
}
else {
Reg_CRC >>= 1;
}
}
}
// Temp_reg=Reg_CRC>>8;
// return (Reg_CRC<<8|Temp_reg); //ModBusCRC低位在前
return (Reg_CRC); //ModBusCRC高位在前
}
//参数HEX是计算出来的HEX码,长度为2个字节
//参数是传入的用来接收校验码的数组,长度为4个字节
void HEX_to_ASCII(unsigned short HEX, unsigned char* ASCII) {
unsigned char tempASCII[4] = {'\0','\0','\0','\0'};
unsigned char index = 0;
tempASCII[0] = (HEX & 0xF000) >> 12;
tempASCII[1] = (HEX & 0x0F00) >> 8;
tempASCII[2] = (HEX & 0x00F0) >> 4;
tempASCII[3] = (HEX & 0x000F) >> 0;
for (index = 0; index < 4; index++) {
switch (tempASCII[index]) {
case 0:*(ASCII + index) = '0'; break;
case 1:*(ASCII + index) = '1'; break;
case 2:*(ASCII + index) = '2'; break;
case 3:*(ASCII + index) = '3'; break;
case 4:*(ASCII + index) = '4'; break;
case 5:*(ASCII + index) = '5'; break;
case 6:*(ASCII + index) = '6'; break;
case 7:*(ASCII + index) = '7'; break;
case 8:*(ASCII + index) = '8'; break;
case 9:*(ASCII + index) = '9'; break;
case 10:*(ASCII + index) = 'A'; break;
case 11:*(ASCII + index) = 'B'; break;
case 12:*(ASCII + index) = 'C'; break;
case 13:*(ASCII + index) = 'D'; break;
case 14:*(ASCII + index) = 'E'; break;
case 15:*(ASCII + index) = 'F'; break;
default:break;
}
}
}
两个函数,应该还算是通俗易懂了!好了今天就到这里!明天如果有新的进展我会写出新的新的,最近回家之后在学习C51,写个小时钟。明天看写多少,尽量公布代码!第一次打算写个简单的时钟!