字符串中搜索数据,且清除原字符串中无用数据

         在单片机开发中,我们会存在接收到一个字符串,但是这个字符串中,有写干扰的数据,这时我们就需要截取里面有用的数据。

        比如串口接收数据,我们是用一个buffer[255]数组进行缓存,数组里面就会有多个数据指令。这时我们就需要一个一个的提取指令,提取了对应的指令数据后,那该数据地址前面的数据就需要清除(去除该指令数据,以及该缓存数组中前面没用的数据)。

        通过下面的示例代码,在一个buffer[255]大小的数组中,查找一个 “ 以0xff开头,0xfe结尾,数据长度为5 ” 的数据,提取该数据,保存到buff[5]数组中,然后把buffer[255]的首地址左移,移动到0xfe的下一位。

        从而达到提取数据,并把buffer[255]里面提取的数据清除,以及前面地址没用的数据给清除。

#include 
#include 
#include 

#define	uint8_t	unsigned char
#define BUFFER_SIZE 255
#define BUFF_SIZE 5




/**********************************************************************************************
	函数功能:
		①找到数组中以0xff开头,以0xfe结尾的字符串,并保持到buff数组中
		②把原buffer数组中0xfe以前的数据全部丢弃,以0xfe的下一个数据作为buffer的首地址
**********************************************************************************************/
void move_buffer(uint8_t* buffer, uint8_t* buff) {
    uint8_t* start_ptr = buffer;
    uint8_t* end_ptr = NULL;
    uint8_t* dest_ptr = buff;

	// 在缓冲区中查找第一个以0xff为开头的字节
    while ((*start_ptr != 0xff) && ((start_ptr-buffer) < BUFFER_SIZE)) {
        start_ptr++;
    }

    if ((start_ptr-buffer) == BUFFER_SIZE) {
        return;
    }

	// 在缓冲区中查找第一个以0xfe为结尾的字节
    end_ptr = start_ptr + 1;
    while ((*end_ptr != 0xfe) && ((end_ptr-buffer) < BUFFER_SIZE)) {
        end_ptr++;
    }

    if (end_ptr - buffer == BUFFER_SIZE) {
        return;
    }

	// 计算需要复制和清空的字节数
    uint8_t length = end_ptr - start_ptr;
    memcpy(dest_ptr, start_ptr, length+1);

    // 清除复制数组前的数据,并左移全部数据
    memcpy(buffer, end_ptr+1, BUFFER_SIZE-length);


}

int main() {
    uint8_t buffer[BUFFER_SIZE] = {2,3,4,5,0xff,0x01,0x02,0x03,0xfe,6,7,8,9,10,11};//例如接收到的串口字符串的数组
    uint8_t buff[BUFF_SIZE] = {0};

    move_buffer(buffer, buff);//调用功能函数

	//显示搜索到的数据
    printf("Found data in buffer: ");
    for (uint8_t i = 0; i < BUFF_SIZE; i++) {
        printf("%d ", buff[i]);
    }
    printf("\n");

	//显示最新的字符串数据
    printf("New buffer: ");
    for (uint8_t i = 0; i < BUFFER_SIZE; i++) {
        printf("%d ", buffer[i]);
    }
    printf("\n");


}

你可能感兴趣的:(C语言,java,开发语言,c语言,stm32)