找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2445|回复: 21
打印 上一主题 下一主题
收起左侧

STC15单片机串口通信,时序太乱,怎么改程序?

[复制链接]
跳转到指定楼层
楼主


这是485的报文,黑色是主机发的,按01 01,01 04 ,01 03 ,01 02 逐条发,蓝色是从机回答。



主机的框架




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2022-10-12 17:06 | 只看该作者
先构思一下,如何将数据整理成:你所认为的不乱,而后再按你整理的次序进行收发。
回复

使用道具 举报

板凳
ID:401564 发表于 2022-10-12 17:59 | 只看该作者
感觉这就是Modbus,没什么乱不乱的
按照协议写就行
回复

使用道具 举报

地板
ID:94031 发表于 2022-10-12 18:18 | 只看该作者
把读空调机状态,读空调传感器命令格式及回答格式搞清楚,就不会觉得乱。
回复

使用道具 举报

5#
ID:1046624 发表于 2022-10-12 19:04 | 只看该作者
感谢各位大佬回复。我是按照0101,延时等待回复;0104,延时等待回复;0103,延时等待回复,0102,延时等待。收到回复判断验证下,再发去5A A5。现在第一条,0104的指令发出,后才收到0101的回答指令。顺序乱了,影响我准确性。我加长延时也没用。还有0104、0103、0102的指令还有几率发不出被吞。
485单独测试从机,几乎不会漏发,响应时间也就30ms左右。
回复

使用道具 举报

6#
ID:401564 发表于 2022-10-12 19:30 | 只看该作者
gaima 发表于 2022-10-12 19:04
感谢各位大佬回复。我是按照0101,延时等待回复;0104,延时等待回复;0103,延时等待回复,0102,延时等待 ...

你先去看一下,是不是Modbus
如果是,就不是你这种时序了
应该是接收和发送同时进行的
每接收一个字节的数据就保存一次,30mS没有接收到下一个字节,就认为是数据结束了
接收是要开启中断进行接收的,你不知道什么时候来数据的
单片机发送是另外一个程序,跟接收不一样的,你只管发送就行
回复

使用道具 举报

7#
ID:94031 发表于 2022-10-12 19:36 | 只看该作者
gaima 发表于 2022-10-12 19:04
感谢各位大佬回复。我是按照0101,延时等待回复;0104,延时等待回复;0103,延时等待回复,0102,延时等待 ...

明显0101收到,在你的等待时间没有回复你,所以你得要求对方收到马上回复你,你收到0101回复后再通知下一位,这样才不会乱。
回复

使用道具 举报

8#
ID:1046624 发表于 2022-10-12 20:07 | 只看该作者
xuyaqi 发表于 2022-10-12 19:36
明显0101收到,在你的等待时间没有回复你,所以你得要求对方收到马上回复你,你收到0101回复后再通知下一 ...

对,就这个意思,我该怎么写,收到这个回复?光是加长delay,没效果。
回复

使用道具 举报

9#
ID:384109 发表于 2022-10-12 21:32 | 只看该作者
这是协议设计的问题,你现在的通讯协议不合适,或者可以说不算是通讯协议
回复

使用道具 举报

10#
ID:1046624 发表于 2022-10-12 22:50 | 只看该作者
人中狼 发表于 2022-10-12 21:32
这是协议设计的问题,你现在的通讯协议不合适,或者可以说不算是通讯协议

因为从机也是我瞎编的,都还没加入crc检验,协议按自己想的简单的来。我希望先架好框架,通讯正常顺畅,采集到的数据直接转到串口屏上去。
回复

使用道具 举报

11#
ID:384109 发表于 2022-10-12 23:16 | 只看该作者
协议不是这样定义的,可以借用MODBUS协议
回复

使用道具 举报

12#
ID:1046624 发表于 2022-10-13 08:47 | 只看该作者
用的是串口中断,我用485转usb试验,延时200,8字节数据才能完整的收到。怀疑是延时200里,已经接收到数据了。用max485,发送转接收,这主机接收完全没反应。用自动收发的485芯片,才看到我要的接收反馈5A A5。我只想做到基本的一问一答,主机和从机都是我写的,还扯不到rtu协议吧。
回复

使用道具 举报

13#
ID:94031 发表于 2022-10-13 09:50 | 只看该作者
gaima 发表于 2022-10-12 20:07
对,就这个意思,我该怎么写,收到这个回复?光是加长delay,没效果。

在规定时间没有收到回复,说明这一路有故障放弃,然后通知下一路,同样过程。
回复

使用道具 举报

14#
ID:390416 发表于 2022-10-13 12:19 | 只看该作者
回复

使用道具 举报

15#
ID:401564 发表于 2022-10-13 13:18 | 只看该作者
gaima 发表于 2022-10-12 22:50
因为从机也是我瞎编的,都还没加入crc检验,协议按自己想的简单的来。我希望先架好框架,通讯正常顺畅, ...

如果你用串口屏,那就应该用跟串口屏一样的协议,这样一来,串口屏和空调控制就可以用相同的函数了
不用再自己搞一个什么协议
一般串口屏都有协议的
回复

使用道具 举报

16#
ID:1046624 发表于 2022-10-14 09:08 | 只看该作者
人人学会单片机 发表于 2022-10-13 12:19
参考这个  http://www.51hei.com/bbs/dpj-214747-1.html

感谢,有样例,我学习最快了。
回复

使用道具 举报

17#
ID:1046624 发表于 2022-10-14 09:15 | 只看该作者
Y_G_G 发表于 2022-10-13 13:18
如果你用串口屏,那就应该用跟串口屏一样的协议,这样一来,串口屏和空调控制就可以用相同的函数了
不用再 ...

欣瑞达或者迪文串口屏,它就是8字节指令,所以发送函数用的同一个。但是接收函数就不行了,空调机一个指令就有43个字节。我给定义了一个接收长度。怀疑发送delay时,接收中断已经启动,但是接收长度还使用的上一个长度。
回复

使用道具 举报

18#
ID:1034262 发表于 2022-10-14 10:19 | 只看该作者
串口时序都是固定的,怎么会乱?乱的是你的波特率或数据格式不对,导致乱码。
回复

使用道具 举报

19#
ID:401564 发表于 2022-10-14 16:32 | 只看该作者
gaima 发表于 2022-10-14 09:15
欣瑞达或者迪文串口屏,它就是8字节指令,所以发送函数用的同一个。但是接收函数就不行了,空调机一个指 ...

不管是发送还是接收,正常来说,都不会用Delay(200)这种函数的
不管是发送/接收的数据是多少个字节的,都是同时进行的
中断中要检测是发送还是接收中断,只在中断中缓存数据
所有的数据又不是同步的,有时候你还没发送完,就接收到一个数据了
回复

使用道具 举报

20#
ID:1046624 发表于 2022-10-18 22:50 | 只看该作者
Y_G_G 发表于 2022-10-14 16:32
不管是发送还是接收,正常来说,都不会用Delay(200)这种函数的
不管是发送/接收的数据是多少个字节的,都是 ...

感谢大佬回复,是考虑到指令发出,处理,再接收,中间这段时间不可控。主机用while(count),那万一没收到信号,就要无限死机了,再加定时器的话,不是跟Delay(200)的延时一样的嘛。这问题困扰我好久了。
回复

使用道具 举报

21#
ID:401564 发表于 2022-10-19 14:01 | 只看该作者
gaima 发表于 2022-10-18 22:50
感谢大佬回复,是考虑到指令发出,处理,再接收,中间这段时间不可控。主机用while(count),那万一没收 ...

增加一个全局变量 T0_1ms_uart

这个变量在定时器中断中++
//定时器中断
{
if(T0_1ms_uart<250)T0_1ms_uart++;//串口时间++}

这个变量在串口中断中,每次接收到一个字节数据就清除
//串口中断
{

T0_1ms_uart=0//接收完一个字节数据,重新计时

}

你就可以在while中增加一个   T0_1ms_uart>某个时间   这样的判断
只要T0_1ms_uart的值大于你设定的值,比如200mS,就说明:在串口接收完一个字节的数据之后,超过200mS就再没有接收到新的数据了
回复

使用道具 举报

22#
ID:1046624 发表于 2022-10-22 16:51 | 只看该作者
Y_G_G 发表于 2022-10-19 14:01
增加一个全局变量 T0_1ms_uart

这个变量在定时器中断中++

感谢各位大佬回复。终于搞清楚了,是从机模块,接收发送切换太快,主机的接收漏收了。从机加了延时好了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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