单片机与VB的通信,(485网络)请问有谁能帮助吗???

zhutaozhi53 2002-03-16 01:10:47
单片机与VB的通信,(485网络)请问有谁能帮助吗???
...全文
83 9 打赏 收藏 转发到动态 举报
写回复
用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懂

742

社区成员

发帖
与我相关
我的任务
社区描述
VB 版八卦、闲侃,联络感情地盘,禁广告帖、作业帖
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧