小议一下串口通信相关概念(新家)

[复制链接]
8465|40
 楼主| lxl_0598 发表于 2010-2-5 10:54 | 显示全部楼层
串口调试助手  第一个框 是发送显示区   第二个 是接收显示区
 楼主| lxl_0598 发表于 2010-2-5 10:59 | 显示全部楼层
yewuyi发表于 2010-2-5 10:34 | 只看该作者 回复 引用 评分 报告 返回版面 TOP  得分:0
17楼: MODBUS的主要含义还是数据层面的协议,物理层可以是232,也可以是485,并没有太多的限制。

MODBUS中的TCP/IP 是应用层的 这个比较高级 不知叶大侠 可否稍微讲讲
 楼主| lxl_0598 发表于 2010-2-5 11:03 | 显示全部楼层
再来一张图
图四
发送端 8位数据 +1位奇校验
接收端 5位数据 + 1位奇校验

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
yewuyi 发表于 2010-2-5 11:06 | 显示全部楼层
我也只是在工业控制中用过RTU和ASCII,没有MODBUS应用在TCP/IP中的实际经验,不敢妄谈,ZLG公司好象有一个MODBUS应用在TCP/IP中介绍,你可以到它的网站上找找。
 楼主| lxl_0598 发表于 2010-2-5 11:10 | 显示全部楼层
不知道有没有 串口数据流监听工具 就是可以看到 物理层上的比特流 起始位 数据位 停止位

哪位有 还望分享一下
mohanwei 发表于 2010-2-5 11:15 | 显示全部楼层
花四五百买个数字逻辑分析仪即可
 楼主| lxl_0598 发表于 2010-2-5 11:17 | 显示全部楼层
从图片三 和图片四 可以看出
即使我们发送端选择的是 5 位数据 但实际上 是发送了8位数据(上例为0XC5)这也就是为什么图三中我们可以接收的0XC5这个数据。
所以 数据位 5/6/7/8位 是指有效数据位 也就是含用户信息的数据,就比如说MODBUS中ASCII模式里是以ASCII模式发送 因为ASCII码对应了0--127 HEX 也就是说1字节中我们只要用低7位,第八位可以不用,此刻我们可以选择7位数据位或8位数据位,当选择了8位数据时我们可以把第8位作为奇偶校验位(PIC中奇偶校验是用软件实现的)
 楼主| lxl_0598 发表于 2010-2-5 11:18 | 显示全部楼层
mohanwei发表于 2010-2-5 11:15 | 只看该作者 回复 引用 评分 报告 返回版面 TOP  得分:0
26楼: 花四五百买个数字逻辑分析仪即可


呵呵 是个办法  有没有PC上直接用软件检测的,  个人觉得是可以实现的  不知道群里有没人有兴趣DIY一个
 楼主| lxl_0598 发表于 2010-2-5 20:53 | 显示全部楼层
ls 正解
lusen21 发表于 2010-2-6 08:38 | 显示全部楼层
;P半双工相当于双方向单车道中有一车道正在维修,车可以从A开到B,也可以从B开到A,每次有且仅可以向一个方向的车行驶。
2# lxl_0598
wuwei1029 发表于 2010-2-6 08:58 | 显示全部楼层
搬个板凳听老师讲座:D
algr 发表于 2010-2-6 09:54 | 显示全部楼层
modbus规约中主站和从站是问答型交互,可以说是为485量身定做,作为以太网应用层协议当然也可以!
但是太委屈TCP/IP了吧?
 楼主| lxl_0598 发表于 2010-2-6 11:31 | 显示全部楼层
以上说的基本上是硬件上的问题,那么软件上的呢?
说说串口UART驱动 该怎么写,很多大牛 说过 采用 中断+队列的 方法实现,对于菜鸟来说可能是刚知道什么是队列,至于具体的实现方式,更是不清楚。 请哪位有经验的 进来谈一谈。
 楼主| lxl_0598 发表于 2010-2-6 11:32 | 显示全部楼层
自己先搬把凳子坐着,等着听课。
ermingpi 发表于 2012-1-13 20:19 | 显示全部楼层
受教了。分层的思想很重要。有助于理解通信协议。
刘前辈 发表于 2012-1-14 11:05 | 显示全部楼层
34#
说说串口UART驱动 该怎么写,很多大牛 说过 采用 中断+队列的 方法实现,对于菜鸟来说可能是刚知道什么是队列,至于具体的实现方式,更是不清楚。 请哪位有经验的 进来谈一谈。


书上网上都有,Keil 51现成的。
提高注意力就行:队列是环形缓冲器应用,8字节数组足够了(组成环)。


、、
刘前辈 发表于 2012-1-14 11:33 | 显示全部楼层
本帖最后由 刘前辈 于 2012-1-14 11:48 编辑

下面摘自KEIL接收程序—中断+队列:
#define  ILEN  8          /* size of serial receiving buffer      */
unsigned char  iend;                  /* receiving buffer end index     */
idata    char  inbuf[ILEN ];   


serial () interrupt 4 using 2  {     /* use registerbank 2 for interrupt      */

  if (RI)  {             /* if receiver interrupt                 */
    inbuf[iend++ & (ILEN-1)] = SBUF;      /* read  character          */
    RI = 0;              /* clear interrupt request flag          */
     }
}

注释:   inbuf[iend++ & (ILEN-1)] = SBUF;   // 所谓(环形)队列,相当于下面环形缓冲器优化:
               inbuf[ iend++ % ILEN ] = SBUF;      




//
xyz549040622 发表于 2012-1-16 05:00 | 显示全部楼层
刘前辈整整迟了一年,哈哈
储小勇_526 发表于 2012-1-16 08:32 | 显示全部楼层
:lol我是来论坛接受教育的:victory:
shichaogang 发表于 2012-1-16 12:58 | 显示全部楼层
我也是来接受教育的:lol
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部