整体思路是,int类型数据有4个字节,而串口每次接收1字节,那么只需要将int拆为4份去传输,将每一位都位移到最低位,通过串口发送出去,接收的时候,将int的4位数据位移到原来的位置,然后或起来,这样就完成了int的还原
发送端
uint8_t uart_buf[MAX_BUF_SIZE];
void rain_send1(char g,int a,int b)
{
uint8_t _cnt = 0;
uart_buf[_cnt++] = '-';
uart_buf[_cnt++] = ',';
uart_buf[_cnt++] = g;
uart_buf[_cnt++] = '-';
uart_buf[_cnt++] = (a >> 24) & 0xFF;
uart_buf[_cnt++] = (a >> 16) & 0xFF;
uart_buf[_cnt++] = (a >> 8) & 0xFF;
uart_buf[_cnt++] = a & 0xFF;
uart_buf[_cnt++] = '/';
uart_buf[_cnt++] = (b >> 24) & 0xFF;
uart_buf[_cnt++] = (b >> 16) & 0xFF;
uart_buf[_cnt++] = (b >> 8) & 0xFF;
uart_buf[_cnt++] = b & 0xFF;
uart_buf[_cnt++] = ',';
uart_buf[_cnt++] = '^';
Usart_SendString(uart_buf, _cnt);
}
接收端
int x = RxBuffer1[4]<<24|RxBuffer1[5]<<16|RxBuffer1[6]<<8|RxBuffer1[7];
int y = RxBuffer1[8]<<24|RxBuffer1[9]<<16|RxBuffer1[10]<<8|RxBuffer1[11];
数据校验:
发送端:
#define MAX_BUF_SIZE 30
uint8_t uart_buf[MAX_BUF_SIZE];
uint8_t get_check_sum(uint8_t *data, uint16_t len) {
uint8_t sum = 0;
for(int i=0; i<len; i++) {
sum += data[i];
}
return sum;
}
void rain_send1(char g, int a, int b) {
uint8_t _cnt = 0;
// 打包数据
// ...省略
// 加入校验位
uart_buf[_cnt] = get_check_sum(uart_buf, _cnt);
_cnt++;
Usart_SendString(uart_buf, _cnt);
}
接收端:
void parse_buffer() {
//解析数据
//...省略
// 检验校验位
uint8_t sum = get_check_sum(uart_recv_buf, _cnt-1);
if(sum != uart_recv_buf[_cnt-1]) {
//校验错误
} else {
//校验正确,继续处理
}
}
Comments NOTHING