为什么我使用read()时一次只能获得一个字符?

时间:2015-09-12 10:33:19

标签: c linux

我直接连接TTY的Tx和Rx,然后我将一个字符串写入TTY,然后,我使用read()期望获得我之前写过的相同字符串。当我运行该程序时,我发现我可以将整个字符串写入TTY一次,但是我只能在每次使用read()时读取一个字符。请帮我弄清楚为什么会发生这种情况,以及如何我可以解决这个问题。 我使用的系统是Ubuntu14.04,编译器是gcc 4.8.2。谢谢!

这是我写的主要功能:

ROLE_ADMIN

这是程序的结果:

int main(){
int fd;
fd = open("/dev/ttyUSB0",O_RDWR);
if(fd == -1)
{
    perror("serialport error\n");
}
else
{
    printf("open ");
    printf("%s",ttyname(fd));
    printf(" succesfully\n");
}

set_speed(fd,115200);
if (set_Parity(fd,8,1,'N') == FALSE)  {
    printf("Set Parity Error\n");
    exit (0);
}
char buf[100] = "aaaaaaaaaa";
char buf_r[100]= "12314";
int wl= write(fd,buf,strlen(buf)+1);
printf("write succesfully length %d\n",wl);
int rl=read(fd,buf_r,100);
printf("read succesfully length %d\n",rl);
while (rl<wl){
  rl+=read(fd,buf_r+rl,100);
  printf("read succesfully length %d\n",rl);
}
printf("buf_r=%s\n",buf_r);
close(fd);
return 0;}

1 个答案:

答案 0 :(得分:2)

简短回答:计算机速度很快,串口很慢。

使用您正在使用的设置(8无1),每个字符需要10位时间进行发送(1个起始位,8个数据位,0个奇偶校验位,1个停止位)。由于波特率为115200,因此字符传输速率为每秒11520个字符。所以每个角色需要87微秒。发送11个字符需要957微秒,或大约1毫秒。

在现代处理器上调用read(数据等待)只需几微秒。因此,代码可以比串行端口传输数据更快地读取数据。

作为一项简单的测试,请在usleep(1000)之前致电read,然后您应该将所有数据合并到一个read