2016-12-16 115 views
1

我想這對某些串行端口(即ttyS9)寫串行端口在Linux

motordrivers通過cutecom(十六進制輸入),機器人程序,我可以把下面的輸入,這給了我結果我想到:

5aaa0700fffff000 

現在我想實現一個C程序,即執行以下操作相同的結果:

int port9 = open("/dev/ttyS9", O_RDWR | O_NONBLOCK); 

char buff[17] = "5aaa0700fffff000"; 

write(port9, buff, 16); 

我也試過初始化buff seperately的十六進制值:

buff[0] = 0x5; 
buff[1] = 0xa; 

等等等等

兩個不工作。我的代碼或驅動程序中存在問題嗎?

我使用gcc編譯,然後用sudo運行它。 open函數還返回適當的值(無錯誤)以及寫入值。

+0

看[問]並提供[mcve]。不要像管理員那樣運行這樣的代碼。 – Olaf

回答

4

用字符串填充字符數組會將字符轉換爲不是hex的ascii表示形式。

char buff[17] = "5aaa0700fffff000"; // Incorrect for saving 0x5aaa0700fffff000 to buff 

依我之見,你想要寫串口8字節0x5aaa0700fffff000,一個char是8位(1個字節),你必須發送8個字節不是16,所以代碼應該是這樣的

buff[0] = 0x5a; 
buff[1] = 0xaa; 
... 
write(port9, buff, 8); 
+0

謝謝,這個工程!然而,我發現它只在我打開cutecom的時候有效,它打開了ttyS6或ttyS9,然後它只對這些端口分別工作。任何想法如何這是可能的? –

+0

我們不知道OP是否使用ASCII編碼。而且我們也不知道OP是否使用字符。實際上使用終端工作是一個指標,可能是字符。 – Olaf

+0

@ bart-kn - 沿着奧拉夫所說的路線......當您從串行終端手動*鍵入*序列時,它會起作用嗎?你是否必須按下「Enter」或「Return」才能使命令生效?如果*是*這兩個問題,你可能會缺少一個行尾字符或字符。無論是'\ r'',''\ n''還是'「\ r \ n」'。如果是這樣的話,你可能需要發送一些像'char buff [18] =「5aaa0700fffff000 \ n」'。 –

-1

,但也許這是一個數量 所以你需要 unsigned long long int t= 0x5aaa0700fffff000; write(.., (char *)&t, 8);

這意味着字節順序在內存中是一個當你從屏幕上閱讀它,你會用它分配字節獲得完全不同的。

+0

...將調用未定義的行爲... long long int可能是64位長,但肯定不是128位 – LPs

+0

@LPs:long long是**至少** 64位。它可以有128位或更多位。 – Olaf

+0

這是一條評論,不是答案。 – Olaf