找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

串口通信程序出错

[复制链接]
admin 发表于 2012-9-2 20:20:40 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
关于串口通信,通信协议里是包括“帧头(7eh)”“数据”“校验和(帧头和数据的校验和)”“帧尾(f5h)”,(对方一次发送4个,过段时间在发送四个,我是这样理解协议,有问题还望指出)我写的这段中断程序就是想把四个数据全部接收完,然后在判断数据对不对。对了就把这四个数据按顺序发送出去,出错了就按出错的发送。
然后我发送了一组正确的数据(如7eh 02h 80h f5h),它总是发送一个06h回电脑,我把红色的那部分判断语句写在主程序里面,经过软件的单步运行,可以看出程序走向不是跳到出错那里,(如同中断里的绿色那部分)

其中(rxbuff :.8 ;定义8个字节的接收缓冲队列 putptr ;接收数据存放指针,这个putptr在初始化时已经被清为0)

;**************中断服务程序***************




org 0x0004
movwf w_temp ;中断现场保护
movf status,w
clrf status ;指向bank0
movwf status_temp
movf fsr,w
movwf fsr_temp

recint ;判别是否是串行中断
banksel pir1
btfss pir1,RCIF ;rcif为1则接收缓冲寄存器rcreg中有数据收到,跳过下条指令
goto endint ;转到中断结束

movlw rxbuff ;数据接收正确,存取至接收缓冲区
movwf fsr
movf putptr,w
addwf fsr,f
movf rcreg,w ;读取一个收到的字节
movwf indf ;间接寻址的特有方式,将读到的字节存取至缓冲区
incf putptr,f
movlw 03h
andwf putptr,f ;缓冲区最大偏移指针为4,即是putptr的内容增加到4,与3相与为0
btfsc pir1,RCIF ;rcif为0,rcreg没有数据,跳过下条指令
goto recint
btfss rcsta,OERR ;oerr为1,则为溢出错误,跳过下条指令
goto checkzijie


oerr_pro bcf rcsta,CREN ;清除溢出错误,保证rcreg可以从RSR接收新的数据
bsf rcsta,CREN
goto endint

checkzijie
movf putptr,f ;判断有没有收完四个字节
btfss status,Z ;putptr的内容为0(即是表示收完了四个字节),Z为1,则跳过下条指令,不为0退出中断继续等待数据
goto endint

puanduan
movlw 7eh ;判断帧头是否为7eh
subwf rxbuff+0,w ;rxbuff+0的内部数据剪掉7eh的值放入w
btfss status,Z ;帧头不为7eh,Z为0,则退出中断, Z为1,跳过下条指令继续判断下面的
goto chucuo
movlw 0F5h ;判断帧尾是否为F5h
subwf rxbuff+3,w
btfss status,Z ;帧尾不为F5h,Z为0,则退出中断, Z为1,跳过下条指令继续判断下面的
goto chucuo
movlw 7eh
addwf rxbuff+1,w ;帧头加上数据位的和放入w寄存器
subwf rxbuff+2,w ;与校验和位相减判断是否为0
btfss status,Z ;为0则Z为1,跳过下条指令
goto chucuo


zhengque

movf rxbuff+0,w
fasong1 btfss pir1,TXIF ;检查发送标志位,它为1即txreg为空
goto fasong1
movwf txreg
movf rxbuff+1,w
fasong2 btfss pir1,TXIF
goto fasong2
movwf txreg
movf rxbuff+2,w
fasong3 btfss pir1,TXIF
goto fasong3
movwf txreg
movf rxbuff+3,w
fasong4 btfss pir1,TXIF
goto fasong4
movwf txreg
goto endint



chucuo movlw 06h
movwf txreg


endint clrf status ;中断结束,恢复中断现场,指向bank0
movf fsr_temp,w
movwf fsr
movf status_temp,w
movwf status
swapf w_temp,f
swapf w_temp,w
retfie
;*********************************************************************

;**************************初始化程序*************************************


startup
nop
nop


bsf status,RP0 ;选择RAM区1为当前区
bcf status,RP1
movlw 6ch
movwf osccon
movlw 50h
movwf trisa
movlw 10h
movwf trisb
movlw 88h
movwf trisc
movlw 0fh
movwf adcon1
movlw 24h
movwf txsta
movlw .25
movwf spbrg
clrf pie1
bsf pie1,RCIE ;rcie为1,允许usart接收中断

bcf status,RP0 ;选择RAM区0为当前区
movlw 90h
movwf rcsta
clrf porta ;寄存器清零
clrf portb
clrf portc
clrf putptr ;复位接受队列存入指针
movlw 07H
movwf counter
clrf intcon
;**************************************************************

bsf intcon,PEIE ;允许未被屏蔽的外设中断
bsf intcon,GIE ;允许未被屏蔽的全局中断

;****************************以上初始化完毕*********************************************
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-23 15:50 , Processed in 0.056141 second(s), 11 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表