您现在所在的是:

单片机论坛

回帖:12个,阅读:1008 [上一页] [1] [2] [下一页]
1000
sunsoncheng
文章数:109
年度积分:50
历史总积分:1000
注册时间:2010/5/25
发站内信
发表于:2011/12/22 8:20:12
#0楼
第一次在单片机上写与PC通讯的程序

想了好久,有个问题不能解决,想请各位大侠指教:

因为PC机上发送的数据的时间是不定的

而在单片机上用了循环来不断重复检测好多东东,其中之一是PC来的资料,准备用中断来处理

PC也不总是发数据,只是点击某个按键才发送的(比如 四个数字)

现在的问题是:我如何才知道,中断收到的数据是四个数字中的第一个?

在两方面的编程如何处理才行?

在PC的编程上我习惯用时间间隔发送而非mscomm事件发送,是否是问题的原因


谢谢
1294
yhm2005
文章数:41
年度积分:77
历史总积分:1294
注册时间:2006/6/10
发站内信
发表于:2011/12/22 9:33:46
#1楼
你需要制定一个通讯协议
1000
sunsoncheng
文章数:109
年度积分:50
历史总积分:1000
注册时间:2010/5/25
发站内信
发表于:2011/12/22 10:11:23
#2楼
按我的理解协议是表明每个数字的意义及作用
现在我在PC上有一个按钮,我一按就发送四个数字

如01H,00H,00H,00H,前面一位想表示要求单片机做的动作,后面是时间

这样的协议有问题吗?

具体的做法应该如何?谢谢
1294
yhm2005
文章数:41
年度积分:77
历史总积分:1294
注册时间:2006/6/10
发站内信
发表于:2011/12/22 11:21:12
#3楼
一般协议有起始值、数据、结束值,复杂的还有站地址、数据地址、数据长度、数据校验等,根据起始值来判断一帧数据的开始,结束值判断一帧数据是否完整,校验则是判断数据的正确性。
1000
sunsoncheng
文章数:109
年度积分:50
历史总积分:1000
注册时间:2010/5/25
发站内信
发表于:2011/12/22 11:29:45
#4楼
能给个具体的操作指示吗?
最好是用汇编写的,因为我只会一点汇编

如果是C,还得转回来

谢谢
18773
pqsh 版主
文章数:7371
年度积分:603
历史总积分:18773
注册时间:2006/8/22
发站内信
2018论坛解答高手
发表于:2011/12/23 11:36:04
#5楼
中断接收.
两种方式解决你的问题.
1.规定头和尾,以及校验.中断发现了头,就等待连续接收后续的数据.当然,这个头必须是不和数据区能一样的字节.如,有用数据不可能出现ff,那就ff表示数据头.
2.规定通讯间隔.比如超过2个数据时间,就是结束上次,单片机清空缓存,下次一开始就是数据头.这样做的协议,典型的是modbus.
如果我忘了我
请帮忙记得我
pqsh@163,326199298@v&q同号
687
805927734
文章数:5
年度积分:50
历史总积分:687
注册时间:2011/12/23
发站内信
发表于:2011/12/23 17:10:39
#6楼
此楼内容不符合板块规定,不予显示! 查看原帖内容>>
1000
sunsoncheng
文章数:109
年度积分:50
历史总积分:1000
注册时间:2010/5/25
发站内信
发表于:2011/12/23 20:20:32
#7楼
数据是不固定的,无法用这个来处理,规定时间也是我在想的方式,我在想如保判定时间的处理上了

这个路是找对了,只是还要实施,如果有个例子就更好了

谢谢

汇编的最好
18773
pqsh 版主
文章数:7371
年度积分:603
历史总积分:18773
注册时间:2006/8/22
发站内信
2018论坛解答高手
发表于:2011/12/23 22:26:02
#8楼
汇编?要哪种的?
时间上是这样的:有点类似看门狗.
做一定时,一方面,定时器到,就清空通讯缓存.另一方面,如果有通讯中断,就清除定时器.
如果我忘了我
请帮忙记得我
pqsh@163,326199298@v&q同号
1000
sunsoncheng
文章数:109
年度积分:50
历史总积分:1000
注册时间:2010/5/25
发站内信
发表于:2011/12/24 14:16:38
#9楼
comreti:
clr  ES   ;不允许串行中断
push acc

jnb  ri,chkti ;ri=1表示为接收中断

push psw
       mov  4FH,r0 ;因为其它中断会用到R0,怕出错,先送出
       push 4FH

lcall chk4546 ;检查否一段时间内的开始数据,如果是,已将
;指针回到00
inc  50h ;用于记录第几次收到数!
       mov  A, 50H             ;50H中的数值转到A中
CLR  C
ADD  A, #0F9H ;有没有可能是FF?不断发来是有可能的
JC   sriexit ;超过6个就不再处理直接退出

;即收到的6个数据按顺序放在51H~55H中,
mov  a, #50H
       add  a, 50H             ;开始地址+1也是开始地址,前面有了加1操作
       mov  r0,a ;将新的地址装入R0用于新的寻址方式
       mov  @r0,sbuf           ;放入相对的地址中

mov A,50H
cjne A,#06H,sriexit ;不是6位就不检查
;已是6位数接着检查数据是不是合理,不管是否合理也会发送数,只是不全时发的数不一样
lcall chkPCdata ;检查数据的合理性    


sriexit: ;其它的收数不理会!并清空标收数标志
clr ri ;COM1这样写?
       pop  4FH
       mov  r0,4FH
pop  psw
chkti: ;发送主动等待不用中断,由发送处清空处理,这里也不清空
pop  acc
SETB   ES   ;允许串行中断
exitcom1:
reti




sendTempToPc:                           ;发送数据到PC机

   ret

请pqsh老大帮忙看看我这个中断有问题吗?


现在又有一个新的问题了

如果我现在想在检查数据之后将单片机的相关数据送回PC,也就是
sendTempToPc:这个子程序了

我在哪里回入才行呢?

在reti之前加入?它会有产生发送中断的问题,

两个中断同时存在会否产生错误

如果我在主程序里发送,因为主程序的循环时间较长(10S)就不能达到即时应答的效果了
请老大指点

谢谢

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

62.4004