- 論壇徽章:
- 0
|
本帖最后由 tang_m_cong 于 2015-05-22 10:40 編輯
2個(gè)程序分別對2個(gè)互連的串口進(jìn)行讀寫,我使用的是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;
- }
- }
- }
- }
復(fù)制代碼
讀串口:
- 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;
- }
- }
- }
- }
復(fù)制代碼
我發(fā)現(xiàn)的問題是盡管我在讀動作時(shí),采用了do while結(jié)構(gòu),把數(shù)據(jù)讀盡為止,但是實(shí)際上是,我寫入1024個(gè)字節(jié),并且我在寫時(shí)也打印過實(shí)際寫入的字節(jié)數(shù),是1024,但讀的函數(shù)部分卻出現(xiàn)了無法讀盡的現(xiàn)象。比如第一次跳出do while循環(huán)時(shí)offset的值會小于1024,我得多次進(jìn)入do while才能讀完數(shù)據(jù)。
我的猜想是:因?yàn)槲易x寫的是串口,波特率是115200,那么1024個(gè)字節(jié)寫完需要 (8+2) * 1024 /115200 = 0.088 s,也就是88毫秒,而讀的速度遠(yuǎn)大于數(shù)據(jù)傳輸?shù)乃俣,這樣就導(dǎo)致讀到某個(gè)位置時(shí)n為0了。
我感覺這樣影響了數(shù)據(jù)的傳輸速度,有什么辦法優(yōu)化嗎?按照理論值,115200波特率的傳輸速率大約是11KB/S左右,但是實(shí)際上我測試大概只有3KB/S。我整個(gè)程序類似于一個(gè)xmodem傳輸協(xié)議,采用1k-mode,排除應(yīng)答,校驗(yàn)計(jì)算耗時(shí),我想應(yīng)該速度不會這么差。
|
|