OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6446|回复: 5

串口用buffer发送超过8个字节时,其发送顺序会乱,为啥?程序如下

[复制链接]

24

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2015-7-24
在线时间
32 小时
发表于 2015-10-28 20:40:18 | 显示全部楼层 |阅读模式
5金钱
u8 TxBuffer[1024];
u8 TxCounter=0;
u8 count=0;

void UART1_ReportMotion(int16_t ax,int16_t ay,int16_t az,int16_t gx,int16_t gy,int16_t gz,
int16_t hx,int16_t hy,int16_t hz)
{
    unsigned int temp=0xaf+9;
    char ctemp;
    UART1_Put_Char(0xa5);
    UART1_Put_Char(0x5a);
    UART1_Put_Char(0x16);
    UART1_Put_Char(0xa2);

    UART1_Put_Char(0x01);
    UART1_Put_Char(0x02);
    UART1_Put_Char(0x03);
    UART1_Put_Char(0x04);
    UART1_Put_Char(0xaa);
}

void UART1_Put_Char(unsigned char DataToSend)
{
    TxBuffer[count++]=DataToSend;
    USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
}
// ***********interupt******/
void USART1_IRQHandler(void)
{
    if(USART_GetITStatus(USART1,USART_IT_TXE)!=RESET)
    {
        USART_SendData(USART1,TxBuffer[TxCounter++]);
        USART_ClearITPendingBit(USART1,USART_IT_TXE);  
        if(TxCounter==count) USART_ITConfig(USART1,USART_IT_TXE,DISABLE);
    }
}

最佳答案

查看完整内容[请看2#楼]

楼主少了一个判断那就是溢出判断,这里1024个字符,但是变量极有可能会直接超出最终导致不可预知的后果,且这里楼主计数变量用了u8并不能完全利用完1024个字节的缓冲
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2015-10-28
在线时间
0 小时
发表于 2015-10-28 20:40:19 | 显示全部楼层
楼主少了一个判断那就是溢出判断,这里1024个字符,但是变量极有可能会直接超出最终导致不可预知的后果,且这里楼主计数变量用了u8并不能完全利用完1024个字节的缓冲
回复

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11460
金钱
11460
注册时间
2014-4-1
在线时间
1294 小时
发表于 2015-10-28 21:40:59 | 显示全部楼层
有没有判断“发送已经完成”?

发送一个字节需要一定时间。所以,相邻字节之间必须插入间隔。
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-10-28 21:47:33 | 显示全部楼层
需要判断是否发送完成TC标志,SR寄存器第6位
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

24

主题

51

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
248
金钱
248
注册时间
2015-7-24
在线时间
32 小时
 楼主| 发表于 2015-10-29 09:54:34 | 显示全部楼层
回复【4楼】李老板没钱了:
---------------------------------
u8 TxBuffer[256];
void UART1_Put_Char(unsigned char DataToSend)
{
    TxBuffer[count++]=DataToSend;
    USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
    if(count==255) count=0;
}
还是不行,串口接收顺序还是乱的,如下:
01 A5 5A 16 04 AA 01 02 5A 16 A2 AA A5 02 03 16 A2 01 A5 5A 03 04 AA 01 02 5A 16 04 AA A5 02 03 16 A2 AA A5 5A 03 04 A2 01 02 5A 16 04 AA 01 02 03 16 A2 AA A5 02 03 04 A2 01 A5 5A 03 04 AA 01 02 5A 16 A2 AA A5 02 03 16 A2 01 A5 5A 03 04 A2 01 02 5A 16 04 AA 01 02 03 16 A2 AA A5 5A 03 04 A2 01 A5 5A 16 04 AA 01 02 5A 16 A2 AA A5 02 03 04 A2 01 A5 5A 03 04 AA 01 02 5A 16 04 AA A5 02 03 16 A2 AA A5 5A 03 04 A2 01 02 5A 16 04 AA 01 02 03 16 A2 AA A5 02 03 04 A2 01 A5 5A 16 04 AA 01 02 5A 16 A2 AA A5 02 03 16 A2 01 A5 5A 03 04 A2 01 02 5A 16 04 AA A5 02 03 16 A2 AA A5 5A 03 04 A2 01 A5 5A 16 04 AA 01 02 5A 16 A2 AA A5 02 03 04 A2 01 A5 5A 03 04 AA 01 02 5A 16 04 AA A5 02 03 16 A2 01 A5 5A 03 04 A2 01 02 5A 16 04 AA 01 02 03 16 A2 AA A5 02 03 04 A2 01 A5 5A 16 04 AA 01 02 5A 16 A2 AA A5 02 03 16 A2 01 A5 5A 03
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165369
金钱
165369
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-10-29 21:44:51 | 显示全部楼层
串口用中断发送数据....
从来不用,楼主慢慢研究.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-1-31 20:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表