以下为单片机串口485通讯程序,从机程序当然也适用于主机程序,主机发送可以先用串口帮手软件来调试,经过KeiluVisio
4实际测试,测试效果如结尾图片所示大部分来自网络,只是改了两个地方le
sizeofdbuf,ifi__ERRLEN1帧超长,错误,返回就可以实现了,其中的原因自已体会吧if
def__485_C__defi
e__485_C__i
cludereg51hi
cludestri
ghi
cludestdiohi
cludei
tri
sh
defi
eucharu
sig
edchardefi
eui
tu
sig
edi
t通信命令defi
e__ACTIVE_0x01主机询问从机是否存在defi
e__GETDATA_0x02主机发送读设备请求defi
e__OK_0x03从机应答defi
e__STATUS_0x04从机发送设备状态信息defi
e__MAXSIZE0x08缓冲区长度defi
e__ERRLEN12任何通信帧长度超过12则表示出错uchardbuf__MAXSIZE该缓冲区用于保存设备状态信息uchardbuf__MAXSIZE01234567该缓冲区用于保存设备状态信息uchardev该字节用于保存本机设备号sbitM_DEP10驱动器使能,1有效sbitM_REP11接收器使能,0有效voidget_status调用该函数获得设备状态信息,函数代码未给出voidse
d_datauchartypeucharle
ucharbuf发送数据帧bitrecv_cmduchartype接收主机命令,主机请求仅包含命令信息voidse
d_byteucharda该函数发送一帧数据中的一个字节,由se
d_data函数调用voidmai
uchartypeucharle
系统初始化P10xff读取本机设备号devP12dev0x01TMOD0x20定时器T1使用工作方式2TH1250设置初值TL1250TR11开始计时PCON0x80SMOD1SCON0x50工作方式1,波特率9600bps,允许接收
fES0关闭串口中断IT00外部中断0使用电平触发模式EX01开启外部中断0EA1开启中断主程序流程while1主循环
ifrecv_cmdtype0
回
发生帧错误或帧地址与本机地址不符,丢弃当前帧后返
co
ti
ue
switchtype
case__ACTIVE_主机询问从机是否存在se
d_data__OK_0dbuf发送应答信息,这里buf的内容并未用到
break
case__GETDATA_le
strle
dbuf在C51中不能这个函数计算u
sig
edchar型,这个函数只能计算char型
le
sizeofdbuf
le
0x08se
d_data__STATUS_le
dbuf
发送设备状态信息
break
defaultbreak
命令类型错误,丢弃当前帧后返回
voidREADSTATUSi
terrupt0usi
g1函数使用寄存器组1
产生外部中断0时表示设备状态发生改变,该
get_status获得设备状态信息,并将其存入dbuf指向的存储区,数据最后一字节置0表示数据结束
该函数接收一帧数据并进行检测,无论该帧是r