一:小四轴通讯协议。小四轴和上位机采用下面的协议方式进行通讯:数据头+数据+校验码+数据尾。所有数据采用ASC码的方式进行通信。 数据头: 0x3A(对应字符:) 数据区:0x30-0x39,0x41-0x46 (分别对应0-9,A-F的ASC码) 检验码:采用相加和为00的方式 数据尾:0x2F (对应字符/) 二:小四轴接收数据的代码结构。小四轴在串口中断中接收数据,并完成数据的校验。具体实现方法是: 第1步:串口中断触发,如果是接收中断,则从串口缓冲读取数据。相对应的实现代码是:com_receive_data=USART_ReceiveData(USART1); 第2步: 检查该数据是不是数据头:0x3A(对应字符:),如果是,则把接收数据的缓冲区指针移到开头。相对应的实现代码是: if(com_receive_data==AnBT_Command_Head) com_receive_str_index=0; 第3步:检查该数据是不是数据尾:0x2F (对应字符/),如果是,则进行数据校验。相对应的实现代码是: else if(com_receive_data==AnBT_Command_Tail) … 第4步:如果不是数据头,也不是数据尾,则把数据装入缓冲区,并移动数据缓冲区指针到下一个位置。相对应的实现代码是: else {com_receive_str_buf[com_receive_str_index] = com_receive_data; com_receive_str_index++; } 通过上述步骤,数据缓冲区包含了上述协议中所描述的数据区和校验码,并且通过数据缓冲区指针,我们可以知道数据缓冲区中数据的长度。 三:小四轴接收数据的校验方法。 第1步:首先把数据区的数据进行相加。由于数据缓冲区包含了数据区和校验码,所以在数据相加的时候,注意不要包含校验码的相加。相对应的实现代码是: for(i=0;i com_data_checksum += com_receive_str_buf; 第2步:把校验码从数据缓冲区取出。由于校验码位于数据缓冲区的最后位置,所以相对应的实现代码是: receive_data_checksum_low=com_receive_str_buf[com_receive_str_index-1]; receive_data_checksum_high=com_receive_str_buf[com_receive_str_index-2]; 第3步:把校验码从ASC码转换成数据。我们知道,数字0到9的ASC码是48-57,字符A-Z的ASC码是65-90,所以对应的转换代码是: if(receive_data_checksum_low>58) com_receive_data_checksum_low-=55; else receive_data_checksum_low-=48; 第4步:合并校验码的高位和低位: com_receive_data_checksum= ((receive_data_checksum_high<<4)&0xf0)|( receive_data_checksum_low&0x0f) 第5步:把从第1步中计算出来的数据区校验和和第4步中得到的校验码进行相加,并检查结果是否为0,对应的代码是: com_data_checksum=com_data_checksum+receive_data_checksum; if(com_data_checksum==0) … 通过上述步骤,我们实现了对数据的校验。
|