最近遇上一個問題,工業儀器設備越來越多採用USB介面取代RS-232,造成原本RS-232設備無法對接。就介面標準來看,在工業使用上 RS-232 是點對點的通訊協定,沒有主從分別的傳輸介面,傳輸距離數十公尺遠,如果再轉成 RS-485 傳輸距離更遠。相對於USB,具有主從架構的傳輸介面,因為來自電腦介面的標準,傳輸線距離僅數公尺遠。然而,坊間看到的 USB To RS232 轉換線只是 USB slave,必須接到電腦 (USB host),這種傳輸線無法直接接 USB儀器 (USB slave),所以我先要找到一個 USB host 轉換中介,再寫一個轉換程式後,才能把 USB儀器的數據轉到 RS-232 設備上。

 

        目前找到的 USB host 開發平台有 FTDI VNC2 樹莓派 ...等方法,FTDI VNC2具有 USB host 接口功能,就像小型嵌入式系統,兼具體積小的特點,不過我們必須用 FTDI 專用的 IDE 來開發程式。而樹莓派本身就是一個以 Linux 為核心的操作平台,猶如一台小型電腦,可直接在上面以 C++ 語言來開發轉換程式,相較來說比較便利。底下我採用樹莓派的轉換方案,圖一是設備之間的方塊圖,中間以樹莓派系統當作轉換的中介,圖右邊的USB工業儀器接到樹莓派之後,樹莓派的操作系統便能辨識出 USB 裝置當作一個 ttyUSB串口,我們開發一個轉換程式將從這個串口接收到的數據轉傳到圖左邊的串口。網路上有很多 ttyUSB 串口傳輸的程式,可以下載研究看看,圖三是我程式開發的流程圖。

 

圖一:解決方案方塊圖

 

圖二:實際操作的照片

 

圖三:程式設計的流程圖

int main(int argc, char **argv)

{

int  i;

char outBuf[32];

pthread_t threads[4];


memset( Buffer, 0 , sizeof(Buffer) );

for(i = 0; i < 4; i++)

{

usbPort[i] = fd[i] = -1;

threads[i] = -1;

idx[i] = 0;

 

pthread_create(&threads[i], NULL, RecvData, (void *)i);

}


while( 1 )

{

UsbDiscovery();

for(i = 0; i < 4; i++)

{

if( fd[i] == -1 ) continue;

 

if( usbPort[i] == PL2303 )

{

sprintf(outBuf, "S%d:N%d\r\a", abs(slope), noise);

write(fd[i], outBuf, strlen(outBuf));

}

// fprintf(stdout, "%d:(%d) %d:%d\n", i, idx[i], slope, noise);

}


sleep(1);

}


for(i = 0; i < 4; i++)

{

if( fd[i] != -1 ) close(fd[i]);

}

        fprintf(stdout, "Close...\n");

return 0;

}


樹莓派開機自動啟動的方式

參考:https://www.jianshu.com/p/86adb6d5347b

文章標籤
全站熱搜
創作者介紹
創作者 漢亞科技 Han-Ya 的頭像
漢亞科技 Han-Ya

漢亞科技 Han-Ya

漢亞科技 Han-Ya 發表在 痞客邦 留言(0) 人氣(40)