2013-10-28 77 views
0

我有一個通過串口連接到Matlab的Cyber​​Glove。我正在嘗試編寫一個請求數據樣本的命令,然後再讀取樣本。在Matlab中串行端口讀/寫的問題

我已經成功連接用下面的代碼手套:

s = serial('/dev/ttyS0') 
set(s,'BaudRate',115200) 
fopen(s) 

我然後可以寫/讀來獲取傳感器信息或二進制或ASCII。

在二進制我做:

fwrite(s,'G') 
fread(s) 

fread總是超時,然後吐出來看似隨機的長度含有無意義整數(1-100 +)的列向量。

用ASCII,該命令是:

fprintf(s,'g') 
fscanf(s) 

這給出了一個空字符串作爲讀出值。但我知道,手套越來越多,至少在一定程度上處理了命令,因爲如果我給它一個無效的命令,我會收回錯誤消息e?

雖然這讓我很困惑,但我意外地發現了一種方法來從手套中獲得正確的閱讀。

fread(s)(其中超時,並給出了看似隨意輸出)

fprintf(s,'g')

fscanf(s)

然後我得到字符串輸出'g 1 76 93 113 89 42 20 77 98 106 117 81 62 23 52 60 34 68 57 254 92 26',這是正確的。

我的問題是:

(1)爲什麼最後一部分會產生正確的響應?

(2)如何從二進制命令中讀取數據?這是我真正想要獲得的。

+0

這聽起來像是它更多的問題與設備的通信協議,而不是一個Matlab問題。 –

+0

那麼,看起來我應該可以在其他方面測試它,然後呢?有沒有一種簡單的命令行方法可以用於此? – Pterosaur

+0

好問題......不知道這是否是最好的方法,但我想你可以使用'cat/dev/ttyS0'來讀取和'printf ...>/dev/ttyS0'進行寫入。 printf是內置的bash。但我建議的第一件事是檢查設備的文檔,看看你是否瞭解一切。 –

回答

1

找出問題所在: 超時發生的原因是它並沒有回到它預期的那麼多的字節數,並且它期待着不正確的數字。默認情況下,get(s, 'InputBufferSize')返回512,而實際數據是24個字節。在調用fopen(s)之前,我只是運行了set(s, 'InputBufferSize', 24);,並從我預期的二進制讀/寫中獲得了正確的24位8位整數,而沒有超時。