串口int发送和接收

发布于 2023-08-01  371 次阅读


整体思路是,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 {
    //校验正确,继续处理
  }

}
  • alipay_img
  • wechat_img
想法不去做终究就只是想法
最后更新于 2023-08-01