• 串行通信之狂扯篇


    Unifax
    2009.4.16
    Unifax@163.com

    本文是写给初学者的菜文 大虾勿怪 文章有说的不妥之处 欢迎来信批评 

    串口通信是一种很经典很古老的通信方法了 之所以用了这么多年没有彻底废弃其中一定有它的过人之处。

    现在电脑是越来越“不务正业”了仿佛是只关心游戏玩家的感觉,什么8800GT啦~~~~

    而串口正在消失,主流的本本上是绝对看不到这个接口啦 PC的PCB上也慢慢退化这个接口 先是画下了接口 但是没焊 你可以买个公的DB9 回来焊上 后来见的是画了个方形的10PIN接口 标的是COM口 你可以自己焊3根线出来使用 再后来的主板画都懒得画了 焊线都不知道从哪里下手了。

    一些工控专用的板子就比较厚道了 除了CPU老点 找不出啥毛病了 借口特全 7~8个PCI槽 甚至还有2个ISA槽 这个板子就不能玩游戏了 还是有遗憾啊

    比串口先下课的是并口 在上世纪末 并口还是很牛X的 当时USB没有流行开来 所有的Printer 基本都需要连接老的DB25 就是这样 DB25才被人们称之为打印机接口 其实我很喜欢这样叫这个接口的。后来USB技术像是泼了大粪的青草 迅速崛起 导致奶奶级的接口迅速被打进冷宫 很少问津 直到被PCB工程师清除出库。

    当然科技永远是进步的 USB的优点很多 前不久听说好像快出USB3.0了 真担心哪天睡醒了都不会用电脑了

    串口由于速度慢 封装体积大 电源电压复杂 占用电脑中断(其实就占一个BIOS中断)等等恶行正在遭受封?。但是还有很多很好的芯片能把USB转到COM口 比如说PL2302就是一款很好很好的Brage 可惜的是基本所有转换的Brage芯片换出来的不是真正的串口 仅仅保留了RXD TXD GND 3根线 其他的都是摆设 

    并口遭遇冷落后就老实的下课了 它唯一的姘头Printer现在拜了USB 其他的外设基本不招惹这个接口 很少有的是一些游戏手柄 稍描仪 曾经也和它Happy了一段日子 后来也都拜拜 换上了先进的USB接口 现在倒是工业上面还有使用 另外就是一些下载线 仿真器之类的嵌入式概念还再不依不饶的使用该接口 搞得受伤的永远都是 编程员

    好再有公司或者大虾出了usb 版本的51和AVR下载线 叫ISP_PRO还允许免费使用 至于硬件是用M8做的 网上有公板的电路 回来焊好了基本就可以用了 不是很复杂 在Taobao上卖的成品也不贵 20~30块钱就搞的到 做工精美 还有用读卡器壳子装的 很棒的

    但是其他的一些单片机开发使用并口一直比较烦人 要么花钱买个旧的电脑带并口的 要么不知道咋办---------改行?是个不错的想法 但是估计很少人舍得放下 苦心学习了多年的黑色蜈蚣片片 哪能脑袋一热就放的下呢 ?有佛说 放下了 就得到了 可惜一般人成不了否的

    尤其是电子爱好者 别的我不知道 电子爱好者我还是当过的 别的基本不会 像啥打球啦 踢球啦泡MM啦基本业余 唯一喜欢的就是烙铁的味道 万用表的~~有点词穷啊

    所以很难放下的 是成不了佛的

    既然成不了佛 就老老实实地当人吧 继续专研那些蜈蚣片片 乐在其中 也是好事 有钱难买爷高兴 这才是正确的心态 有了这颗心再加上一些时间 是会有收获的 怕的就是那些为了考试啦 挣钱啦 之类的反证就是动机不是很纯洁的搞片片 已开始要是抱这个心态学习不知道后来能成啥样子 反正我碰到的片友基本属于前一种情况 搞得有声有色后才会要求赚钱之类的,也是天经地义的。

    这就是以前我发帖子抄的一段名言“一个不成熟的男人的表现是为了某项事业英勇的?死,而一个成熟男人的表现是为了这个事业尔卑贱的活着”

    最近比较心烦 主要是工作没着没落 家里面有崔着结婚 造娃娃 在这也发泄一下

    我干了很多行当了硬件开发 编程员 网络管理员 我学习CCNA 海尔售后 我用水转打过空调的洞 再早修过电器

    但是我一直没有放弃学习电路 早在5~6岁被启发了这个兴趣一直到今天 怪自己没有好好学习考名牌大学深造 哎后悔是没有用的 抬头看前面吧

    很多和我一样的人 80后 快奔3的人了 啥都没闹下 心理着急啊

    也有很多电子爱好者和我一样 不管以后干啥 都不愿意放下电子这个东西 哪怕不是工作内容仅仅当成一个娱乐项目 但是更多的是希望和工作相结合 在工作中娱乐

    不幸的是我要说一下不可能因素 

    工作永远是工作 在我参加工作之前 我说我一定要热爱自己的工作 把自己的工作当成自己的一切 但是我还是天真了 工作就是工作 在平时的任何有意思的事 一旦放在工作中 久了以后都会腻烦的 不是我不敬业 也不是我心里状态不佳 在一个大的公司里面上班,同事之间是啥样子呢??整天的勾心斗角 表面一团和气 背后谁都不是省油的灯 真的烦了 大家一起发财 和气生财多好啊 为啥都要搞得你死我活呢?估计是闲得没事干 闲出的毛病

    我热爱电子 我热爱工作 我更热爱生活 但是在工作中干与电路相干的事情确实能把人磨的没有士气了 一段时间就是为了商业上的事情脚打后脑勺,根本无暇顾及技术 说道底 人为了赚钱公司更为了赚钱。

    结论就是把爱好放在工组中是可以的 只是慢慢的你的乐趣就会被磨灭的 好再我以及我见过的师哥们都是成熟的男人 还在卑贱的活着 没有放下片片技术。

    哎呀这都扯到哪里啦 

    说的事并口吧 还是买个旧的本本用吧 反正也不会玩魔兽 红警还是能跑得起来的

    关于用usb转并口的话 中关村有卖的线 20来块钱 不幸的就是这种线只能接PRINTER 单片机是不能用的 Taobao上有几根200~500的线 (搜 USB 真正的并口)说是能用 实际就不知道了 可惜太贵 说是德国版本的。

    再说串口阿 感觉真的很幸福 usb可以转的 单片机也可以用的 关于串口硬性的指标参数我就不给大家拷了 Baidu上一搜一大堆的 咱们坛子里也有相关资料 看看就好

    主要用的就是3根线

    TXD RXD GND 剩下的线单片机没法连接了

    一般做电脑要是控制电器的话串口是很方便的弄法 也可以是USB控制 可以转成串口的

    在电脑上写上位机软件的话 牛人一般喜欢用C++ 我比较菜用的是好学好用的VB 自己感觉VB功能强悍 代码好看(比C来说还是差了很多)面向控件 面向事件编成可以很容易的搞掂事情 

    放个图片看看

    去年焊的遥控小车半成品 用无限遥控 和无限数串操作

     




    VB里面要是操作串口自然要用到MSCOMM控件的 关于VB和这个控件 书店有专门的书讲 书是厚了点 但是不难 就是烦

    下位机是要配合上位机工作的 下位机是单片机 自然要用经典的C语言了(不要说汇编 我怕)这样做就是说在你整个系统中使用了2种八杆子打不着的语言 他们之间的关系仅仅是通过串口的一个通信协议了来做媒。那么就要看看这个通信协议的订立了

    既然是协议 当然是要谈好的 怎么谈 谈什么 不重要 重要的是大家都要签字按手印

    硬协议也就是最最底层的协议 美国人订的 咱们就只能是按照霸王条款执行了

    比如说RS232协议 规定了 正电平是 负电压 负电平是正电压 不知道当时咋想的

    还有就是铁壳DB9 的封装 虽然我现在看那个铁壳还是以前那么帅 

    再就是说的线序啦 起始位 停止位 数据长度之类的 都是美国定好了的

    想用的话就只能遵守了 否则就不用 没啥好说的

    起始有规定是好事 都规定好了 大家就都能站在一个起跑线上听令了

    底层协议的制定是为了从根本上保证数据传输的有效性 万丈高楼平地起这里也适用

    好在这些底层协议的制定是很多伟大的科学家共同努力的结晶 有效性是一定能保证的

    那么我们需要做的是什么呢?

    是在地基上盖大楼 上层协议的制定 这部分就比较灵活了 也比较有意思了 另外就这部分的制定也能深深地看出一个人的性格

    举个例子说事 

    听偶舅舅说的 他们村里有个人叫 XX 巨逗 有年春耕 (偶家内蒙古地多人稀每家的耕读面积都很大的)别的人都是赶着牛快速作战 所以牛老是挨鞭子 这样基本是牛上午劳动完成后 下午就可以歇着了 下午是人在做一些不用牛的工作 或者是换个牛。而这位XX呢 上午点上锅烟 赶着牛干 从来不打牛 导致牛越干越慢越偷懒 而XX呢 抽着烟 扶着犁 骂牛 说你给老子不快点 老子不给你停 所以经常是他家的牛和他劳动一天。苦啊 真不知道这个牛后来悟出来没有

    这个例子能说明啥问题呢?

    正是一个事情有很多的解决办法 甚至说没有好不好的方法 正是塞翁失马的思想

    就说这个通信有2个对象 

    咱们把他们看成是一对情侣 就有了以下的内容

    男:老婆

    女:哦我在

    男:我想XX

    女::(不说话)

    等了一会儿

    男:老婆?

    女:嗯我在呢

    男:我想XX

    女:宝贝乖阿 马上就好

    男:哦

    画外音~~~厕所马桶冲水 女的出来 男的拿着手纸进去出恭

    这就是典型的IIC通讯协议 

    先寻址器件 器件应答 然后发送数据 器件没有发回应答 认为是器件没有收到刚才的数据 从新寻址 (写或读)器件再应答 然后再发送数据 器件给出应答信号(写或读)(或者说器件送出数据)然后主机发送应答信号然后挂断通讯

    不知道看出来没有 计算机通信与人与人的交流有雷同的地方 其实也不奇怪 通信协议是人制定的 所以自然是人处世为人的方法 简单通信有以下几种方法

    一 老子和儿子的关系

    一般是老子再训儿子 儿子不敢说话

    表现如下

    老子:你MD你XXXXXXXXXX

    儿子:不敢说话(其实心里就不知道咋想的啦)

    老子:你?妈你要是再XXXXXXXX

    儿子:(低头不语)

    老子::给老子掏根烟抽

    儿子:(赶紧从口袋里拿出软白沙)

    老子:你?他?妈XXXX抽XXX中华 给老子XXX白沙

    儿子:(赶紧从另外的口袋里掏出软中华)

    老子:XXX

    在这种通信模式下 首先仅有的是2个对象 再就是 单工通信 只有老子训儿子 指挥儿子的份 儿子不能说话

    二 妈来了

    表现如下

    老子:你MD你XXXXXXXXXX

    儿子:不敢说话(其实心里就不知道咋想的啦)

    老子:你妈你要是再XXXXXXXX

    儿子:(低头不语)

    老子::给老子掏根烟抽

    ~~~~~妈妈此时赶来~~~

    儿子:(赶紧从口袋里拿出软白沙)

    妈妈:(看到儿子口袋里面的白沙)说 孩子啊 啥时候学会的抽烟 不好

    老子:点着烟 说 孩他娘 他比我还学会的早呢 

    妈妈:抽烟有害健康 还是吸点XX好

    老子:XXX

    这个就比较有意思了 3个人的话题了 儿子还是单工的方式 就是只能听不能发

    老子是可以发给任何一个人的

    妈妈不仅可以发给任何人还可以群发 (妈妈:抽烟有害健康 还是吸点XX好)

    三 上面说的男女那段 ,有说有笑 有打有闹 加入再来第三者 更热闹 大家可以想象下

    然后把情景写在这里

    总之费了这么半天话 一定要总结出来的是

    1 通讯的设备数目 

    2 每个通信单位是 单工的呢 还是半双工的 还是全双工的

    3 寻址 也就是叫名字

    4 比较经典的一些东西 当收到一句话后 沉默了 或者是发出一堆信号后 对方未回应 对于这种情况咋处理(也就是咋看待沉默的问题)需要事先明确的约定 因为计算机是死的不会思考你是在夸他还是骂他 

    扯了这么多没用的 有人就要骂我了 是不是故弄玄虚?实话说 有点 其实内容是很简单的

    写个伪代码的工控流程图

    要求是 下位机控制3台水泵抽水 上位机可以和下位机象情侣那样通信 打听下位机水泵的情况下位机也可以听上位机发来的指令 打开或者关闭水泵 同时再报告上去

    伪代码如下

    1 上位机启动 通过串口发送“SB_Plaes Call Me ”

    2 下位机收到字符后 存在数组中 和早先烧进来的数组测试 if 相等

    3 Then 发送”you areSB LZ on Line” 发完以后整理自己的电机数据准备发走

    4 上位机收到了字串 ”you areSB LZ on Line” 对比自己定好的字串 相等

    5 显示与下位机联机正常同时

    6 发送数据 “Give me Data for MOTO”同时显示正在获取电机信息

    7 下位机(下文称单片机)收到同样比较自己的数组 对的话 

    8 把3个电机的信息发给上位机(下文称电脑)

    9 上位机收到以后 显示在屏幕上

    A同时给下位机发送“I know it now hangup ,if you has some chaged call me see you SB”

    B单片机收到比对以后 不再理电脑 开始监控电机

    假如 电脑启动的时候 发送的“SB_Plaes Call Me ”没有回应 电脑再发20遍 如果还没有回应的话屏幕显示于单片机联机失败 请检查单片机

    假如 有人操作电脑要打开电机1 电脑就操作到上面的地4行 然后操作以下的内容

    C 给下位机 发送 “shutdown moto1”

    D 单片机收到后 关掉电机1 然后 发送给电脑 “ok”

    电脑收到ok后再发A行的内容 结束通信

    假如 电机2坏了 被单片机测到 

    E会发送“SB are you on line”

    F电脑收到后会再继续上面的1、2、4行内容

    G单片机收到后 发送“MOTO2 IS dead”

    H 电脑收到后 报警显示 电机2坏了

    然后等人操作

    好了 这就是一个通讯操作 基本的要素是

    1 单片机的地址 2 电脑的地址 3 通信应答信号 4通信的数据 5 结束信号

    上面的5个说的是一个系统里面通信要用的的概念 如何设计这些概念 就是再编成实现

    比如设计一个 电脑发送短信的系统 单片机挂个12864 显示短信

    具体要求是这样的 

    不是说电脑发出的所有数据都当作短信看待 而是<>里面的内容才是短信

    比如电脑想发一个 偶爱哩 就必须发<偶爱哩> 那么“<”就算是单片机的地址,而“>”算是短信结束的符号 

    单片机收到短信后 屏幕显示 您有新短消息 然后提示 按*键查看 按#键忽略

    如果按了*键 就显示短信 如果按了#键 丢弃短信

    要求就是这样了 我把关键的程序发一下 大家看看

    以下是我做的程序效果图

    扯了这么多了 再说说以太网里面的东西

    网线 用的是8根线 其实在100M的时候用的就是4根线 有点422通信的意思 橙白、橙 绿白 绿 分别是1、2、3、6 分别是2对差动信号 全双工的 用的好像是曼切斯特编码之类的编码 

    数据传送也是串行方式 100M说的是100Mbps 是比特率 不是波特率 下面解释2个的区别

    数据也是1位1位的传  波特率这个词在搞串口的人看来不陌生吧 说的是每秒传的位数

    比特率是每秒传得有效数据位数,也就是除掉那些 开始位 停止位 校验位 剩下的位数

    说以永远是波特率大于比特率

    以太网里传输以针数据没记错的话是这个样子的

    目的MAC地址 ----有效数据------原mac地址 

    在2层也就是数据链路层上大体也就是这个意思了

    再高一级到了网络层 在前后再加上 目的ip地址和原ip地址

    通讯协议就是要说清楚一些控制信息是如何有效地控制数据传输的

    像有模版参考的 大家一起顶的话 比如TCP/IP 就造成互联网的盛行

    单片机和电脑通信的话 底层协议人家订好了如232 485 之类的 必须遵守 否则不通

    上层的需要自己编写 不外乎就是

    目的地址 应答信号 开始信号1堆数据 结束信号 应答信号 原地址 的设计

    说起来也没啥的就像小儿过家家一样 一问一答的出不了错 但是假如你追求的是高速率或者是高效率的通信的话 上面说的那堆东西就可以看着省略了 否则的话传送了100个字节的数据里面有95个字节的控制字就不好了

    上面我没有说校验的事情 其实校验的话可以看作是应答信号的一种 常常听说的奇偶校验

    是以下这样的

    假如你传送的是 1111 1110 的话 如果用偶校验 就要数下你1的个数 本例中是7个 就要在校验位传个1 把1的个数凑成偶数 奇校验正好相反

    这种校验方法 是用1个位就能校验一个字节的数据 效率比较高 

    单片机通信中 尤其是无限数传得时候 一般采用的是校验和的方法 这种方法可以用1个字节校验N个字节的数据 校验出错率很低

    原理就是 

    比如

    要发送 1,2,3,4,5这5个数字的话 依次发完以后再发一个字节的校验和 就是把这5个数加起来 把和发过去 对方 把这5个数字加起来和你发来的校验和比较 如果一样就说明是对的 否则就错的 可能要求你重发一次

    还有更牛x的采用双重校验(本人因为好奇用过一次)原理是

    用2个字节校验 假如还是上面的5个数字 第一个校验和里装的是 5个数的和 第二个校验和里装的是 那五个数和 第一个校验和的和 据说这种变?校验法可以实现0 出错率

    其实校验和就是个概念 你可以做和 你也可以做差 当你用了一套很复杂的公式把数据算好了然后有很复杂的装了几个校验位的话 那么你的这个系统就有了很高的保密性了 别人无法干预的你的数据 

    再假如你传得数据也加工的几乎自己都看不懂的时候 那你的系统就更安全了 别人截获的数据也还原不了了 

    但是要付出的代价是波特率严重大于比特率 传小批量数据的时候可能感觉不出啥 但是当你采用这种方法传送个几百M的数据的话 看着电脑慢慢的等哈

    校验算法越复杂越有效 但要有极限的 具体尺度 自己根据项目以及环境恶劣程度看了

    需要说的是校验不能改错 过多的校验信息是可能导致更多的错误的 

    也有能改错的校验发 但单片机里面没有这样设计 

    一般是光盘VCD 听说过那种超级纠错的功能吧 

    还有听说过的是冗余校验 具体是咋个原理 请教高手回帖吧 我说不清楚啦

    这越写就感觉越乱了

    改日续水

    Unifax
    2009.4.16
    Unifax@163.com

    偶续点水 原来偶写的软文还有这么多人捧场 小弟深深地鞠躬了 在此深深地感谢INC_FUC兄弟 错别字以后会注意的!
         忙了一天 下午去国图借了本书看看 国图的书又换位置了 每次都不一样 以前是那些网管方面的书和啥子电脑装机不求人啦,3天搞定办公软件之类的书放在一个书架上面 给人的感觉 就是网管就是修电脑的人 今天去找书 居然发现单片机的书也和那些电脑入门的书搁在了一起 感觉很不爽 
         其实国图的书也很有意思的 单片机嘛 清一色的 51单片机原理与应用 一架子 内容也差不多 很有传统教学的意思 倒是以前看过一本TW人写的书(对不起大家了 好像叫《8051彻底研究之-经验篇》)人家说的那个单片机阿 才有意思呢 前3章根本没有说单片机结构啦指令之类的东西 一直再看图将产品 后来你上瘾了 书上才开始讲结构 讲程序 程序是asm 作者比较老 研究的比较深。



    这个帖子算是技术贴了吧 可是里面扯的淡还真不少 本来是想说下串口通信的事情 直道现在还好像没有具体说呢 下面说说吧

    单片机端的话 我提点基础内容 我们玩得89S52单片机内部集成一个异步全双工的串行接口(E文叫UART)和电脑上的串口是一样的 所以通信方便 既然是全双工的 自然就有2根线了 就是我们单片机的P30 P31 口 用作串口的话一般叫做 RXD TXD 这里说的 接收和发送 参考方向是单片机 现在大家看出来P3口的重要性了吧 要是P3口接液晶的话是极大的浪费。

    既然是串口 数据在线上就是1位1位的传 8个位凑成一个字节 那就有很多的传法了 今个咱们就说这个 UART 是如何传送的 别的以后再谈 关于过于概念化的东西 我就不好说了 主要是我也没有背书 手头也没有像样的书参考 更不想随便拷人家的文章

    稍微的提点常用的术语

    1 起始位 顾名思义 再 串口通讯里面规定是 逻辑0(不是低电平的意思)为起始位

    2 停止位 正好与起始位相反 在发完数据后加的位 规定是逻辑1

    3 数据位 咱们使用的是8个数据位 也有使用的是7个 就是夹在 开始位和停止位中间的内容

    4 校验位 如果你数据是7位那么最后一位可以是校验位

    5 波特率 单位是bps  这是在数传领域衡量快慢的单位 指的是每秒传得2进制位数

    6 比特率 单位也是bps 指的是每秒传得有效数据位数

    把上面的内容敲定以后就可一实现基础通信了 比如咱们拿P1.1和P1.7 俩根线模拟一个串口出来 

    假设P1.1是RXD 数据位是1位 停止位是1位 无校验 8位数据 波特率 1200bps 阿

    有以下的设计方法

    检测P1.1一旦下跳 ,启动定时器 如果到了一个数据宽度(由波特率可以算出来的)

    开始用for(i=0;i<8;i++)之类的方法保存数据 严格的算出数据宽度和应用定时器才能做成功如果你要求的比较精确的话 检测每位数据不是就检测一次 这就是传说中的采样频率

    也就是真正的串口为啥要占T1了

    先说了说软件虚拟串口 这个实现起来还是有些麻烦的 尤其是高波特率的时候 很难保证数据的正确性 说说这个也是为给大家打个基础

    好在就是老掉牙的51单片机硬件上带这个接口 这就很省心啦 把数据装到SBUF里他自己就能发走 发完了还和你打个招呼(TI==1 )收的话也是全自动的 收完后会装在SBUF里面也会告诉你(RI==1)这对于片友来说是福音 

    这是基础的通信方式 传输的是一个正确的字节 在实际使用中是要在这个基础上扩充写东东的。

    扩充的内容有以下模板 

    目的地址 数据 校验信息 源地址 

    正是由上面的4个东西构成了一套近似完美的通信协议 下文就说说这4部分的内容 

    目的地址和源地址 说的都是地址 地址的长度由在这个通信圈子里的机器数目决定 假设 我们设计的系统有 500个独立的单片机组成 打算完成一个单片机开会的任务 主持人是一台电脑 那么就说一共是由501个 机器构成的通信系统 那么地址至少就需要有9位2进制数构成 取整了就是2个字节 。由2个字节的地址可以寻址512个机器 

    数据很好理解 假设我们完成一次通信 传输50个字节的数据 那么中间的50个字节是作为数据看待

    校验信息 就是对刚刚传输的50个字节数据做一次正确否的判断 

    源地址是说明刚才发的一大摞信息是谁发出来的

    地址的设计上是有些意思的 就咱们的例子 还剩下11个地址闲置吧 可以都利用上的 

    比如咱们可以挑出来一个再比如说0XFF 当广播地址使用 当有机器往这个地址发送数据的时候要求所有的机器接收数据 还可以找几个地址当组播地址 比如说0XFE 当 电机组的组播地址 往这个地址发送的数据 会被所有电机组的单片机接收 其他组的不会接收 

    0XfC当喇叭组的组播地址

    这样说起来貌似相当复杂的样子  其实很好理解的 其实不管你往那个地址发数据 大家都是收到了 只是一开始就判断 你发来的信息头(也就是目的地址)如果是自己的或者是广播地址再或者是自己的组播地址的话 它才会把你后面的53个字节的数据存在RAM里面 否则的话 它会认为自己不需要储存这样庞大的数据 

    校验信息 一般的设计是1个字节 装的正是前50个字节累加和 可以由以下的C函数得来

    假设你的前50个字节的数据装在数组Data里面

    unsigned char Sum_Total()

    {

           unsigned char Sum,i;

           for(i=0;i<50;i++)

           {

                  Sum=Sum+Data[i];

           }

           return(Sum);

    }

    校验核可以通过这么一个函数算出来 然后发走 对方收到以后 也这样算一下你前面的50个数据然后和你发过去的比较 如果相等 则说明是正确的 如果不等 就启动错误机制

    再次申明累加和不一定是求和 很可能是极其复杂的一套算法 这样做的原因是为了数据不被人为恶意干扰。强调的是人为2个字

    目的地址在双机通信看来毫无意义 但是在多机自由通信领域 就显得十分方便 

    无论如何复杂的上层协议都需要正确的建立在底层的基础通信协议上 就上面说的这个文字咱们算个总帐

    底层协议规定一次通信是10位数据 其中带着一个字节的有效数据 剩下的2个位可以看作是控制位 

    咱们的上层协议规定的是 4个字节的 地址信息 1个字节的校验信息 这些都算是控制字 剩下的50个字节的数据算有效数据了

    那么咱们上层协议的一次传输(又称一桢数据)包含550位数据吧 对应底层协议来看 这550位数据中有 50(控制字)+100(50个数据的控制位)=150bit=19个字节的控制字节

    如果1000的波特率的话 比特率是多少呢??大家算下然后跟贴上来

    复杂的上层协议可以很有效的控制数据流 付出的代价就是通信效率的降低 如何权衡 需要深入的进行项目分析

    纯理论的东西今天先就到这吧 以后再续 同时真诚的恳切大虾对以上扯得不对的地方提出批评

    下面说下比较实际的东西 如何做第一个串口通信试验 

    这里还要稍微补充一点理论知识 

    单片机是TTL电平 具体的可以查资料看看 我就这么说啦 5V 是逻辑1或者逻辑高 0V是逻辑低或逻辑0 

    电脑的232口采用的是232电平 具体的也得查查资料 好像是说-3V~~-15V为逻辑1 

    3V~~~15为逻辑0 中间的电压不允许出现 这样设计是为了长距离传输 电压摆幅 高达30V

    正是这样的规定 使得电脑的串口供电复杂 ATX里面有根线是-12V的 专门给串口供电

    估计日后这根线也会消失 有样板参考 当年给ISA供电的-5V线现在就没有了 插座里面空空的就剩下一个孔了

    由于电平不匹配 我们需要转换一下 三级管的电路 估计不是纯片片发烧友的话没人会使用的说的是美信的MAX232 原产是美国的 但是现在中发卖的很多都是国产的 标的也是MAX232 价格嘛 1块钱左右 这个芯片的具体指标请查看Datasheet 我简单的介绍一下

    它是个双串口232-TTL双向转换芯片 外围仅需接4-6个电容就行 电容选择的话最好是1uF以上贴片的可以用104  否则不能工作或者工作极不稳定 还有一点可以造成不稳定的是电源 此芯片对电源要求稍微高点 所以一般应用的时候专门给此芯片配一个滤波电容的

    有了这个芯片做桥 我们就可以把单片机和电脑连接起来了 连接用的是DB9 和串口线

    DB9 是很帅的接口了 电脑一端用的是公头 单片机这面就看自己的设计了 如果喜欢?插就用母的 反之用公的 

    说下串口线吧 市场上卖的串口线是标准的 主要有2种

    1 串口延长线 样子是一面公的 一面母的 这样子的线里面是直连的 

    2 串口?叉线 样子是两面都是母的 这种线里面是把2和3对调过的 

    串口线的长度一般是1.8米的 也有说2米的 再长的没见过了 估计也是232的极限了 否则485 吃啥?

    计算机串口守法数据的话 如果你不会编程就用现成的串口调试助手吧 也可以用 MS自带的超级终端 使用方法请问下Baidu 单片机使用串口得事先初始化一下 具体的请看以下C函数

    /************************************************

    **  函数功能:**    串行口初始化函数                 **

    **  带入参数:**       波特率                                   **

    **  带出参数:**       无                                     **

    **  其他备注:**       晶体 11.0502Mhz             **

    **                  串口工作在方式1                  **

    **  作    者:**       Unifax                                    **

    **  时    间:**       2009.4.17                                   **

    ************************************************/

     void Uart_Init(unsigned int B)//串行口初始化函数

     {

          TMOD|=0X20;//T1 工作方式2

           TH1=256-(11059200/(284*B));//根据波特率计算定时器初值

           TL1=TH1;

           SCON=0X50;//SM1=1 REN=1

     }

    波特率请选择常规波特率 像1200 2400 4800 9600 都是常用的波特率以保证程序里面算出来的TH1是整数 在实际工程里面波特率的设计原则是在能满足系统通信要求的前提下选择最小的。追求的是稳定 再试验阶段 正好相反 高波特率传输数据是可以暴露上层协议设计瑕疵的最好手段。

    上面的函数没有设置SMOD位 缺省为0 所以上面的函数在晶体为11.0592Mhz的系统里面可以设置的最小波特率和最大波特率为 300bps 到28800bps 其中19200bps 不可以使用

    如果需要再高的话可以使SMOD置位 这样可以使用波特率为57600通信 如需要再高的话可以换晶体 AT89S52 单片机最高可以工作在33M晶体的系统里面 为了好计算 市场上有

    22.1184M晶体 这样可以最高可以使用115200bps的波特率进行通信。(SMOD=1;TH1=TL1=0XFF;)

    波特率作为通信协议的内容需要 通信机器共同约定 

    设置好这些东西后就可以使用串口了 试验下 C程序教材上的printf();函数吧

    (此函数说明包含在stdio.h文件里面 单片机编程不推荐使用如此庞大的库函数)

    上面的初始化函数没有动 单片机中断系统 所以收数据的时候需要检测RI位 一般是采用中断法接收数据 所以还要配置一下中断寄存器

    EA=1;

    ES=1;

    这样配置完成后需要写中断服务函数 可以套用一下模板

    void Uart_ISR(void) interrupt 4

     {

          if(TI)

           {

                  TI=0;

           }

           else

           {

                  A=SBUF;

           }

     }

    其中A为全局变量 之所以用if else 是因为 在发送一个字节数据后 TI也会置位 导致进入中断 如果想避免的话可以参考一下发送模板

    void Uart_Send(unsigned char Data)

     {

          SBUF=Data;//把要发送的数据装在SBUF里面

           ES=0;//禁止串行中断

           while(TI);//等待发完

           TI=0;//清除中断标志

           ES=1;//打开串行中断

     }

    这样做的后果是把全双工的串行口 改成了 半双工的了 

    先睡觉了 改日再续水。

    Unifax

    2009-4-17

    Unifax@163.com

    偶再喷一些文字哈 上文提到的通信协议 采用的是明文传送 如果你发1 那么电线中走的就是1 你发2走的就是2 这样的话就给通信的安全性留下隐患 如果你用485链接了500m的双绞线从A村到C村 中间经过B村。B村的人可以随便找点铜丝在2根双绞线上分别绕几圈就可以把数据截获下来(变压器原理)如果采用的是无线的方式 就更谈不上安全性了 随便弄个铁丝架架就可以收到你的无线信号 再打听到你的调制方法就可以很顺利的解调你的数据 。如果用光缆的话 安全性是高了些 想?听数据的话只能把光缆切断了 这样的话 你就会知道有人切断了你的光缆 打一一琳等jcss就可以搞定 但是光缆是很贵的东西 光纤收发器更是很贵的东西 私人做工程埋光纤是极其不现实的
    既然硬件上有成本的局限性 做为工程师就要从软件上弥补一些缺陷 于是我们就要扯扯这个密文传输的事情了
    所谓的明文和密文很好理解的 假如你传输的是“I love you”谁都会知道是啥意思 这就是明文 密文的话“AAAABBBBCCCD,DDDDBBBCCCA”就是了
    谁知道是啥意思?还是我解释一下吧 是考试的答案 以前在考试前一天偶然得到试卷的话就是这样背的 再不行就刻到桌子上。
    记得当时学习CCNA的时候 (考试用E文的)试题是从800到题的题库里面随机抽取 当时背题(800道都背)的时候想到一个很简单的背法
    背第二句的首位字母和第三句的首位字母和图片和答案序号 这样压缩的话5个字母就搞定 记得当时还大力推荐了下这种背法 
    第一句一般是废话(Look at this pic之类的)真到了考试的时候,傻眼了。才知道解压缩是很痛苦甚至是搞不定的事 幸亏图片还是记得的 E文也认识点 网络知识也是知道些的 考试顺利Pass 后来擦了把冷汗 以后老老实实的做人了。
    这说的是人在压缩和解压缩上是存在劣势的 但是人的智慧是无限的 压缩和解压缩交给了电脑那种SB做 人嘛留下的就是欣赏自己的成果了
    关于通信报文的加密是一门专门的学科 足以看出其的复杂性 我们简单的说 不用标准的ASC码传输E文字母 也不用国标汉字码传输汉字就可以了 假如我要发'A'到远方 按照ASC标准是发65这个数字的 我偏偏发 66 对端收到的肯定是‘B’我在对段的'B'基础上在做-1运算就得到了我们原始的‘A’了。实际上加密远比这个复杂 你可以设计成这个样子 sin(tan(log(cos(Data*Data-Data)))) 其中Data是数据
    对方收到后在一层层的解开还原出原始数据就可以了 这样发的报文估计是不会被解密了吧
    上头好像说到了报文的压缩 也顺便扯扯 对于小规模的传输 压缩没有必要 总不能解压缩的开销太大吧 但是对于大传输量的报文我们就有必要压缩以下了 这样做不仅能更快的传输报文 还能有效抑制在传输中出现的干扰错误。压缩方法有很多种的 比如说你要传送的就是上面说的“AAAABBBBCCCD,DDDDBBBCCCA”那么你传这个是不是压缩了呢?“A4B4C3D,D4B3C3A”压缩是比较复杂的 算法也是很复杂的
    要是牛X的话想想咋能把WINRAR集成在单片机里面 呵呵
    当然 上面说的这些玩意不一定很实用的 咱们做简单的工控不需要考虑这么复杂的问题 假如你做的项目就想通过串口控制4个电机的话 完全可以从串口发送 A B C D 就能办事的
    但是对于串口实验 我建议上面扯的东西都做一下比较好 我是很喜欢通信实验的 从最开始的FM 调频传声到现在说的无线数串 深深的感觉通信的好玩 我现在做的通信设备基本都是基于无线密文传送 有用的是现成的无线数传模块 也有用9915A模块改装的单工通信模块
    相比之下 后者比较经济。(5元)
    今天太困了 改天接着扯哈

    Unifax
    2009.4.19
    Unifax@163.com
  • 相关阅读:
    java XML
    异常
    String、StringBuffer、StringBuilder区别
    java面试测试题
    多态
    如何用模板渲染后台返回不确定的data
    +new Date()是什么意思?
    nodejs使用技巧
    jquery拖拽(最浅显易懂的分析)
    z-index在子节点设置得很大却不生效?
  • 原文地址:https://www.cnblogs.com/crazyxu/p/2060038.html
Copyright © 2020-2023  润新知