在线时间112 小时
UID224171
注册时间2007-11-27
NXP金币186
TA的每日心情 | 无聊 2021-11-8 23:15 |
---|
签到天数: 154 天 连续签到: 1 天 [LV.7]常住居民III
金牌会员
 
- 积分
- 1052
- 最后登录
- 2025-8-20
|
发表于 2012-4-11 23:58:19
|
显示全部楼层
回复:做工控的,K60做modbus怎么样
回复第 17 楼 于2012-04-11 14:15:23发表:
回复第 16 楼 于2012-04-10 22:35:15发表:
回复第 14 楼 于2012-04-10 16:19:50发表:
回复第 13 楼 于2012-04-10 13:35:06发表:
回复第 12 楼 于2012-04-10 11:04:13发表:
回复第 11 楼 于2012-04-10 10:27:52发表:
完整的一楨数据接收,可以用UART的空闲中断来实现,不需要3.5个字符时间的超时中断,单独开个定时器的。至于DMA收到的数据长度,完全可以根据功能码来判断收到的数据桢的长度,再来解析CRC,至于发送的数据长度完全是由你自己来定的,所以K60做Modbus很easy!
飞思卡尔的空闲中断,是连续十一个空闲位电平,是不是大概只是一个字符的长度,时间是不是很短啊,也就是对发送方的时序要求很严格?
都这么长时间了楼主怎么还在这纠结?你想一想modbus是1979年推出的,那时的单板机那么慢都能实现,现在近100M的单片机还有问题吗?
Modbus我做过几个版本,跟你交流一下吧:
如果你要严格遵守Modbus-RTU协议,那你用串口中断接收数据。每接收一个字节都读时钟计数器,监测1.5T(字符间隔) 和 3.5T(桢间隔)。另外在接收中断内,设置一个3.5T的超时时钟中断,如果3.5T时间内没有新的数据,超时中断被触发,设置桢结束标志。
在Modbus处理子程序内,当看到桢结束标志后,效验CRC值,同时验证地址,出错按Modbus协议处理。如果你的波特率在19.2K左右,该方法足够应付,几十台分机都没问题-- 因为每次中断服务也就是几微妙,而1。5--3。5T是毫秒级的。
如果你的波特率很高,那就用DMA只接收收据(不中断)。另外设一个周期计时中断,如每300uS中断一次,每次中断检查dma 有没有收到新的数据,如果间隔时间超过1.8mS就设置桢结束标志。后续的处理和上边一样。用这种方法我处理了波特率是115200的通讯。
我测过很多Modbus产品,包括一些著名的PLC和HMI,真正严格监测1.5T和3.5T的不多。和他们的开发人员也交流过,他们说判错主要靠CRC。
另外你用过带地址桢标志的单片机也不符合Modbus协议吧?如果上下位机都是自己做还可以打擦边球。
谢谢你!我应该是受LPC影响太大了,他的串口功能实在是贴心,呵呵,lpc1700,所以就拿它做标准了,其实只要不是特别的完美主义,实现modbus也不是特别困难,我觉得您说的第二种方法比较适合我,这样也就不需要所谓的MARK位了,我是计划,第一位是带MARK位的这样下位机只接受带MARK位的,如果产生中断,判断是否与本机地址匹配,若匹配,则改变串口配置,接受不带mark位的数据,并打开10ms定时器,上位机的一帧,必须在10ms内传输完(当然,根数数据量可以更改),10ms后校验crc;否则不改变串口配置,不再产生中断,直到下一次接收到带mark位的数据,这是我目前的打算,应该中断也是比较少的,尽管频繁的中断可能没那么讨厌。
你在接收过程中更改串口设置会不会导致丢失数据?理论上当你处理第一个数据中断时第二个数据是正在往里串的。
原来用的也是115200,偶尔会通信失败,还可以,中断的响应还是很快的,数据的实时性强,不要求每次都正确
我用的是S08, 如果用MARK的方式, 平常让串口 WAIT 进入模式, 这种情况下只有带MARK的数据会产生中断, 之后程序判断是否跟自己匹配, 如果不匹配则再进入WAIT模式, 这样的话中断会少很多.
|
|