串口发送数据的验证 不定长度多字节的处理2

一切都在为我们RS485通讯做准备 。 我们先解决了CRC16校验码的问题 。 这节我们来讲讲超时判断 。 解决定长度串口收发多字节的一个缺陷 。
用代码来讲解 , 在原有串口接收机基础上 , 增加一个超时判断 , 利用一个定时器 。 [灵光一闪]
串口发送数据的验证 不定长度多字节的处理2文章插图
串口中断与计时器中断
首先你规划一个接收数组 , 设置它的合理最大长度 , 这里是rec_buf[10]. 宏定义MAXSIZE=10. 也就是来的数据先都保存到接收缓冲区中,在主程序中对它进行解析 , 包括地址是否正确 , 功能码是什么 , 数据是什么 , 也就是告诉串口你只管收数据主程序处理 。 同时只要有数据接收到 , 设置一个计时标志位 , 并置1 , 在定时器中断中 , 如果这个标志位置1 , 则有一个计数值开始累加 。
注意的是 , 定时器并不是串口接收独占了 , 我们只是利用一下 。 因为定时器是一般都要使用到的 , 我这里是1ms中断一次 , 用来生成1s的标志位 , 和扫描按键 。 我们还是蜻蜓点水的处理 , 写一下状态就走 。 每1ms , 在定时器中断中 , 如没有收到新数据对计数值加1而已 , 收到了新数据会在串口中断中清零计数值 。 当一段时间没有收到新数据 , 定时器中断中的值超过上限 , 我这里是10 , 也就是10ms没有新数据 , 我们就认为一帧数据接收完成 。
如9600波特率 , 8位数据位 , 无校验位 , 2位停止位 , 发送1字节数据时间为1.04ms 。我们发送数据 , 都是一帧数据写完 , 通过上位机一次发送 , 如发送01 03 00 06 00 01 64 0B , 而不是发送01 , 再发送03.......我这里设置10ms没有接收到新数据 , 就认为完成1帧数据的接收完了 , 设置一个接收完成标志位rec_flag为1.
在主循环中 , 如rec_flag为1 , 我们关闭rec_timer计时标志 , 处理接收到的rec_buf[rec_cnt]数据 , 一般先转移到另一个处理数组中 , 而rec_timer由新数据把它打开 , 开始下一轮接收 。
对于完整一帧数据的超时判断就是这样处理 。 小伙伴们你们学会了吗?[来看我]
对于变长数据接收 , 只要在数据中增加一个字节来告知 , 发送字节的长度即可 , 这个我们留在下一节继续 。
在下一节开始前 , 我们得准备下面2个东西 , 因为我们得实验室模式电脑是上位机 , 发送一段数据到单片机 , 单片机返回一段数据到电脑 。 我们先设置写入数据为01 06 00 01 00 11 18 06 这一串数据的意思是 往从机地址是0x01的下位机 , 数据寄存器地址是01的寄存器中写入数据11 , 如果写入正常那么从机返回也是同样代码01 06 00 01 00 11 18 06 。 然后我们再发代码读取01 03 00 01 00 01 D5 CA , 如果我们上次写入正常 , 读出的数据就是11 , 返回的代码为01 03 02 00 11 78 48 。 首先单片通过串口发送 , 需要TTL转485 , (使用MAX485模块 , 3.3V是MAX3485) , 数据在通过RS485-USB模块和电脑连接 。 两个模块一起大概5元 , 某宝很多 。
串口发送数据的验证 不定长度多字节的处理2文章插图
TTL转RS485模块
串口发送数据的验证 不定长度多字节的处理2文章插图
RS485转USB模块
【串口发送数据的验证 不定长度多字节的处理2】小伙伴们 , 我们下节见[来看我]


    推荐阅读