天天看点

1-关于单片机通信数据传输(中断发送,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)

写这篇文章的目的呢,如题目所言,我承认自己是一个程序猿.....应该说很多很多学单片机的对于...先不说别的了,,无论是学51的还是32的,,,先问一下大家用串口发送数据的时候是怎么发的???如果发整型的数据是怎么发的??如果发浮点型的是怎么发的????再问大家串口接收数据是怎么接收的????亲们有没有想过自已用的方法是不是最好最好的方法了,反正我认为我自己现在用的方法应该是很好的了,,不说最好,因为我知道我还能在现在的基础上稍微的修改让它变为更好....只是感觉无所谓了,因为现在所用的方法对于99.9999%的项目都适用....

好像自己在吹牛一样,,,,,其实写这篇文章呢,,,也早就想写了,因为感觉好东西应该拿出来分享一下,希望亲们能派的上用场

先给大家源码一个51的一个32的

先看第一个问题,,,,大家用串口发送数据的时候是怎么发的???

大多数人是不是还是这样

上面是51的,只是打比方哈

 就是说

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

{

  UartSend(Data[i]);

}

直接说弊端,举个例子

每次都要发130个数据,,是不是每次循环要等着发完上面的130个数据才执行下面的函数,,,这样话就不能及时的执行后面的函数,,,,刚想起来有没有人经常在主循环里面加延时的?????水平不高的人,,才会经常在主循环里面加延时

那应该怎么发....用中断发

先看最普通的,用51写的一个

  

 

发送数据的时候直接

UartSendTI(AD0123Table,21);

AD0123Table是一个数组

这样的话这个函数

我现在往数组里面存数据

1-关于单片机通信数据传输(中断发送,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)

然后我再往里面存,,对了存数据是用的操作环形队列的函数哈  int32_t rbWrite(rb_t *rb, const void *data, size_t count)

1-关于单片机通信数据传输(中断发送,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)

 我又存了两个,,如果存满了还存,就会报错,,所以咱呢先取两个再存,,取数据也是用的环形队列的函数

1-关于单片机通信数据传输(中断发送,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)
1-关于单片机通信数据传输(中断发送,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)

然后咱们再存两个吧!!

1-关于单片机通信数据传输(中断发送,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)

具体是如何实现的就看这两个吧

1-关于单片机通信数据传输(中断发送,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)

函数在32的工程里面,51享受不起.....内存堪忧

我发送数据的时候就是直接往这个数组里面存数据,串口从这个数组里面取数据然后发出去(当然这个是在程序中设置的)

那个数组就是一直在转圈圈......

曾经就有一个问题就是利用环形队列解决的

<a href="http://www.cnblogs.com/yangfengwu/p/6921832.html" target="_blank">http://www.cnblogs.com/yangfengwu/p/6921832.html</a>

简单来说就是把接收到的数据写到Flash里面....但是呢单片机的内存有限,不能够一次性接收到所有的数据......所以我就

利用环形队列..一边串口接收着往环形队列里面写数据,一边从环形队列里面读出数据写到Flash里面....

现在看如何利用环形队列发送串口数据

1-关于单片机通信数据传输(中断发送,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)

先看发送,这是在中断里面,就是如果数组里面有数据就一个一个取出来发出去

这是串口1 的,我定义了三个 Uart1rb  Uart2rb  Uart3rb  分别操作  Usart1SendBuff    Usart2SendBuff    Usart3SendBuff  这三个数组

 现在看怎么存,应该说怎么控制串口发送数据

1-关于单片机通信数据传输(中断发送,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)

发送数据的时候直接往里面丢数据就可以了

再高级一点,加上DMA,用DMA就不能用环形队列了,其实下面大神介绍的用内存分配的方式,实质就是用链表,但是呢!我没想明白把数据放进

链表然后设置一下DMA和直接用数组的方式设置一下DMA有多大区别,.....或许我还是没有明白那位大神的用意......所以我就还是用的现在

的环形队列的方式.....

可以看一下这位大神的介绍

<a href="https://wenku.baidu.com/view/c2b959f0caaedd3383c4d3d7.html" target="_blank">https://wenku.baidu.com/view/c2b959f0caaedd3383c4d3d7.html</a>

现在先问一下,如果让大家传输一个220.5的数据给上位机,大家如何传输??假设不加任何的标志校验什么的

我的话

1-关于单片机通信数据传输(中断发送,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)

看一下

1-关于单片机通信数据传输(中断发送,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)

实际上220.5 用16进制表示就是 43 5C  80  00  高位在前

其实现在所有的仪器仪表的通信都是走的这种

1-关于单片机通信数据传输(中断发送,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)

如果是整形

就用

1-关于单片机通信数据传输(中断发送,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)

用共用体直接就可以实现两边的转换,

1-关于单片机通信数据传输(中断发送,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)

如果用上位机列如C#的,一个函数就搞定

所以传输数据还是按照规范来

大家可以用51去试一试会发现和32的正好相反

0x43  高位存在了数组的低位上,,   0x00 存在了数组的高位上

 其实就是在说数据存储的时候数据的高位存在了低地址,数据的低位存在了高地址,,,就是大端模式

一般我发送数据会在最后加CRC16校验   

现在看接收.....算了明天再写吧,感觉这些够消化的了....................

程序里面所有的函数都封装好了,关键是自己亲自去尝试