串口一般只能接受8位的数据,也就是按字节进行传输,要是数据超过1个字节的和数据,你就需要建立协议来进行数据重组。这就涉及到大小端问题(你是先发送高8位还是低8位),断帧问题(可通过添加特定字符组成的帧头帧尾来识别,或者通过时间间隔来识别)。
简单的介绍一下操作方法,每接收一个字节数据,你就在串口中断函数里面把数据取出来放到一个足够长的数组中去,记得依次往后增加地址。
接着你可以通过以上提到的两种方式断帧,判定为此次收到一帧数据后,重组数据并处理数据,接着清空上面的数组,好让后面收到的数据有空间放进去,以此不断循环即可实现协议通讯。
串口发送的单位是8位,就是一个字节,16位做成两次发送就行了
只要求两条总线线路:一条串行数据线SDA,一条串行时钟线SCL;
每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机/从机关系软件设定地址,主机可以作为主机发送器或主机接收器;
它是一个真正的多主机总线,如果两个或更多主机同时初始化,数据传输可以通过冲突检测和仲裁防止数据被破坏;
串行的8 位双向数据传输位速率在标准模式下可达100kbit/s,快速模
使用STM32特有的定时器级联功能实现32位的计数效果。
对于需要高精度并且长延时的应用,16位的定时(上述精度和时间长度)就不够了,这个问题可以有两种解决办法,一种办法是通过软件的接力完成,这个方法的可行性在于定时时间较长,允许软件有足够的时间介入计数,这种办法非常方便,多数情况都可使用。
另一种办法是使用STM32特有的定时器级联功能,实现32位的计数效果,因为级联是由硬件触发的,当设置好各项寄存器后,软件不必中途干预,可以达到高精度长延时的要求。进一步地,STM32最多有四个定时器,如果串联起来,甚至可以实现4乘16=64位的计数效果。
receivedata的返回值应该不是你想的0x0403这样的格式。在做If判断前,让输出或跟踪一下该返回值到底是什么。
监视代码运行过程的中间值,是调试程序能力中最基础的技能。必竟不能奢望代码输入后第一次运行就能一切正常。
M3内核是小端的,如果你取出a[]的首址并按照8位(字符型)解析,那么依次取出的是 E4、0C、E4、0C…完全不需要进行任何多余操作。
只要接收方也是将收到的8位数据串按照小端模式的16位类型进行解析就可以了。
本文标签:stm32串口传输16位