串口读取数据只能一次读取17个字节,写可以写256

weixin_39441714 2017-11-07 05:18:37
int OpenDev(char *Dev)
{
speed_t speed;
int i=0;
int fdt,c=0,num;
struct termios oldtio,newtio;
speed = getBaudrate(115200);
fdt=open(Dev,O_RDWR | O_NONBLOCK| O_NOCTTY | O_NDELAY);
if(fdt<0)
{
perror(Dev);
exit(1);
}
//save to oldtio
tcgetattr(fdt,&newtio);
//clear newtio
bzero(&newtio,sizeof(newtio));
// newtio.c_cflag = speed|CS8|CLOCAL|CREAD|CRTSCTS;
//newtio.c_cflag&=~CSIZE;
oldtio.c_cflag |=CS8;
newtio.c_cflag = speed|CS8|CLOCAL|CREAD;
newtio.c_iflag = IGNPAR;
//newtio.c_oflag &=~OPOST;
newtio.c_oflag &=~OPOST;
// newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
/*Input*/
//printf("newtio.c_cflag=%x\n",newtio.c_cflag);
tcflush(fdt,TCIFLUSH);
tcsetattr(fdt,TCSANOW,&newtio);
// tcgetattr(fdt,&oldtio);
//printf("oldtio.c_cflag=%x\n",oldtio.c_cflag);
return fdt;
}


void read_port(void)
{


char dev_id[32];
int kj_id,ret;
FD_ZERO(&rd);
FD_SET(fd,&rd);
timeout.tv_sec = 1;
timeout.tv_usec = 500;
char read_tmp[256];
int i;
retval = select (fd+1,&rd,NULL,NULL,&timeout);
char fbuf[256];
switch (retval)
{
case 0:
printf("no data input within 1s.\n");
break;
case -1:
perror("select");
break;
default:
memset(fbuf,0,sizeof(fbuf));

if((nread=read(fd,read_tmp,256))>0)
{

printf("%d\n",nread);
printf("read1:%s\n",read_tmp);
}



// tcflush(fd,TCIOFLUSH);
SERIAL_DATA_SET getSerialData;
printf("nlen :%d\n",nread);
// read_tmp[nread+1]="\0";
// read_tmp[256]="\0";
printf("%s\n",fbuf);
char buf[512];
printf("%s\n",read_tmp);
memset(&getSerialData, 0, sizeof( SERIAL_DATA_SET));
xml2s_get_serial_req((const char *)fbuf, &getSerialData);
//ret=memcpy(judgmentbuf,read_tmp[0],1);
char xmlData[512];
printf("Resurt:%d\n",getSerialData.Resurt);
printf("DevID:%s\n",getSerialData.DevID);
printf("SNnum:%s\n",getSerialData.SNnum);
memset(xmlData,0,sizeof(xmlData));
sprintf(xmlData,
"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"
"<GET_SERIAL_RECORDS_RES>\n"
" <Resurt>%d</Resurt>\n"
" <DevID>%s</DevID>\n"
" <SNnum>%s</SNnum>\n",
getSerialData.Resurt,
getSerialData.DevID,
getSerialData.SNnum
);
printf("%s\n",xmlData);
if(ret<0)
{
perror("judgmentbuf");

}
printf("11\n");

if(getSerialData.Resurt==1)
{
memcpy(buf,read_tmp+1,9);
printf("888\n");
//kj_id= atoi(buf);

ret=set_config_param_str("/mnt/nand/cms.cfg","DevID",buf);
if(ret<0)
{
printf("set DevID error\n");
}

ret=get_config_param_str("/mnt/nand/cms.cfg","DevID",dev_id,32);
if(!strcmp(buf,dev_id))
{
int ii;
char serialRepaly[512];
sprintf(serialRepaly,
"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"
"<GET_SERIAL_RECORDS_RPY>\n"
" <Resurt>%d</Resurt>\n"
" <DevID>%s</DevID>\n"
" <SNnum>%s</SNnum>\n",
1,
getSerialData.DevID,
getSerialData.SNnum
);
ii=write(fd,serialRepaly,sizeof(sendpack));
printf("%s\n",serialRepaly);
if(ii==sizeof(sendpack))
{}
else
{
printf("send error \n");}
//
if(sendnum<65535)
{
sendnum++;
}
else
{
sendnum_times++;
sendnum=1;
}
}
}
msleep(500);

fflush(stdin);


#if 0
if(recenum<65535)
{
recenum++;
}
else
{
recenum_times++;
recenum=1;
}
#endif


}
}
...全文
588 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
ckc 2017-11-08
  • 打赏
  • 举报
回复
这个应该是硬件限制,串口缓冲区有16个字节,接收寄存器里还有一个,一共17个 你想读再多,没有了。 长时间不读,超过17的数据丢失了,因为没地方放 写的时候可以放内存中,所以可以一次多写一些

18,777

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 专题技术讨论区
社区管理员
  • 专题技术讨论区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧