登录
首页 单片机论坛
回帖 发帖
正文

主题:关于单片机与PC通讯的一些基本知识请教

点击:1129 回复:12

第一次在单片机上写与PC通讯的程序
想了好久,有个问题不能解决,想请各位大侠指教:
因为PC机上发送的数据的时间是不定的
而在单片机上用了循环来不断重复检测好多东东,其中之一是PC来的资料,准备用中断来处理
PC也不总是发数据,只是点击某个按键才发送的(比如 四个数字)
现在的问题是:我如何才知道,中断收到的数据是四个数字中的第一个?
在两方面的编程如何处理才行?
在PC的编程上我习惯用时间间隔发送而非mscomm事件发送,是否是问题的原因
谢谢
11-12-22 08:20
你需要制定一个通讯协议
11-12-22 09:33
按我的理解协议是表明每个数字的意义及作用
现在我在PC上有一个按钮,我一按就发送四个数字
如01H,00H,00H,00H,前面一位想表示要求单片机做的动作,后面是时间
这样的协议有问题吗?
具体的做法应该如何?谢谢
11-12-22 10:11
一般协议有起始值、数据、结束值,复杂的还有站地址、数据地址、数据长度、数据校验等,根据起始值来判断一帧数据的开始,结束值判断一帧数据是否完整,校验则是判断数据的正确性。
11-12-22 11:21
最好是用汇编写的,因为我只会一点汇编
如果是C,还得转回来
谢谢
11-12-22 11:29
中断接收.
两种方式解决你的问题.
1.规定头和尾,以及校验.中断发现了头,就等待连续接收后续的数据.当然,这个头必须是不和数据区能一样的字节.如,有用数据不可能出现ff,那就ff表示数据头.
2.规定通讯间隔.比如超过2个数据时间,就是结束上次,单片机清空缓存,下次一开始就是数据头.这样做的协议,典型的是modbus.
11-12-23 11:36
6楼
该帖内容不符合相关规定!
11-12-23 17:10
数据是不固定的,无法用这个来处理,规定时间也是我在想的方式,我在想如保判定时间的处理上了
这个路是找对了,只是还要实施,如果有个例子就更好了
谢谢
汇编的最好
11-12-23 20:20
汇编?要哪种的?
时间上是这样的:有点类似看门狗.
做一定时,一方面,定时器到,就清空通讯缓存.另一方面,如果有通讯中断,就清除定时器.
11-12-23 22:26
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)就不能达到即时应答的效果了
请老大指点
谢谢
11-12-24 14:16

上一页下一页

工控新闻

更多新闻资讯