RS485 --发送多个0的解决办法

RS485 -- 在发送状态切换到接收状态多发送个0的解决办法

二、STM32结构体如何单字节对齐的问题(默认对齐是4字节)

stm32串口发送数据的配置,以及通过串口发送结构体数组总是多一个00字节的问题(结构体如何按字节对齐的方法)

 

#define BYTE_ALIGN __attribute__ ((packed))

typedef struct
{
u8 node;
u8 cmd;
u8 bytelen;
u16 data;
u16 crc;
}BYTE_ALIGN mdb_send_t;
485通信末尾总是收到一个00字节

 

 

485发送转为接收时候第一个字节变为00,且分断。

 三、TXE与TC区别,推荐方法五写程序

 四、485发送延时问题

 

五、程序方法

串口串来数据是连续的,它不等人!如果你不及时取走,就丢数据了!!!
教你一下如何发送吧:
1、开辟一个发送缓冲区A,用于存放需要发送的数据,例如:发送缓冲区大小=256个字节,则可以放置送256个字符。采循环放置,无需擦除,循环时覆盖。如果能及时发送,则数据量无限!
2、建立两个指针:PCW(写入指针)、PCR(取走指针)它俩同时指向A区的数据位置。初始PCW=PCR=0,同时指向A区首字节。PCW、PCR最大=255(指向最后一个字节),再多即=256时,就归0(循环计数)。
3、当你需要发送一组字符时(如"ABCDEFG"),就将"ABCDEFG" 依序写入A区PCW所指的地方,且每写一个,将PCW+1。注意:这时仅仅是写入A区并未真正的发送!PCW=256时要归0!
4、发送:当PCR<>PCW时,就从A区中取出一个PCR指向的字节发送出去,发完后,将PCR+1。
提示:这段程序可以写在发送中断程序中,每次发送中断只发一个数据。下次中断再发下一个,不等待。
这样做的好处是:
A、发送时不需考虑系统忙不忙,因为你只向A区写数据,不存在忙不忙。
B、只要PCW改变就可能引起PCR<>PCW,也就起动了发送。
C、串口发送是中断一次发一个字节,也不需检验系统忙不忙,只要PCR<>PCW就发一个,发了一个字节就退出。不需要发送等待,节省的CPU的时间,所以永远不会影响接收数据,也就丢不掉接收的数据了。
5、第一个字节数据:发送中断只发生于数据发送之后,那么第一个字节在发送之前是不会有发送中断发生的!那么第一个字节需要如何发送呢?这里留个悬案,让楼上自己解决。
以上也是我用于实战的方案,从未丢过任何一个数据。原因就是收、发数据时间最短,没有等待。

posted on 2022-05-13 00:03  飘一点红  阅读(968)  评论(0编辑  收藏  举报