⑴ 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