社区
非技术类
帖子详情
单片机与VB的通信,(485网络)请问有谁能帮助吗???
zhutaozhi53
2002-03-16 01:10:47
单片机与VB的通信,(485网络)请问有谁能帮助吗???
...全文
83
9
打赏
收藏
单片机与VB的通信,(485网络)请问有谁能帮助吗???
单片机与VB的通信,(485网络)请问有谁能帮助吗???
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
sonicdater
2002-04-01
打赏
举报
回复
串行通信的软硬件实现
-----------------------------------------------------------------
1 前言
美国Microchip公司的PIC16系列单片机是一种新型的CMOS工艺的8位单片机。其中,PIC16FXX单片机的程序存储器为电可擦除闪速存储器(flash),可多次修改程序,甚至可以在线编程。PIC16F83和PIC16F84片内数据存储器除RAM外,还有64字节的EEPROM,可以当作一般的或非易失性的数据存储器使用,简单方便。它还具有片内上电复位、延时电路、看门狗电路等。另外,PIC16系列单片机功耗极低,因而是一种非常适合在各种便携式设备中使用的高性价比的单片机,并已经得到了越来越广泛的应用。
但是在许多需要大量计算的运用中,还必须借助微机的强大数据处理能力。这样必须通过通信电路实现PIC单片机与微机间的可靠数据传输。有的PIC16单片机内并没有提供串行口,所以串行通信必须通过自己设计的硬件电路和通信软件来实现。
下面介绍用查询法实现异步串行通讯的方法。同时给出了用PIC16F84单片机的两个I/O口模拟2线串行口的硬件接口电路、程序流程框图、单片机内通信程序以及微机内的通信程序等。
2 硬件实现方法与电路
PIC16F84的程序存储器由1K×14的闪速(flash)存储器构成,它只有13条I/O口,1个定时器,为了尽量节省单片机的软硬件资源,采用下述异步串行通信的实现方法。
如图1所示,PIC16F84在4MHz时钟下,采用半双工方式,可实现9600波特率的异步串行数据通信,1位停止位,8位数据位,无校验位。接收和发送以低位在先(一般模式),采用软件延时。为节省篇幅,单片机内的通信程序中未提供任何握手协议,用户可根据自己的需要在软件中加入握手方式。
由于PIC16F84本身没有专门的串行口,这里用其I/O口来模拟串行口的功能。
PC机的串行接口是符合EIA RS-232C规范的外部总线标准接口。RS-232C采用的是负逻辑,即逻辑“1”:-5V至-15V;逻辑“0”:+5V至+15V。而CMOS电平为:逻辑“1”:4.99V,逻辑“0”:0.01V;TTL电平的逻辑“1”和“0”则分别为2.4V和0.4V。因此在用RS-232C总线进行串行通信时需外接电路实现电平转换。在发送端用驱动器将TTL或CMOS电平转换为RS-232C电平,在接收端用接收器将RS—232C电平再转换为TTL或CMOS电平。
这里选用了MAXIM公司的MAX202E来作电平转换。MAX202E属于MAXIM公司的通用串行接收/发送驱动器芯片。其外围电路简单,只需外接四个0.1μF的电容即可,如图1所示。
图1 接口原理图
3 PIC16F84单片机内通信程序的设计
图2 接收子程序框图 图3发送子程序框图
图2和图3分别是串行发送和接收的子程序流程框图。发送时,通过使数据发送端DX为低电平并保持B秒(9600波特率时为104μs)来发送起始位。随后每B秒钟通过置位或清零DX端把数据发送出去。这里的B是指一位所持续的时间(B=1/波特率)。接收时,数据接收端DR大约要每B/2秒(9600波特率时为52μs)查询一次以检测起始位,如果检测到起始位,则在大约1.5B秒(9600波特率时为156μs)后检测第一位数据位,随后每B秒钟检测一次其它的数据位。
相应的源程序如下:
;接收子程序
Rcvr
clrwdt
;清片内看门狗
;定时器
btfsc
RA,DR ;检测起始位
goto
Rcvr ;未检测到起始位
movlw
8 ;检测到起始位
movwf
R_CNT ;8位数据位
Rnext
call
Delay ;延时B/2秒
bcf
STATUS,C ;清进位标志
rrf
RevReg ;LSB在先
btfsc
RA,DR ;该位为0
;还是为1
bsf
RcvReg,MSB ;为1
call
Delay ;延时B/2秒
decfsz
R_CNT
goto
Rnext
retlw0
;返回
;发送子程序
Xmtr
clrwdt
;清片内看门狗
;定时器
movlw
8 ;发送位数为8
movwf
X_CNT
bcf
RA,DX ;发送起始位
Xnext
call
Delay ;延时B/2秒
call
Delay ;延时B/2秒
rrf
XmtReg ;LSB在先
btfsc
STATUS,C ;检测将要发送
;的数据位
bsf
RA,DX ;数据位为1
btfss
STATUS,C
bcf
RA,DX ;数据位为0
decfsz
X_CNT ;位计数为0则
;发停止位
goto
Xnext ;位计数不为0
;则发下一位数据位
Xstop
call
Delay ;延时B/2秒
call
Delay ;延时B/2秒
Bsf
RA,DX ;发送停止位
Retlw
0 ;返回
;延时子程序
Delay
movlw
12 ;52μS延时
movwf
DCNT ;
Dnext
decfsz
DCNT
goto
Dnext ;
retlw 0
;
4 Win95的串行通信机制及串口查询法的原理
常用的DOS系统主要是工作在响应中断方式。PC机串行通信程序大多利用其BIOS块的INT14H中断,以查询串口的方式完成异步串行通信。
Windows系统函数即包含了通信支持中断功能。Win95系统为每个通信设备开辟了用户定义的输入输出缓冲区(即读/写缓冲区),数据进出通信口均由系统后台来完成。应用程序只需完成对输入输出缓冲区操作就可以了。实际过程是每接收一个字符就产生一个低级硬件中断,Win95系统中的串行驱动程序就取得了控制权,并将接收到的字符放入输入数据缓冲区。然后将控制权返还正在运行的应用程序。如果输入缓冲区数据已满,串行驱动程序用当前定义的流控制机制通知发送方停止发送数据。队列中的数据按“先进先出”的次序处理。
(1) 按协议的设置初始化并打开串口,这样做就是通知Windows本应用程序需要这个串口,并封锁其他应用程序使它们不能使用此串口。
(2) 配置这个串口。
(3) 在串口上往返地传输数据,并在传输过程中进行校验。
(4) 不需要此串口时,关闭串口。即释放串口以供其它应用程序使用。
在这四个步骤中,主要的程序代码集中在第(3)步。
串口查询法是一种主要工作在查询方式下的实现方法。当通信程序工作在“查询”方式时,可以不考虑Win95的进程和线程的问题。仅在串口有数据时,去读串口缓冲区就可以了,如图4所示。这种方法下确定串口读取的时机、握手协议及软件纠错的实现是程序员应考虑的主要问题。
图4 读取接收缓冲区数据流程图
图5 串口初始化流程
由于这种方法主要工作在查询方式。程序员必须完成相当一部分通信状态的检测工作,许多细节(甚至包括通信过程中的字符属性的转换)也必须通过程序代码完成。这种查询方法对通信双方协议的依赖性尤其大。双方通信协议的约定对程序实现的难易程度影响很大。
串口查询法中,一般串口初始化的流程如图5。
值得注意的一点是,此方法下协议的约定必须满足以下条件:即甲方发送时,乙方必须在甲方发送动作之前进入循环接收状态,直到接收到字符后通过对串口读取函数ReadFile返回值的判断跳出循环状态。
同时,一般为了不使系统因循环等待接收而进入“死循环”状态,可以人为设置读取串口的循环次数,一般1000~10000次即可。
本程序的实现平台是VB4,这是一种极为灵活的高级语言,它可以方便地引入汇编语言的思维,利用其GoTo转向语句方便地控制程序的流程,灵活方便。
5 PC机内通信程序的实例
现约定甲方是PC机,乙方是单片机系统(如读卡器)。通信格式设置为2400波特率,8位数据位,1位停止位,无奇偶校验。
下面是一个约定好通讯协议的程序实例,协议流程如图6所示。
以下是甲方(PC机)的几个子函数的程序实例。
图6 通信协议流程
Private Function OpenThePort(cPort as String,cBaud as String,cParity
as String,cData as String,tStops asString)As Boolean ’ 打开串口的子过程
Dim lResult as Long
Dim lHandle as Long
Dim DCB_COMM as DCB
Dim cDCBConfig as String
lHandle = CreateFile(cPort,GENERIC_READ Or GENERIC_WRITE,
0&,0&,OPEN_EXISTING,0&,0&)
If lHandle = -1 Then ’打开串口失败
OpenThePort = False
MsgBox “串口可能正被其他应用程序占用!”
lResult = CloseHandle(lHandle) ’先关闭串口后再打开
If lResult = 0 Then
OpenThePort
Exit Function
End If
End If
cDCBConfig.band = 2400 ’设置DCB
cDCBConfig.parity = None
cDCBConfig.data = 8
cDCBConfig.stop = 1
lResult = BuildCommDCB(cDCBConfig,DCB_COMM) ’按用户设定配置一个DCB结构
If lResult = 0 Then
OpenThePort = False
MsgBox “无法建立DCB设备控制块”
Exit Function
End If
lResult = SetCommState(lHandle,DCB_Comm) ’实际设置一个串口的DCB
If lResult = 0 Then
OpenThePort = False
MsgBox “无法建立DCB设备控制块”
Exit Function
End If
OpenThePort = True
End Function
Private Sub SendHand ( ) ’发送握手信号的子过程
Dim Nchars As Long
Static Readbuff As String * 1
Static Writebuff As String * 1
Dim lpDCB As DCB
Dim lRet As Long
Dim lHandle As Long
Dim lpOverlapped As OVERLAPPED
Dim RNum As Integer
MsgBox “请把读卡器插在串口2上!”,
48,“提示窗口”
lHandle = OpenThePort(COMM1,2400,None,8,1)
lRet = PurgeComm( lHandle,1 ) ’清输出缓冲区
lRet = PurgeComm( lHandle,0 ) ’清输入缓冲区
lRet = GetCommState ( lHandle,lpDCB ) ’获得通讯口的状态
Shand:
Writebuff$= Chr$(&H8F)
lRet = WriteFile (lHandle,Writebuff$,1,Nchars,lpOverlapped )
’送握手信号入串口
zhutaozhi53
2002-04-01
打赏
举报
回复
请问要不要用到MSCOMM控件啊,我才学习,不知道怎么做才好呢,
turbochen
2002-03-16
打赏
举报
回复
单片机的连接指令一般是不同的设计者有不同的指令格式,
两年前与人合作做过一个单片机的东东, 你只要知道指令格式,就可以通过串口发数据了,而对于485网络,PC机与之连接的方式是:
PC串口-->>RS232&RS485转换模组-->>RS485网络
关键是中间要有一个RS232&RS485转换模组,几百元一个,
RS232是点对点的,而RS485是可寻址方式,即485网络上的每一个RS485节点对应一个地址ID,而PC发指令的时候就要告诉485网络要向谁发送,每一个RS232&RS485转换模组的手册中都有讲这个指令格式,
另外给你一个参考资源:
http://roaringwind.best.163.com/serialcomm.htm
另外书店有卖一本vb串口通讯编程的书,你可以去找来学一下.
mazhayang
2002-03-16
打赏
举报
回复
我觉得和232没什么区别
我的经验中有两点要注意的是:
1、在收发转换的时候的延时要长一些,
2、如果是多址发送,要随时改变他的奇偶校验位。
mazhayang
2002-03-16
打赏
举报
回复
看看,把问题摆上来
Bardo
2002-03-16
打赏
举报
回复
单片机都有API函数可用
有什么困难?
秋雨
2002-03-16
打赏
举报
回复
我正在搞VB和单片机的通讯,一起研究?
秋雨
2002-03-16
打赏
举报
回复
有什么问题?
zyl910
2002-03-16
打赏
举报
回复
问 qiuyu1(秋雨)
ta曾经说过ta懂
单片机
与
VB
通信
附源码
单片机
与
VB
通信
,包括keil源代码,
VB
源工程,ptoteus仿真
51
单片机
与
vb
通信
51
单片机
与计算机
vb
通信
,主要介绍如何进行
单片机
的配置以及
vb
如何编程实现
通信
,附有实例一枚
串口
通信
和RS
485
-第1季第13部分
本课程是《朱有鹏老师
单片机
完全学习系列课程》第1季第13个课程,主要讲解了串行
通信
UART及其扩展RS
485
。本课程很重要,因为串口
通信
是我们接触的早也简单的
通信
方式,是后续继续学习SPI、I2C甚至USB、
网络
通信
等的...
利用
VB
实现计算机与
单片机
的串口
通信
利用
VB
实现计算机与
单片机
的串口
通信
利用
VB
实现计算机与
单片机
的串口
通信
利用
VB
实现计算机与
单片机
的串口
通信
利用
VB
实现计算机与
单片机
的串口
通信
VB
与
单片机
串口
通信
VB
与
单片机
串口
通信
非技术类
742
社区成员
26,925
社区内容
发帖
与我相关
我的任务
非技术类
VB 版八卦、闲侃,联络感情地盘,禁广告帖、作业帖
复制链接
扫一扫
分享
社区描述
VB 版八卦、闲侃,联络感情地盘,禁广告帖、作业帖
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章