2014-09-11 40 views
1

新開發人員,Linux,C++,USB - 串行適配器。Linux新手:C++打開和關閉USB端口問題

我已經完成了可以寫入USB端口的程序。但是,如果我更改了我的代碼,請以root身份重新登錄,然後嘗試再次寫入端口,但未通過。只有當我從計算機上拔下USB電纜並重新嘗試重新發送數據之前,它纔會起作用。如果您需要更多信息,請告訴我。

我在兩臺不同的計算機上,無法複製和粘貼,但這裏是我正在做的事情的要點。

int fd = 0; 
int iOut = 0; 
char *ComPort = "/dev/ttyUSB0"; 

fd=open(ComPort, O_CREAT | O_RDWR | O_NOCTTY | O_NDELAY); 

if(fd == -1) 
    cout << "unable to open" << endl; 

// blah blah getting data ready to be sent 
// create a block of 50 hex characters to be sent : DB 

iOut = write(fd, $DB, sizeof(DB)); 

// blah blah error checking 

close(fd); 
return(0); 
+0

'它不通過' - 請解釋一下,你有什麼錯誤。另外,如果您在不改變它的情況下運行兩次程序會發生什麼? – 2014-09-11 13:35:33

+0

'0_CREAT'是'O_CREAT'? 0(零)-O(大寫o) – Surt 2014-09-11 13:39:21

+0

@AlexFarber我沒有收到錯誤。我正在做的事情有一個顯示,我想顯示一個特定的號碼。所以,如果我開始新鮮,並顯示1,它會起作用。然後,如果我更改我的src代碼以使其顯示2,它將保持在1.如果我從計算機上拔下USB並重新安裝並再次發送數據,它將顯示2.如果我不更改代碼並重新發送相同的數據,它保持在1. – JonB55 2014-09-11 13:43:11

回答

1

採取在看看這裏http://www.tldp.org/HOWTO/Serial-Programming-HOWTO/x115.html 3.2章添加一些錯誤首先檢查的,所以你可以看到,如果失敗在哪裏。恐怖行將在那裏幫助。

if (fd <0) {perror(ComPort); exit(-1); } // note the exit which your code doesn't have. 

現在,這應該告訴你一些更多的信息和所有操作之後,添加

if (errno) {perror(ComPort); exit(-1); } 

,讀,寫和FD上設置的東西。

現在將3.2的newtio部分添加到您的程序中,以防某些握手失敗。你必須改變它,以便它符合顯示器。

程序的最終版本可能更像3.3。

+0

你從哪裏得到errno? @Surt – JonB55 2014-09-11 14:23:09

+0

將所有文件操作設置爲它的一個線程本地全局變量,請參閱http://linux.die.net/man/3/open – Surt 2014-09-11 14:25:50

+0

也我在if(fd <0){perror(ComPort)中添加;退出(-1);當我開始新鮮(重新安裝USB)並且沒有重新安裝時,沒有任何行爲改變。在第一次寫完之後,在經過幾次後也沒有失敗。 – JonB55 2014-09-11 14:26:20

2

@Surt @alexfarber我和同事談了這個,我們得出結論,這很可能是我的顯示器或USB到串行適配器的硬件問題。我相信唯一可以使用這種特殊適配器的方法是關閉電源,然後重新打開電源,以反映在手動移除和重新安裝時會看到的內容。我不相信這是可能的,但我會開始另一個線程與我可能遇到的任何事情。我很感謝大家花時間幫助這一點,我在學習之前還了解了其他許多我不知道的事情,所以這仍然非常有幫助。再一次感謝你。