1.想通过串口传输大数据,在发送端,每次发送都只能发送4095;数据太多需要分多包发送,处理起来太麻烦,因此求方法。核心代码如下:
//设置串口缓存区等 好像没用,不知道是不是设置成了接收缓存区了?
int UartBuffSizeSet(int argc, char *argv[], char *dev_path,int size)
{
int ret;
int fd = open(dev_path, O_RDWR | O_NOCTTY | O_NONBLOCK);
if(fd < 0){
return -1;
}
//设置属性
int i = 0;
printf("====> argc:%d\n", argc);
for(i = 0; i < argc; i++)
{
printf("====> argv[%d] = %s\n", i, argv[i]);
}
if(argc > 1)
set_speed(fd, atoi(argv[1]));
else
set_speed(fd, 115200);
set_Parity(fd, 8, 1, 'n');
struct serial_struct serial;
ret = ioctl(fd, TIOCGSERIAL, &serial);
if (ret != 0) {
close(fd);
printf("error: get uart buff size is failed !\n");
return -2;
}
printf("Get uart buff size(%d) successed ret:%d!\n", serial.xmit_fifo_size, ret);
serial.xmit_fifo_size = 8*1024; //8k
ret = ioctl(fd, TIOCSSERIAL, &serial);
if(ret != 0) {
close(fd);
printf("error: set uart buff size is failed !\n");
return -3;
}
printf("Set uart buff size(%d) successed ret:%d !\n", serial.xmit_fifo_size, ret);
struct serial_struct serial2;
ret = ioctl(fd, TIOCGSERIAL, &serial2);
if (ret != 0) {
close(fd);
printf("error: get uart buff size is failed !\n");
return -2;
}
printf("Get uart buff size(%d) successed ret:%d!\n", serial2.xmit_fifo_size, ret);
//写数据
int data = 4;
char buf[1024*1024] = {0};
memset(buf, 0x66, sizeof(buf));
if(argc > 2 && atoi(argv[2]) < 1024 && atoi(argv[2]) > 0)
data = atoi(argv[2]);
ret = writen(fd, buf, data * 1024);
printf("=====> end:time:%lld \n", getSysTimeMs());
printf("write data len(%d) uart max seng buf len(%d); real send data len(%d)\n", data * 1024, serial.xmit_fifo_size, ret);
// ret = 0;
// while(1)
// {
// printf("=====> begin:time:%lld \n", getSysTimeMs());
// ret = writen(fd, buf, data * 1024);
// printf("=====> end:time:%lld \n", getSysTimeMs());
// printf("write data len(%d) uart max seng buf len(%d); real send data len(%d)\n", data * 1024, serial.xmit_fifo_size, ret);
// printf("====>Please enter any key to continue! \n");
// char buf[1024] = {0};
// scanf("%s", buf);
// }
//读数据
close(fd);
return 0;
}
//发送函数
ssize_t writen(int fd, const void *ptr, size_t n)
{
size_t nleft;
ssize_t nwritten;
nleft = n;
while(nleft > 0)
{
if ((nwritten = write(fd, ptr, nleft)) < 0)
{
// perror("write()");
//printf("====> nwritten:%d \n", nwritten);
if (nleft == n)
{
return -1;//error, return -1
}
else
{
// if(nleft > 0/* && check_fd_fine(fd) >= 0*/)
// {
// usleep(20);
// continue;
// }
// else
break;//error, return amount written so far
}
}
else if (nwritten == 0)
{
break;
}
nleft -= nwritten;
printf("====>n:%d nwritten:%d nleft:%d \n", n, nwritten, nleft);
ptr += nwritten;
}
return (n - nleft);//reutrn >=0
}