簡體   English   中英

使用 FTDI 電纜不支持 RS485 通信

[英]RS485 communication not supported using FTDI cable

我正在嘗試將通過 RS485 半雙工 UART 通信的程序移植到 Raspberry Pi。 由於 Pi 的內置 UART 不支持 RS485 標准,我使用的是 USB-RS485-WE-1800-BT FTDI 電纜

連接后,我可以確認電纜的 FTDI 芯片出現在dmesg ,加載了ftdi_sio驅動程序,並正確地將/dev/ttyUSB0串行終端暴露給系統的其余部分。 但是,當我嘗試從一個簡單的 C 程序啟用 RS485 模式時:

struct serial_rs485 config = {
  .flags = SER_RS485_ENABLED | SER_RS485_RTS_ON_SEND,
  .delay_rts_before_send = 0,
  .delay_rts_after_send = 0
};
if (ioctl(fd, TIOCSRS485, &config) < 0) {
    fprintf(stderr, "ioctl failed (%d): %s\n", errno, strerror(errno));
    exit(0);
}

...我收到以下錯誤:

ioctl failed (25): Inappropriate ioctl for device

查看原理圖,我意識到 FTDI 電纜內部使用 2 個組件:

  1. FT232R 芯片,由ftdi_sio驅動程序通過 USB 控制並產生常規串行輸出,以及
  2. ZT485EEN 芯片,將傳統的串行通信轉換為 RS485。

因此,鑒於 FT232R 在技術上不發出 RS485,我理解為什么當要求啟用 RS485 模式時它的驅動程序會抱怨。 但是,它不知道的是,第二個芯片透明地處理格式轉換。

研究了這個話題並閱讀了類似問題的答案,我現在很好奇如何繼續。 我應該將ioctl()調用中的請求 ID 更改為TIOCSRS485以外的其他TIOCSRS485嗎? 我應該完全刪除ioctl()調用嗎? 如果我這樣做,如何設置 RS485 標志和 RTS 延遲? 最后,如果這意味着在此配置中不需要啟用 RS485 模式,是否可以通過使用 Raspberry Pi 的內置 UART 與 ZT485EEN 之類的芯片組合來完全繞過 FTDI 電纜?

我應該將ioctl()調用中的請求 ID 更改為TIOCSRS485以外的其他TIOCSRS485嗎? 我應該完全刪除ioctl()調用嗎?

在這種情況下,刪除ioctl()將是合適的做法,因為串行轉換器完全為您處理它。 就您而言,它只是您讀寫的串行端口。

如果我這樣做,如何設置 RS485 標志和 RTS 延遲?

您不能使用 FTDI 電纜設置任何標志或延遲。 但是,由於從電纜中出來的數據已經是 RS485,因此無需進行任何設置。 只要您正在通話的是半雙工(它不會與您同時通話),這都不是問題,您可以像使用 RS232 電纜一樣使用它。 不過,這取決於您的特定用例。 我從未遇到過需要 RTS 延遲的情況。

最后,如果這意味着在此配置中不需要啟用 RS485 模式,是否可以通過使用 Raspberry Pi 的內置 UART 與 ZT485EEN 之類的芯片組合來完全繞過 FTDI 電纜?

當然,你可以這樣做。 您還可以使用許多不同型號的 RS485 收發器; Electronics.SE 將是詢問更多信息的地方。 此時您可能需要使用TIOCSRS485啟用 RS485 ,但這將取決於驅動程序。 我不知道 Pi,但至少在我在設置 RS485 模式之前使用過的一些 Atmel 芯片上,在芯片上的外圍設備中設置了某個位,該位會自動切換 RTS 引腳以啟用/禁用 RS485 收發器; 否則,Linux 需要切換 GPIO 以將收發器設置為正確的狀態。

特別是在 FTDI 上,可以設置在適當的時間打開/關閉的 GPIO。 其中之一是 TXDEN 信號,它會自動為您控制收發器。 其他用於 Tx/Rx LED。

沒有“rs485”模式。 忘記它,一切都會好起來的。 RS485 只是一個電氣標准,ZT485 負責從邏輯電平到差分信號的電氣轉換,然后再返回。 您可以將該芯片(或任何等效的)直接與 Raspberry PI 上的 UART 引腳一起使用:它們既不是 RS232 也不是 RS485,只是裸異步邏輯電平 UART 引腳。 您斷言 Raspberry PI“不支持”RS485 是沒有意義的:它也不支持 RS232,也不應該支持。 這些電氣標准需要電平轉換/接口芯片,而“另一面”總是相同的:邏輯電平異步串行流和控制線。 唯一的“陷阱”是選擇正確的邏輯電平(3.3V 是 5V - 我不記得 RPI 支持什么)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM