ピットを埋めるシリアルポートはデータの不完全なパケットの解決方法を受け入れます
4217 ワード
シリアルポートを通じてパケットを送受信する時、1つのパケットが何度も完全な問題を受信することに出会って、シリアルポートの受信bufferの大きさの問題だと推測して、このような問題はパッチワークの形式で解決して、コードは少し巻いているように見えて、主に一定の大きさのbufferを申請して、2つのポインタを加えて実現します.コードは次のとおりです.
bd_packet_handleは主要な処理関数で、パッチワークのコードはここで、パッチワークのコードはここで、パッチワークの頭は$で、終わりは0 x 0 d 0 x 0 aで、具体的にコードを分析することができます
#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] = {0};
static unsigned int covert16_to_10(char *s){
int sum = 0;
int size = 0;
int i = 0 ,j = 0;
unsigned char num[100] = {'\0'};
while(*s != '\0'){
num[size++] = *(s++);
}
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')){
printf("Not is number\r
");
return -1;
}
else if((num[0] >= '0' && num[0] <= '9')){
j = 0;
}
for(i = j;i < size;i++){
//printf("%c",num[i]);
if(num[i] >='0' &&num[i] <='9')
sum += (num[i] - '0') * pow(16,size-i-1);
if(num[i] >='a' &&num[i] <='f')
sum += (num[i] - 'a' + 10) * pow(16,size-i-1);
if(num[i] >='A' &&num[i] <='F')
sum += (num[i] - 'A' + 10) * pow(16,size-i-1);
}
//printf(" sum %d
",sum);
return sum;
}
static int send_bd_packet(unsigned char *buf,int len)
{
int ret = 0;
ret = write(g_bd_dev.uart_fd,buf,len);
if(ret < 0){
pr_info("send packet faild");
return -1;
}
return ret;
}
int bd_packet_parse(unsigned char *bd_buf)
{
}
int bd_packet_handle(int fd)
{
int ret = 0,i = 0,j = 0;
int len = 0;
unsigned char tmp = 0;
unsigned char recv_buf[PACKET_SIZE] = {0};
unsigned char tmp_buf[PACKET_SIZE] = {0};
memset(recv_buf,0,PACKET_SIZE);
memset(tmp_buf,0,PACKET_SIZE);
ret = read(fd,recv_buf,sizeof(recv_buf));
if(ret < 0){
pr_info("bd read buf faild");
return ret;
}
#if 0
printf("ret %d
",ret);
printf("recv_buf :%s
",recv_buf);
#endif
if(data_len + ret >= PACKET_SIZE || fp_count >= PACKET_SIZE){
memset(data_buf,0,PACKET_SIZE);
data_len = 0;
fp_count = 0;
}
i = 0;
while(i < ret){
data_buf[data_len] = recv_buf[i];
i++;
data_len++;
}
#if 0
printf("data_buf :%s
",data_buf);
printf("fp_count :%d
",fp_count);
#endif
do_cpy:
i = fp_count;
tmp = 0;
while(tmp != '$' && i < data_len){
tmp = data_buf[i];
i++;
}
fp_count = i - 1;
#if 0
printf("fp_count :%d
",fp_count);
printf("data_len :%d
",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 = data_buf[i];
if(tmp == '$'){
fp_count = i;
i = 0;
goto do_cpy;
}
tmp_buf[j] = tmp;
i++;
j++;
}
#if 0
printf("tmp_buf :%s
",tmp_buf);
printf("i :%d , j :%d
",i,j);
#endif
if(tmp_buf[j-2] != 0x0d && tmp_buf[j-1] != 0x0a){
//printf("Invalid data
");
return -1;
}
fp_count = i;
//printf("fp_count :%d
",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){
//printf("recv_buf %s
",recv_buf);
ret = bd_packet_parse(recv_buf);
if(ret < 0){
//pr_info("bd packet_parse faild");
return ret;
}
}
if(i < data_len){
goto do_cpy;
}
return ret;
}
bd_packet_handleは主要な処理関数で、パッチワークのコードはここで、パッチワークのコードはここで、パッチワークの頭は$で、終わりは0 x 0 d 0 x 0 aで、具体的にコードを分析することができます