- 论坛徽章:
- 0
|
本帖最后由 tang_m_cong 于 2015-05-22 10:40 编辑
2个程序分别对2个互连的串口进行读写,我使用的是select来判断IO的读写,程序大致如下:
写串口的程序:- while (1)
- {
- FD_ZERO(&writefds);
- FD_SET(wfd, &writefds);
- to.tv_sec = 5;
- to.tv_usec = 50000;
- if ( select(wfd, &writefds, NULL, NULL, &to) )
- {
- if ( FD_ISSET(wfd, &writefds) )
- {
- n = write(wfd, buf, 1024);
- if (n<0)
- {
- perror("write");
- return -1;
- }
- }
- }
- }
复制代码
读串口:
- while (1)
- {
- FD_ZERO(&readfds);
- FD_SET(rfd, &readfds);
- to.tv_sec = 5;
- to.tv_usec = 50000;
- if ( select(rfd, &readfds, NULL, NULL, &to) )
- {
- if ( FD_ISSET(rfd, &readfds) )
- {
- do{
- n = read(rfd, (char *)&buf+offset, 1024);
- offset += n;
- }while (n > 0 );
-
- if ( offset == 1024)
- {
- offset = 0;
- }
- }
- }
- }
复制代码
我发现的问题是尽管我在读动作时,采用了do while结构,把数据读尽为止,但是实际上是,我写入1024个字节,并且我在写时也打印过实际写入的字节数,是1024,但读的函数部分却出现了无法读尽的现象。比如第一次跳出do while循环时offset的值会小于1024,我得多次进入do while才能读完数据。
我的猜想是:因为我读写的是串口,波特率是115200,那么1024个字节写完需要 (8+2) * 1024 /115200 = 0.088 s,也就是88毫秒,而读的速度远大于数据传输的速度,这样就导致读到某个位置时n为0了。
我感觉这样影响了数据的传输速度,有什么办法优化吗?按照理论值,115200波特率的传输速率大约是11KB/S左右,但是实际上我测试大概只有3KB/S。我整个程序类似于一个xmodem传输协议,采用1k-mode,排除应答,校验计算耗时,我想应该速度不会这么差。
|
|