⑴ Keil C51實現單片機與PC串口(上位機)vb如何編寫
.
實現你講的功能,必須用VB中的MSComm控制項
MSComm 控制項有很多重要的屬性,在開始使用MSComm控制項之前。需要先了解其屬性、事件或錯誤。
屬性 描述
CommPort 設置或返回通信埠號
Settings 以字元串的形式設置或返回波特率、奇偶校驗、數據位和停止位
PortOpen 設置或返回通信埠的狀態。也可以打開和關閉埠
Input 返回和刪除接收緩沖區中的字元
Output 將字元串寫入發送緩沖區
CommEvent 屬性為通信事件或錯誤返回下列值之一。在該控制項的對象庫中也可以找到這些常量。
有關具體的描述,找相應的教材仔細看吧。
VB.的MSComm通信控制項提供了一系列標准通信命令的介面,它允許建立串口連接,可以連接到其他通信設備(如Modem).還可以發送命令、進行數據交換以及監視和響應在通信過程中可能發生的各種錯誤和事件,從而可以用它創建全雙工 、事件驅動的、高效實用的通信程序。但在實際通信軟體設計過程中,MSComm控制項並非像想像中那樣完美和容易控制.。
一般悅來,計算機都有一個或多個串列埠,它們依次為com1、Com2、…,這些串口還提供了外部設備與pC進行數據傳輸和皿信的通道。這些串口在CPU和外設之間充當解釋器的角色。當字元數據從CPU發送給外設時,這些字元數據將被轉換成串列比特流數據;當接收數據時,比特流數據被轉換為字元數據傳遞給CPU,再進一步說,在操作系統方面,Windows用通信驅動程序(COMM.DRV)調用API函數發送和接收數據,當用通信控制項或聲明調用API函數時,它門由COMM. DRV解釋並傳遞給設備驅動程序,作為一個vB程序員,要編寫通信程序.只需知道通信控制項提供給Windows通信AP1函數的介面即可.換句話說,只需設定和監視通信控制項的屬性和事件即可。
MSComm控制項提供了兩種處理通信的方法:
1.事件驅動通信,是一種功能很強的處理串口活動的方法。在大多數情況下,用戶需要獲知事件發生的時間,例如,在CD(Carrier Detect)線或RTS(Request To Send)線上有字元到達或發生了改變等。在這種情況下,使用MSComm控制項的OnComm事件捕獲和處理這些通信事件。OnComm也可以捕獲和處理通信中的錯誤。要獲取所有事件和通信錯誤的完整清單,參閱CommEvent屬性。
2.程序員也可以在每個重要的程序功能之後檢查CommEvent屬性的值來檢測事件和通信錯誤。這對小的自含程序可能比較常用。例如,如果編寫一個簡單的電話撥號程序,那麼在接收了每個字元後都產生一個事件並沒有意義,因為你只打算從數據機中接收OK響應信息。
使用的每個MSComm控制項都與一個串口對應。如果在應用程序中需要訪問多個串口,必須使用多個MSComm控制項。可以在Windows 控制面板中修改串口地址的中斷地址。
用Mscomm控制項 編寫通信程序
在VB中新建一個工程文件。
添加Microsoft Comm Control 組件,
在簡體Form1中加入Command命令按鈕並取名為CmdTest,MSComm控制項取名為SComm1,加入如下程序代碼。
Private Sub cmdTestClick ( ) '打開串口
MSComml.CommPort =2 '設定Com2
If MSComml.PortOpen = False Then
MSComm1.Settings = "9600,n,8,1" '9600波特率,無校驗,8位數據位,1位停止位
MSComm1.PortOpen = True '打開串口
End if
MSComm1.OutBufferCount = 0 '清空發送緩沖區
MSComm1.InBufferCount = 0 '滑空接收緩沖區
'發送字元數據時注意必須用回車符(vbcr)結束
MSComm1.Output="This is a qood book ! " &vbCr
'潑打電話號碼或發送AT命令
MSComm1.Output = "ATDT 05778191898 , & vbCr
'發送字元數組數據時注意ByteArray必須事先定義賦值
Dim ByteArray as byte( )
'定義動態數組
ReDim ByteArray(1)
'重定義數組大小
ByteArray ( 0 ) =0
ByteArray ( 1 ) = 1
MSComm1.Output = ByteArray
End Sub
private Sub MScommEvent( )
Select Case MSComm1.CommEvent
Case comEvReceive
Dim Buffer As Variant
MSComm1.InputLen = 0
'接收二進制數據
MSComm1.InputMode= ComInputModeBinary
Buffer=MSComm1.Input
'接收字元數據
MSComm1.InputMode=comInputModeText
Buffer = MSComml.Input
Case else
End Select
End sub
⑵ vb上位機發送數據51單片機接收
你好!
單片機內要寫入單片機的程序,可以用KEIL編寫代碼
VB 呢,一般情況下可以用 VB 6.0 ,在程序裡面添加串口控制項
⑶ VB做上位機,如何對單片機上的多路18B20進行檢測。
呵呵 還是俺幫你回答吧 是你忘問了 不是俺不回答你的問題
必須對每一個的18B20的都要進行ID識別(記錄下來,保存好,編程的時候要用到識別碼),采樣溫度時,按ID識別碼一個一個啟動
18B20進行溫度轉換 在按順序將轉換的結果存入片內數據存儲器中。
在上位機上 根據讀取溫度的順序 就可以知道是哪一個識別碼的溫度
呵呵 這些我都做過 沒問題的
滿意就選滿意回答吧
⑷ 上位機(VB)與下位機(單片機))如何實現通信
可以用VB做軟體調用串口模塊,兩者可以通過串口來連接
⑸ 單片機串口分別三次向VB上位機發送數組數據
第一,你要解決數據是否同步的問題。電腦的頻率比單片機的時鍾頻率快很多,所以串列通信選擇同步傳輸。當單片機發送完數組的第一個數據,上位機接收到這個數據後發送一個應答信號給單片機,然後單片機收到應答信號接著發送第二個數據給上位機,以此類推(應答信號的具體數值是你的通訊協議定義的)
第二,你的vb要添加MSComm控制項,參考文章
http://wenku..com/linkurl=gaBSjBHSDk9b_THl3f1XYPtpRZgpIt6wczgHWXe_h_1q8ICdfPRP_Q-Fq4JLsbT_r_D8gzTRs_-sa9956OHq0XD9ahbc6sa4d-_omQVAlXG
控制項MSComm的接收數據程序:
Private Sub MSComm1_OnComm()
Dim indata As Variant
Dim bte(0) As Byte
Select Case MSComm1.CommEvent
Case 2
indata = MSComm1.Input
bte(0) = AscB(indata)
If bte(0) = 數組的第一個數值
Then MSComm1.Output = 應答信號1
text1.text=bte(0)
end if
If bte(0) =數組的第二個數值 Then MSComm1.Output =應答信號2
text2.text=bte(0)
end if
If bte(0) =數組的第三個數值 Then MSComm1.Output =應答信號3
text3.text=bte(0)
end if
MSComm1.OutBufferCount = 0
End Select
End Sub
⑹ 上位機(VB)與下位機(單片機))如何實現通信
能實現:通過虛擬機來測試,這時需要虛擬串口軟體,需要虛擬出串口來實現互連。
模擬方面:實現按鍵發音,並發送相應信息給上位機,通知上位機哪個鍵子按了。其中下位機模擬部分的實現,需要發聲、串口發送,及中斷方面的內容,需要研討。
VB也就是上位機,其實相對簡單,通過串口控制項,實現讀取下位機發送過來的鍵值信息,並進行相應處理。
我只是概要的說明了項目可實現及需要的相關的知識。
⑺ VB製作上位機,向單片機內下載程序
單片機下載程序 通過串口 向 單片機內下載程序,
如果 該 單片機具有 串口下載 功能的 那麼應該可以實現。
如果 該 單片機不具有 串口下載 功能的 那就需要有相應的硬體電路配合才能實現。
象串口 下載 程序,那麼需要 知道下載 的 指令代碼,一般不容易找到,
不過 有 一個 辦法 可以得到,就是靠自己 方法是 這樣 在正常向單片機下載 下載程序時
想辦法 讀取 串口 發送的 指令 和 數據,分析 那是 指令 那是 數據,
當然 還需要 讀取 單片機 返回 的 指令 數據, 一起 分析,
至於 怎麼讀取 應該 不難,關鍵是 分析,不同型號 單片機 是 不一樣的喔。
⑻ vb和單片機通信的問題。mscomm.RThreshold=1的疑問
當vb收到一個位元組了,vb產生OnComm事件,但是vb是windows 操作系統下的程序,執行到事件的mscomm1.Input 時已經過去一定時間,串口是有緩沖區的,這時候讀input已經傳過來很多位元組了。所以就發生了你所說的結果
⑼ VB利用串口與單片機通信
Option Explicit
Dim strData As String
Dim sjSEnd() As Byte
'輸入處理為16進制字元串
Public Sub InputManage(bytInput() As Byte, intInputLenth As Integer)
Dim n As Integer
ReDim bytReceiveByte(intInputLenth)
For n = 0 To intInputLenth - 1 Step 1
strData = strData & Hex(bytInput(n))
Next n
Text2 = strData
End Sub
Private Sub Command1_Click()
Timer1.Enabled = True
End Sub
Private Sub Form_Load()
MSComm1.Settings = "19200,N,8,1"
MSComm1.RThreshold = 1
MSComm1.PortOpen = True
Text1 = "" '在Text1中寫16進制指令
Timer1.Interval = 200
Timer1.Enabled = False
End Sub
Private Sub MSComm1_OnComm()
Dim bytInput() As Byte
Dim intInputLen As Integer
If (MSComm1.CommEvent = comEvReceive) Then
MSComm1.InputMode = comInputModeBinary
intInputLen = MSComm1.InBufferCount
If intInputLen > 0 Then
Timer1.Enabled = False
End If
ReDim bytInput(intInputLen)
bytInput = MSComm1.Input
Call InputManage(bytInput, intInputLen)
'數據處理
'Dim l As Integer
'Dim ml As Byte
'l = Val("&H" & Mid(strData, 1, 2))
'ml = Val("&H" & Mid(strData, 3, 2))
'If Len(strData) = 2 * l + 2 Then
' strReceive(ml) = Mid(strData, 5, 2 * (l - 2))
'隨後進行你想的數據處理
' strData = "" '清除接收數據
'End If
End If
End Sub
Private Sub Timer1_Timer()
Dim l As Integer
Dim i As Integer
l = Len(Text1) '可用於多位元組指令
ReDim sjSEnd(l / 2 + 1)
sjSEnd(0) = &HBB
sjSEnd(l / 2 + 1) = &HEE
For i = 1 To Len(Text1) Step 2
sjSEnd((i + 1) / 2) = Val("&H" & Mid(Text1, i, 2))
Next
MSComm1.Output = sjSEnd
End Sub