『壹』 怎麼設計一個多機通信系統(單片機)
簡單說明用一個主機串口實現上述要求的思路:
從機地址分別為01和02
從機的串口相同引腳相互並聯作為一個串口連接於主機串口,注意接線正確。
主機命令:地址號 + 命令字元串
從機命令:地址號 + 命令字元串
然後在各自收發代碼中利用地址號來區別命令執行
其它請參閱如下網址本人的答復:
http://..com/question/12535506.html
http://..com/question/12522809.html
http://..com/question/11725744.html
http://..com/question/11040704.html
http://..com/question/10941227.html
補充:
串列通訊的基本知識
每台計算機都提供了一個或多個串列埠。它們被依次命名為:COM1、COM2 等等。在標準的 PC 中,滑鼠通常被連接到 COM1 埠。數據機可能連接到 COM2,掃描儀被連接到 COM3,等等。串列埠提供了計算機與這些外部串列設備之間的數據傳輸通道。
串列埠的本質功能是作為 CPU 和串列設備間的編碼轉換器。當數據從 CPU 經過串列埠發送出去時,位元組數據被轉換為串列的位。在接收數據時,串列的位將被轉換為位元組數據。
我的理解:串列口數據通信的實質是ASCII(美國標准信息交換碼)的傳輸。你可理解是傳輸ASCII碼,而實際傳輸的是ASCII碼(其二進制形式,8位組成一位元組)。它又可看成是8位二進制數,例字元A 其二進製表示為 01000001,MSCOMM發送時完全按照此二進制信號發送,由低位至高位傳輸。又能理解為10進制的64。在計算機內通常以16進製表示為41。由2個8位二進制數據組成16位二進制數,通常用於數據的二進制通信。你的程序代碼採用以文本方式取回數據,這是在MSCOMM控制項內部進行解決,而無須VB編程員來處理。
見MSCOMM控制項的:
InputMode 常數
常數 值 描述
comInputModeText 0 (預設)通過 Input 屬性以文本方式取回數據。
comInputModeBinary 1 通過 Input 屬性以二進制方式檢取回數據。
以下是由MICROSOFT提供的關於串列通訊和MSCOMM控制項的一些說明,可能對你答辯有用,供參考。
串列通訊的基本知識
每台計算機都提供了一個或多個串列埠。它們被依次命名為:COM1、COM2 等等。在標準的 PC 中,滑鼠通常被連接到 COM1 埠。數據機可能連接到 COM2,掃描儀被連接到 COM3,等等。串列埠提供了計算機與這些外部串列設備之間的數據傳輸通道。
串列埠的本質功能是作為 CPU 和串列設備間的編碼轉換器。當數據從 CPU 經過串列埠發送出去時,位元組數據被轉換為串列的位。在接收數據時,串列的位將被轉換為位元組數據。
要完成數據的傳輸,還需要進一步一個解釋層。在操作系統一邊,Windows 使用了通訊驅動程序 Comm.drv,以便使用標準的 Windows API 函數發送和接收數據。驅動程序通常由串列設備製造商提供,以便將其硬體與 Windows 連接。在使用 Communications 控制項時,實際上使用了 API 函數,API 函數將被 Comm.drv 解釋並傳輸給設備驅動程序。
作為程序員,只需關心如何與 Windows 打交道。作為 Visual Basic 程序員,只需要關心 Communications 控制項提供的對 Windows 通訊驅動程序的 API 函數的介面。換句話說,只需要設置和監視 Communications 控制項的屬性和事件。
建立串列埠連接
使用 Communications 控制項的第一步是建立與串列埠的連接。下表列出了用於建立串列埠連接的屬性:
屬性 描述
CommPort 設置或返回通訊埠號。
Settings 以字元串形式設置或返回波特率、奇偶校驗、數據位和停止位。
PortOpen 設置或返回通訊埠的狀態。以及打開和關閉埠。
打開串列埠
要打開串列埠,可以使用 CommPort、PortOpen 和 Settings 屬性。例如:
'打開串列埠
MSComm1.CommPort = 2
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True
CommPort 屬性確定打開哪個串列埠。假如 COM2 上連接有一個數據機,則在上面的例子中需要將值設置為 2 (COM2) 才能連接到該數據機。CommPort 屬性值可以設置為 1 到 16 之間的任何值(預設值為 1),然而,如果將該值設置為系統中並不存在的 COM 埠,將會產生錯誤。
Settings 屬性可以用來指定波特率、奇偶校驗、數據位數和停止位數。按照預設規定,波特率被設置為 9600。奇偶校驗設置為了進行數據校驗。這通常是不用的,並設置為"N"。數據位數指定了代表一個數據塊的比特數。停止位指出了何時接收到一個完整數據塊。
在指定了要打開的埠,以及如何進行數據通訊之後,就可以使用 PortOpen 屬性建立連接了。它是一個布爾值,即取值范圍為 True 或 False。然而,如果埠無效,或者 CommPort 屬性設置有誤,或者該設備不支持指定的設置,就會產生錯誤;即使沒有產生錯誤,外部設備也不能正常工作。將 PortOpen 屬性設置為 False 即可關閉該埠。
緩沖區內存分配
InBufferSize 和 OutBufferSize 屬性指定了為接收和發送緩沖區分配的內存數量。按照預設規定,它們被分別設置為上圖所示的值。這兩個值設置得越大,應用程序中可用的內存就越少。然而,如果緩沖區太小,就要冒緩沖區溢出的風險,除非採用握手信號。
注意 鑒於現在大多數微機可用的內存量,由於有更多的可用資源,緩沖區內存分配已不那麼至關緊要了。換言之,可以把緩沖區的值設得高一些而不影響應用程序的性能。
RThreshold 和 SThreshold 屬性
RThreshold 和 SThreshold 屬性,表示在 OnComm 事件發生之前,接收緩沖區或發送緩沖區中可以接收的字元數。OnComm 事件被用來監視和響應通訊狀態的變化。如果將每個屬性的值都設置為零 (0),就可以避免發生 OnComm 事件。如果將該值設置為非零的值(比如 1),那麼每當緩沖區中接收到一個字元時,就會產生 OnComm 事件。
Output 屬性被用來向發送緩沖區發出命令和數據。
與 Input 屬性類似,數據可以以文本或二進制格式發送。Output 屬性必須用字元串變體型發送文本,用 Byte 數組變體型發送二進制數據。
可用 Output 屬性發送命令、文字字元串或 Byte 數組數據。
MSComm 控制項
MSComm 控制項通過串列埠傳輸和接收數據,為應用程序提供串列通訊功能。
語法
MSComm
說明
MSComm 控制項提供下列兩種處理通訊的方式:
事件驅動通訊是處理串列埠交互作用的一種非常有效的方法。在許多情況下,在事件發生時需要得到通知,例如,在 Carrier Detect (CD) 或 Request To Send (RTS) 線上一個字元到達或一個變化發生時。在這些情況下,可以利用 MSComm 控制項的 OnComm 事件捕獲並處理這些通訊事件。OnComm 事件還可以檢查和處理通訊錯誤。所有通訊事件和通訊錯誤的列表,參閱 CommEvent 屬性。
在程序的每個關鍵功能之後,可以通過檢查 CommEvent 屬性的值來查詢事件和錯誤。如果應用程序較小,並且是自保持的,這種方法可能是更可取的。例如,如果寫一個簡單的電話撥號程序,則沒有必要對每接收一個字元都產生事件,因為唯一等待接收的字元是數據機的"確定"響應。
每個使用的 MSComm 控制項對應著一個串列埠。如果應用程序需要訪問多個串列埠,必須使用多個 MSComm 控制項。可以在 Windows"控制面板"中改變埠地址和中斷地址。
盡管 MSComm 控制項有很多重要的屬性,但首先必須熟悉幾個屬性。
屬性 描述
CommPort 設置並返回通訊埠號。
Settings 以字元串的形式設置並返回波特率、奇偶校驗、數據位、停止位。
PortOpen 設置並返回通訊埠的狀態。也可以打開和關閉埠。
Input 從接收緩沖區返回和刪除字元。
Output 向傳輸緩沖區寫一個字元串。
OnComm 事件
無論何時當 CommEvent 屬性的值變化時,就產生 OnComm 事件,標志發生了一個通訊事件或一個錯誤。
語法
Private Sub object_OnComm ()
OnComm 事件語法包括下列部分:
部分 描述
object 對象表達式,其值是"應用於"列表中的對象。
說明
CommEvent 屬性包含實際錯誤或產生 OnComm 事件的數碼。注意,設置 Rthreshold 或 Sthreshold 屬性為 0,分別使捕獲 comEvReceive 和 comEvSend 事件無效。
MSComm 控制項常數
Handshake 常數
常數 值 描述
comNone 0 無握手。
comXonXoff 1 XOn/Xoff 握手。
comRTS 2 Request-to-send/clear-to-send 握手。
comRTSXOnXOff 3 Request-to-send 和 clear-to-send 握手皆可。
OnComm 常數
常數 值 描述
comEvSend 1 發送事件。
comEvReceive 2 接收事件。
comEvCTS 3 clear-to-send 線變化。
comEvDSR 4 data-set ready 線變化。
comEvCD 5 carrier detect 線變化。
comEvRing 6 振鈴檢測。
comEvEOF 7 文件結束。
Error 常數
常數 值 描述
comEventBreak 1001 接收到中斷信號
comEventCTSTO 1002 Clear-to-send 超時
comEventDSRTO 1003 Data-set ready 超時
comEventFrame 1004 幀錯誤
comEventOverrun 1006 埠超速
comEventCDTO 1007 Carrier detect 超時
comEventRxOver 1008 接收緩沖區溢出
comEventRxParity 1009 Parity 錯誤
comEventTxFull 1010 傳輸緩沖區滿
comEventDCB 1011 檢索埠 設備控制塊 (DCB) 時的意外錯誤
InputMode 常數
常數 值 描述
comInputModeText 0 (預設)通過 Input 屬性以文本方式取回數據。
comInputModeBinary 1 通過 Input 屬性以二進制方式檢取回數據。
Output 屬性
往傳輸緩沖區寫數據流。該屬性在設計時無效,在運行時為只讀。
語法
object.Output [ = value ]
Output 屬性語法包括下列部分:
部分 描述
object 對象表達式,其值是"應用於"列表中的對象。
value 要寫到傳輸緩沖區中的一個字元串。
說明
Output 屬性可以傳輸文本數據或二進制數據。用 Output 屬性傳輸文本數據,必須定義一個包含一個字元串的 Variant。發送二進制數據,必須傳遞一個包含位元組數組的 Variant 到 Output 屬性。
正常情況下,如果發送一個 ANSI 字元串到應用程序,可以以文本數據的形式發送。如果發送包含嵌入控制字元、Null 字元等等的數據,要以二進制形式發送。
數據類型
Variant
『貳』 單片機的串口接收端為什麼加上一個二極體,而且還是反向的,如下圖
RX應該接有上拉。 只要RO為低,由於拉電流,RX一樣會被拉低;RO為高時,RO電平應該比RX高,二極體截止,RX也為高。
這樣目的應該是為了將485與單片機簡單隔離,其實這樣也不怎麼安全,產品上我們一般會用光耦來隔離而不是用二極體。
『叄』 單片機一路串口分兩路使用
如果確定不是同時收發,可以通過二極體坐下硬體的電氣隔離,然後根據時間段知道是那一路給的數據。也可以使用CD4052這種雙四路模擬開關進行切換。