通過串列埠收發包時,遇到了乙個包多次才接收完整的問題,猜測是串列埠的接收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中的資料進行檢驗,如果達到一定的長度並且校驗結果正確 校驗方法在傳送方...