温柔的郎 发表于 2022-2-5 10:24 485不一定要用IO口做流控,直接用非门就可以,要会灵活用 |
郑效桂 发表于 2024-7-13 13:11 那段只是示范,你要先定义EN_485引脚 |
lkc8210 发表于 2022-2-5 11:59 我加了这个代码 编译报错 |
gongzhu 发表于 2022-2-11 21:46 那是微软的文件夹信息文件!正常的! |
| 楼主的电脑可能中毒了,每个文件夹下都有 desktop.ini ! |
|
lkc8210大神,我的串口1改串口2好像成功了,软件编译通过了,下载运行,计数啥的都正常,但是加入串口2中断后,程序运行速度明显变得很慢很慢了,有网友说这是程序频繁进入串口2中断导致的,我看了半天也没看明白,道行太浅!! 这个串口2 RS485通信估计就差一点了,但还不成功啊,还望大神指点指点啊!!感谢感谢!! |
| modbus rtu有些转成modbus tcp了,通过串口透传,哪位大侠有示例可参考? |
|
感谢大神指点 这是我的2个工程文件, 文件3,是大神的源文件,我经过整理,借鉴一些其他大神的风格,把一些子程序从主程序里分离出来,单独存放,增加了OLED显示程序,可以查看程序一些参数,把说明文字单独归类, 程序主控用的是STC8A8K控制器,依然用的是串口1通信,通信正常,Modbus上位软件可以修改STC8的内部寄存器文件5,是在程序3的基础上,增加了RS485接口,准备改成用串口2通信,但通信不成功,就是上面我发的那些情况, 烦劳大神有时间指点指点!!感谢! 我是做PLC电气自动化控制工作的,闲了没事也学习下单片机。 在plc行业里,通信已经做成个模块了,不需要怀疑他的好坏,因为专业的工程师已经验证过了, 开发人员只需要集中精力做好自己的控制就行了。 可单片机的里面,STM32已经有人做成模块了,但51依然是需要开发者自己搭建,测试每个模块,若用于开发,效率极其低下。
Modbus Client3.rar
(195.5 KB, 下载次数: 37)
Modbus Client5.rar
(198.49 KB, 下载次数: 31)
|
|
如果你没动过Timer.c和Timer.h的代码 那肯定是你的串口设置影响了定时器0 你要把你改过的代码贴上来 贴原代码上来干嘛呢? 定时器0的主要功作只是产生1毫秒的节拍 对Modbus信号计时看有没有超时
没有捆不捆绑的说法 |
|
NB的lkc8210大神,又来打扰你了!!你的程序用到是串口1通信,我试着改成串口2通信,但中断用的定时器没改,依然用的是定时器0, 改完编译无误,下载进芯片,用Modbus Poll软件通信连接,通信不通, 检查,测试后发现定时器0中断不运行,这是什么原因啊? 难道串口1中断只能用定时器0吗?我改成串口2,也得用定时器2吗?这是对应捆绑着的吗? 请大神有时间指导指导!! 感谢!! 定时器程序如下(串口1通信时也用的这个定时器0) Timer.c #include "Project.h" UINT8 idata c10ms; //10ms 计时 bit b1ms,bt1ms,b10ms,bt10ms,b100ms,bt100ms; //定义定时标志位 //定时器0初始化 void TimerInit(void) { TMOD = (TMOD & 0XF0) | 0X01;//定时器0模式配置 TH0 = TIMER_HIGHT;//定义初始装载值 TL0 = TIMER_LOW;//定义初始装载值 TR0 = 1; //定时器0开始计时 ET0 = 1; //使能定时器0的溢出中断允许位 } //定时处理//timerProc定时器0回调函数 //在C中,static主要定义全局静态变量、定义局部静态变量、定义静态函数。 void timerProc(void) { static UINT8 c200ms; static UINT8 c1s; b1ms = 0; b10ms = 0; b100ms = 0; ET0 = 0;//复位定时器0溢出中断允许位 //dwTickCount = dwIntTick; ET0 = 1;//置位定时器0溢出中断允许位 if(bt1ms) { bt1ms = 0; b1ms = 1; if(receTimeOut>0)//若接收超时>0 { receTimeOut--; if(receTimeOut==0 && receCount>0) //判断通讯接收是否超时 { receCount = 0; //将接收地址偏移寄存器清零 checkoutError = 0;//校验错标志位复位 } } } if(bt100ms) { bt100ms = 0; b100ms = 1; } if(bt10ms)//判断中断10ms标志位是否1 { bt10ms = 0; //清中断10ms标志位 b10ms = 1; c200ms++; //200ms计时器加1 if(c200ms >= 20) //判断是否计时到200ms { c200ms = 0; //清200ms计时器 } c1s++; //1s计时器加1 if(c1s >= testRegister[2]) //判断是否计时到1s { c1s = 0; //清1s计时器 testCoil[0]++; testRegister[4]++; // P14 ^= 1; } } } //定时器0 1ms 中断 void timer0IntProc() interrupt 1 { TL0 = TIMER_LOW; TH0 = TIMER_HIGHT; //dwIntTick++; bt1ms = 1;//设bt1ms初值=1 c10ms++; //c10ms自+1 if(c10ms >= 10)//如果c10ms>=10 { c10ms = 0; //把c10ms计时器清零 bt10ms = 1;//把bt10ms置1 } } |
温柔的郎 发表于 2022-2-5 10:24 有可能串口输出接一个非门,控制485模式,做一个自控流电路,就不用程序控制485模式了 |
| 感谢感谢!!实现Modbus控制的途径有好几种,大神引导大家在STC单片机上走了一条正确,简单,快速的路!! |
温柔的郎 发表于 2022-2-5 10:24 1。不是232或485,是用USB转串口下载线CP2102 如果想加485使能控制 可在Modbus.c内的beginSend内加上相关代码,例
2。对~因为某些型号只有一个串口 |
|
敢问大神,请教几个问题 1 你这测试时,单片机和电脑硬件连接是通过RS232还是RS485接口的啊? 若用RS485接口,程序里是要切换485使能端的, 没看见对485使能端的操作,你这应该是用的是RS232接口吧。 2 你这通信应该用的是串口1吧。 看程序里对串口初始化的操作,都是串口1的地址,
|
|
NB的大神!! 现在做工控,做控制器,要是没有通信,或者不能通信,那简直就是个鸡肋!! 51单片机再便宜,不能与其他设备Modbus RTU通信,那照样没人选择!! |