OpenEdv-开源电子网

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

串口如何发送数组,为何一次显示一个数据

[复制链接]

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
发表于 2020-7-10 16:17:54 | 显示全部楼层 |阅读模式
5金钱
如题,想要的效果是单片机发送十六进制的A3  55  44  80  03  00  05到串口助手,结果显示的却是一次显示一个数据,求解,代码如下~

/****************************************************************************/
int main(void)
{               
        u16 t;  
//        u16 len;       
//        u16 times=0;
        int a[7]={0XA3,0X55,0X44,0X80,0X03,0X00,0X05};
        int i=0;
        delay_init();                     //延时函数初始化          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        uart_init(115200);         //串口初始化为115200
        LED_Init();                             //LED端口初始化

        for(t=0;t<7;t++)
        {                                                                  
                    LED0=0;       
                        delay_ms(300);                
                        USART_SendData(USART1, a[i] );//向串口1发送数据
            while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                        i++;
            LED0=1;
                        delay_ms(300);
        }         
}
/****************************************************************************/

最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

34

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
912
金钱
912
注册时间
2019-7-5
在线时间
189 小时
发表于 2020-7-10 16:17:55 | 显示全部楼层
  while(1)
{
        for(t=0;t<7;t++)
        {                                                                  
            
                        USART_SendData(USART1, a[i] );//向串口1发送数据
            while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                        i++;

        }  
         LED0=0;      
         delay_ms(300);   
         LED0=1;
         delay_ms(300);
}改成这样应该就可以了。
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-7-10 22:03:20 | 显示全部楼层
我有在其他地方看到有解决的类似方法,链接为https://blog.csdn.net/leibihui05 ... tm_source=blogxgwz6
代码如下
/******************************************************************************************************/
void UartASendStr (u8 *pucStr, u8 ulNum)
{
u8 i;
for(i = 0;i<ulNum;i++)
{
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);  
    USART_SendData(USART1,*pucStr++);
}  
}

void ACK(u8 func)
{
u8 data[5];
data[0]=0x0c;
data[1]=0xAA;
data[2]=0x00;
data[3]=0xFF;
data[4]=0x0F;
UartASendStr(data,5);
}
/******************************************************************************************************/
UartASendStr (u8 *pucStr, u8 ulNum)  和ACK(u8 func) 在什么时候调用,是放在主函数main()里面还是放在中断服务函数里面
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2020-7-11 02:21:53 | 显示全部楼层
看代码应该会分7次发送出去,你在main函数最后加个while1看看,不要让main函数执行完
回复

使用道具 举报

1

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2020-6-29
在线时间
14 小时
发表于 2020-7-11 08:43:25 | 显示全部楼层
是不是写了串口中断函数
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-7-11 14:23:25 | 显示全部楼层
刘ZC 发表于 2020-7-11 08:43
是不是写了串口中断函数

没写串口中断服务函数
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-7-11 14:24:33 | 显示全部楼层
正点原子 发表于 2020-7-11 02:21
看代码应该会分7次发送出去,你在main函数最后加个while1看看,不要让main函数执行完

对啊,int a[7]={0XA3,0X55,0X44,0X80,0X03,0X00,0X05};这个就是分7次把数据发出去的,可我想要一次全部都发送出去
回复

使用道具 举报

22

主题

2254

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4486
金钱
4486
注册时间
2013-4-22
在线时间
337 小时
发表于 2020-7-11 19:36:25 | 显示全部楼层
你这个不就是一次发送一个字节吗
回复

使用道具 举报

1

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2020-6-29
在线时间
14 小时
发表于 2020-7-12 13:38:45 | 显示全部楼层
灯闪烁没有
回复

使用道具 举报

1

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2020-6-29
在线时间
14 小时
发表于 2020-7-12 14:19:55 | 显示全部楼层
回复

使用道具 举报

1

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2020-6-29
在线时间
14 小时
发表于 2020-7-12 14:23:20 | 显示全部楼层
我觉得你对连续发可能有什么误解
回复

使用道具 举报

1

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2020-6-29
在线时间
14 小时
发表于 2020-7-12 14:23:57 | 显示全部楼层
我试了这代码可以连续发 每两个之间间隔为600ms'你设定的额

回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-7-13 23:50:27 | 显示全部楼层
刘ZC 发表于 2020-7-12 14:23
我试了这代码可以连续发 每两个之间间隔为600ms'你设定的额

是的,我可以
收到A3,
收到55,
收到44,
收到80,
……
收到05
/******************/
可这不是我想要的,我想要的是
收到A3 55 44 80 03 00 05
不知道应该怎么修改
回复

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
71
金钱
71
注册时间
2019-8-17
在线时间
21 小时
发表于 2020-7-14 13:31:15 | 显示全部楼层
串口以字节为发送单位,不管多少个都是一个字节一个字节发送。
回复

使用道具 举报

11

主题

2156

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4964
金钱
4964
注册时间
2015-1-10
在线时间
622 小时
发表于 2020-7-14 13:34:21 | 显示全部楼层
王大爷爱吃鱼 发表于 2020-7-13 23:50
是的,我可以
收到A3,
收到55,

小伙子,你对串口误解很深啊
回复

使用道具 举报

9

主题

219

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1437
金钱
1437
注册时间
2020-5-12
在线时间
395 小时
发表于 2020-7-14 15:22:16 | 显示全部楼层
        for(t=0;t<7;t++)
        {                                                                  
             USART_SendData(USART1, a[t] );//向串口1发送数据
            while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
        }
把延时去掉就好了。
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-7-15 22:36:38 | 显示全部楼层

是的,将延时从循环里面去掉就可以发送连续的数据了,请问这是为什么呢
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-7-15 22:41:14 | 显示全部楼层
liaohaijian 发表于 2020-7-15 09:26
while(1)
{
        for(t=0;t

不行哦,这样传输的数据就会是乱的不可控的。因为i会一直累加,超过数组的范围;应该将i改为t,也就是15楼的答案,但我没太理解为什么要把延时放到括号后面去~
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-7-16 08:44:18 | 显示全部楼层
正点原子 发表于 2020-7-11 02:21
看代码应该会分7次发送出去,你在main函数最后加个while1看看,不要让main函数执行完

最佳答案你设置的有问题。具体问题我在他的回答里面回复了,结果好像被你删了。我觉得16#的答案才是对的。
回复

使用道具 举报

48

主题

179

帖子

0

精华

初级会员

Rank: 2

积分
185
金钱
185
注册时间
2017-6-19
在线时间
90 小时
 楼主| 发表于 2020-7-16 08:45:07 | 显示全部楼层
liaohaijian 发表于 2020-7-10 16:17
while(1)
{
        for(t=0;t

这样发送的数据会乱码,应该将i改为t
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-29 20:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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