怎么解决单片机的串口从一个变成二个?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么解决单片机的串口从一个变成二个?相关的知识,希望对你有一定的参考价值。

1、模拟一个串口。
2、如果目的是想实现多个通信,可以变更为RS422或485,一个串口就可以了。
参考技术A 可以扩展 的!
或者选用多串口的 单片机

建议 去 我的领地 5d6d 的 proteus 论坛看看

那里有很多 单片机仿真实例,包括仿真图 和 源码
搜 5d6d 和 proteus 2个关键词追问

谢谢

追答

不客气 哈

参考技术B 直接用带2个串口的单片机就好了。
C8051F系列有2个串口。
STM32串口3到5个,这款贵一些。
参考技术C 要看你是要实现什么功能,方案有多种追问

我所做的仪表是个中间站,需要与上一级控制单元进行通讯,同时得不间断地和下位机进行数据采集与传输。

追答

与上级单元和下位机是不是都是串口通信方式?如果CPU还没确定好的话建议你用带双串口的单片机,这样比模拟串口更可靠

追问

都是串行口通讯,单片机为atmega16
谢谢!
我找到一款为SP2327多串口扩展芯片
但是波特率有限制

追答

用atmega162嘛,它双串口,成本和atmega16差不多吧,关键是atmega16的程序可以直接移植过来基本不需要修改

怎样将数据放入一个缓冲区stm32

参考技术A STM32使用DMA接收串口数据》和《STM32使用DMA发送串口数据》讲解了如何使用DMA辅助串口收发数据,使用DMA的好处在于不用CPU即可完成串口收发数据,减轻CPU负担,在串口通信频繁且不想频繁中断的应用中非常有用。

除了上述两种场景,还有一种应用场景:串口接收数据长度位置,频率未知,不要求实时处理的场景。如果采用上述方案,接收一帧数据立即处理,那么在处理的时候来的数据包就“丢失”了。这个时候就需要缓冲队列来解决这个问题。

02、缓冲区
缓冲区看名字就知道,是缓冲数据用的。实现缓冲区最简单的办法时,定义多个数组,接收一包数据到数组A,就把接收数据的地址换成数组B,每个数据有个标记字节用于表示这个数组是否收到数据,收到数据是否处理完成。

上述方案是完全可行的,但有缺点:

①缓冲数据组数一定,且有多变量,代码结构不太清晰。

②接收数据长度可能大于数组大小,也可能小于数组大小。不灵活,需要接收数据很长时容易出错,且内存利用率低。

解决这个问题的好办法是:环形缓冲区。

环形缓冲区就是一个带“头指针”和“尾指针”的数组。“头指针”指向环形缓冲区中可读的数据,“尾指针”指向环形缓冲区中可写的缓冲空间。通过移动“头指针”和“尾指针”就可以实现缓冲区的数据读取和写入。在通常情况下,应用程序读取环形缓冲区的数据仅仅会影响“头指针”,而串口接收数据仅仅会影响“尾指针”。当串口接收到新的数组,则将数组保存到环形缓冲区中,同时将“尾指针”加1,以保存下一个数据;应用程序在读取数据时,“头指针”加1,以读取下一个数据。当“尾指针”超过数组大小,则“尾指针”重新指向数组的首元素,从而形成“环形缓冲区”!,有效数据区域在“头指针”和“尾指针”之间。如下图

图片

如上面说的,环形缓冲区其实就是一个数组,将其“剪开”,然后“拉直”后如下图

以上是关于怎么解决单片机的串口从一个变成二个?的主要内容,如果未能解决你的问题,请参考以下文章

不懂就问,nrf51822,这个是蓝牙模块吗? 是用来给单片机串口变成蓝牙输出的是吗

STM32串口 不用中断方式 接收一个字符串...怎么解决?

STM8S单片机串口UART2接收中断一直在运行,出不来,怎么回事?

单片机怎么通过串口发送一串数据?

C51单片机从串口接收数据多个字节的数据的C语言程序,谢谢

5V单片机与3.3V单片机串口通信问题