实际项目请教:单片机驱动步进电机,由上位机通过串口通讯控制
学单片机不久,基本能做流水灯、逻辑控制之类的。最近有朋友交来一个项目,上位机通过串口和单片机通讯,单片机接驱动芯片带步进电机。上位机程序由别人用VC写,给了通讯协议如下。
单片机用的是89C2051, P1.0、P1.1控制1号步进电机,P1.0输出脉冲,P1.2输出高/低电平作方向信号;P1.2、P1.3控制2号步进电机,同理是P1.2输出脉冲,P1.2输出方向信号。脉冲数和方向信号由上位机指定。
看了一些书上讲串口的内容,都是把端口的状态或是某个存储单元的内容发送及接收,对应这个项目感觉毫无头绪,主要是帧结构还不太理解,校验、响应码什么的在单片机中怎么实现?请各位老师看一下,能给个示例程序吗提供点思路吗?
步进电机控制通讯接口协议
说明:1,按照节1进行数据定义
2,串口通讯参数为:9600bps,8,1,无奇偶校验
1,通讯数据帧结构
包头标识 包长 数据 校验
0x7f Sum1 Sum2
1)每包数据以0x7f为数据开头标识;
2)“包长”为数据字段+校验字段 的数据字节长度;
3)数据通讯采用“呼叫-应答”处理模式,由上位机呼叫,下位机应答处理模式;
4)包头标识,包长字段分别为1字节长度,校验为2字节长度,数据字段长度由以下具体协议决定;
5)校验 方式为 包头标识+包长+数据字段 的求和。校验和= Sum1*256+ Sum2.
2,通讯协议(数据字段部分定义)步进电机输出
上位机请求
地址 功能码 转角方向1 转角增量1 转角方向2 转角增量2
0x01 0x02 0/1 Δ1 Δ2 0/1 Δ3 Δ4
、
说明:
1)转角方向,1-顺时针,0-逆时针
2)转角增量1=Δ1*256+Δ2; 转角增量2=Δ3*256+Δ4
转角单位为度;转角增量数据应少于300,否则下位视为无效数据
下位机响应
地址 功能码 响应码
0x01 0x01 R
说明:
响应码:0-正确完成,1-无效数据,2-校验和错
[解决办法]
单片机的串口通讯,只需要设置好相关参数,如波特率、通信端口设置等,即可在相应的寄存器中写入发送数据,或触发后读相应寄存器得到数据。在调试的时候,利用示波器,可以事半功倍。
串口的帧格式是自己在相关的寄存器中设置决定的,一般设置为8位数据,即8个BYTE的数据,校验位一般是经过设置后自动添加的。
http://download.csdn.net/source/1172712
[解决办法]
网上有本书: 单片机模块开发实例导航 有实例代码可以参考
[解决办法]
这种协议大都是自定协议,很简单
8个字节通常用固定的特殊头字节和特殊尾字节作为通讯开始和结束的标志,以防范通讯错位(头字节和尾字节不要用相同的数值,以免错位)
剩余的六个字节,根据协议需求内容的多少,一般要有该帧的数据类型(是命令帧还是数据帧),该帧所传输的数据(即通讯的是什么命令或数据,此处的命令或数据也是用数值指代,通讯双方约定好命令意义,如约定0x01为正转,约定0x02为反转,那么直接通讯0x01或0x02即可代表相应命令,接收端根据约定执行相应命令),如为数据帧的话,则还有相应的数据值(例如在之前的字节里分别却认为数据帧格式,转角数据值,则后续的字节里应有转角的数据量,此处需要注意的是,一个字节最大值为255,如超过,则需要用两个字节来表示该数据量,可表示65535的范围)
如果你即将编写的协议,比较简单,可以把命令动作集中在一个帧内解决,这样可以减少通讯的开销
下位机的回应,也是上述的方法相同的
你的疑惑,我在最初接触通讯的时候也有的,其实只要记住一点就能明白了,通讯的精髓,是双方约定好各个命令和数据的含义,利用已明了其指代的数值进行通讯工作。不明意义的数值,是不应该出现的,若出现,硬件问题造成的不明意义数值,应尽力加以解决以降低其出现概率达到可以接受的程度,在操作中对其不予作用或回复出错提示帧。软件问题造成的不明意义数值,应完全解决。这也是整个系统的容错能力的表现,在设计时应该预先考虑到
[解决办法]
先调试好串口通信,然后再根据客户所定的协议,控制步进机,这就是头绪,简单的编程.