Y_G_G 发表于 2022-10-19 14:01 感谢各位大佬回复。终于搞清楚了,是从机模块,接收发送切换太快,主机的接收漏收了。从机加了延时好了。 |
gaima 发表于 2022-10-18 22:50 增加一个全局变量 T0_1ms_uart 这个变量在定时器中断中++ //定时器中断 { if(T0_1ms_uart<250)T0_1ms_uart++;//串口时间++} 这个变量在串口中断中,每次接收到一个字节数据就清除 //串口中断 { T0_1ms_uart=0//接收完一个字节数据,重新计时 } 你就可以在while中增加一个 T0_1ms_uart>某个时间 这样的判断 只要T0_1ms_uart的值大于你设定的值,比如200mS,就说明:在串口接收完一个字节的数据之后,超过200mS就再没有接收到新的数据了 |
Y_G_G 发表于 2022-10-14 16:32 感谢大佬回复,是考虑到指令发出,处理,再接收,中间这段时间不可控。主机用while(count),那万一没收到信号,就要无限死机了,再加定时器的话,不是跟Delay(200)的延时一样的嘛。这问题困扰我好久了。 |
gaima 发表于 2022-10-14 09:15 不管是发送还是接收,正常来说,都不会用Delay(200)这种函数的 不管是发送/接收的数据是多少个字节的,都是同时进行的 中断中要检测是发送还是接收中断,只在中断中缓存数据 所有的数据又不是同步的,有时候你还没发送完,就接收到一个数据了 |
串口时序都是固定的,怎么会乱?乱的是你的波特率或数据格式不对,导致乱码。 |
Y_G_G 发表于 2022-10-13 13:18 欣瑞达或者迪文串口屏,它就是8字节指令,所以发送函数用的同一个。但是接收函数就不行了,空调机一个指令就有43个字节。我给定义了一个接收长度。怀疑发送delay时,接收中断已经启动,但是接收长度还使用的上一个长度。 |
人人学会单片机 发表于 2022-10-13 12:19 感谢,有样例,我学习最快了。 |
gaima 发表于 2022-10-12 22:50 如果你用串口屏,那就应该用跟串口屏一样的协议,这样一来,串口屏和空调控制就可以用相同的函数了 不用再自己搞一个什么协议 一般串口屏都有协议的 |
gaima 发表于 2022-10-12 20:07 在规定时间没有收到回复,说明这一路有故障放弃,然后通知下一路,同样过程。 |
用的是串口中断,我用485转usb试验,延时200,8字节数据才能完整的收到。怀疑是延时200里,已经接收到数据了。用max485,发送转接收,这主机接收完全没反应。用自动收发的485芯片,才看到我要的接收反馈5A A5。我只想做到基本的一问一答,主机和从机都是我写的,还扯不到rtu协议吧。 |
协议不是这样定义的,可以借用MODBUS协议 |
人中狼 发表于 2022-10-12 21:32 因为从机也是我瞎编的,都还没加入crc检验,协议按自己想的简单的来。我希望先架好框架,通讯正常顺畅,采集到的数据直接转到串口屏上去。 |
这是协议设计的问题,你现在的通讯协议不合适,或者可以说不算是通讯协议 |
xuyaqi 发表于 2022-10-12 19:36 对,就这个意思,我该怎么写,收到这个回复?光是加长delay,没效果。 |
gaima 发表于 2022-10-12 19:04 明显0101收到,在你的等待时间没有回复你,所以你得要求对方收到马上回复你,你收到0101回复后再通知下一位,这样才不会乱。 |
gaima 发表于 2022-10-12 19:04 你先去看一下,是不是Modbus 如果是,就不是你这种时序了 应该是接收和发送同时进行的 每接收一个字节的数据就保存一次,30mS没有接收到下一个字节,就认为是数据结束了 接收是要开启中断进行接收的,你不知道什么时候来数据的 单片机发送是另外一个程序,跟接收不一样的,你只管发送就行 |
感谢各位大佬回复。我是按照0101,延时等待回复;0104,延时等待回复;0103,延时等待回复,0102,延时等待。收到回复判断验证下,再发去5A A5。现在第一条,0104的指令发出,后才收到0101的回答指令。顺序乱了,影响我准确性。我加长延时也没用。还有0104、0103、0102的指令还有几率发不出被吞。 485单独测试从机,几乎不会漏发,响应时间也就30ms左右。 |
把读空调机状态,读空调传感器命令格式及回答格式搞清楚,就不会觉得乱。 |
感觉这就是Modbus,没什么乱不乱的 按照协议写就行 |
先构思一下,如何将数据整理成:你所认为的不乱,而后再按你整理的次序进行收发。 |