填坑之串列埠接受資料不完整包的解決辦法

2021-09-29 09:12:40 字數 2455 閱讀 7735

通過串列埠收發包時,遇到了乙個包多次才接收完整的問題,猜測是串列埠的接收buffer大小的問題,這種問題採取的是拼包的形式解決,**看起來略微繞,主要是申請了一定大小的buffer,外加兩個指標實現。**如下:

#include #include #include #include #include #include #include #include #include #include #include #define packet_size 1024

unsigned int fp_count = 0,data_len = 0;

unsigned char data_buf[packet_size] = ;

static unsigned int covert16_to_10(char *s);

while(*s != '\0')

if(num[0] == '0' && (num[1] == 'x' || num[1] == 'x'))

j = 2;

else if((num[0] >= 'a' && num[0] <= 'z') || (num[0] >= 'a' && num[0] <= 'z'))

else if((num[0] >= '0' && num[0] <= '9'))

for(i = j;i < size;i++)

//printf(" sum %d\n",sum);

return sum;

}static int send_packet(unsigned char *buf,int len)

return ret;

}int packet_parse(unsigned char *bd_buf)

int packet_handle(int fd)

; unsigned char tmp_buf[packet_size] = ;

memset(recv_buf,0,packet_size);

memset(tmp_buf,0,packet_size);

ret = read(fd,recv_buf,sizeof(recv_buf));

if(ret < 0)

#if 0

printf("ret %d\n",ret);

printf("recv_buf :%s\n",recv_buf);

#endif

if(data_len + ret >= packet_size || fp_count >= packet_size)

i = 0;

while(i < ret)

#if 0

printf("data_buf :%s\n",data_buf);

printf("fp_count :%d\n",fp_count);

#endif

do_cpy:

i = fp_count;

tmp = 0;

while(tmp != '$' && i < data_len)

fp_count = i - 1;

#if 0

printf("fp_count :%d\n",fp_count);

printf("data_len :%d\n",data_len);

#endif

memset(tmp_buf,0,packet_size);

i = fp_count;

j = 0;

tmp = 0;

tmp = data_buf[i++];

tmp_buf[j++] = tmp;

tmp = 0;

while(tmp != 0x0a && i < data_len )

tmp_buf[j] = tmp;

i++;

j++; }

#if 0

printf("tmp_buf :%s\n",tmp_buf);

printf("i :%d , j :%d\n",i,j);

#endif

if(tmp_buf[j-2] != 0x0d && tmp_buf[j-1] != 0x0a)

fp_count = i;

//printf("fp_count :%d\n",fp_count);

memset(recv_buf,0,packet_size);

memcpy(recv_buf,tmp_buf,strlen((const char * )tmp_buf));

len = strlen((const char * )recv_buf);

if(recv_buf[0] == '$' && recv_buf[len - 2] == 0x0d && recv_buf[len - 1] == 0x0a)

} if(i < data_len)

return ret;

}

packet_handle是主要的處理函式,拼包的**就在這裡,包頭是$,結尾是0x0d 0x0a,具體可以分析**

java讀取串列埠資料不完整

從串列埠讀取位元組之前先延時50ms,之前!之前!之前!後面又出現了問題,傳送指令也需要延時!否則一條指令傳送不完整,獲取到的應答包就會出錯。public static byte readfromport serialport serialport try catch interruptedexce...

C 解決串列埠接收資料不完整

使 用快取機制完成。首先通過定義乙個成員變數listbuffer new list 4096 用來存放所有的資料,在接收函式裡,通過buffer.addrange 方法不斷地將接收到的資料加入到buffer中,並同時對 buffer中的資料進行檢驗,如果達到一定的長度並且校驗結果正確 校驗方法在傳送...

C 解決串列埠接收資料不完整

使用快取機制完成。首先通過定義乙個成員變數listbuffer new list 4096 用來存放所有的資料,在接收函式裡,通過buffer.addrange 方法不斷地將接收到的資料加入到buffer中,並同時對 buffer中的資料進行檢驗,如果達到一定的長度並且校驗結果正確 校驗方法在傳送方...