OpenEdv-开源电子网

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

串口发送数组的问题

[复制链接]

10

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2019-3-2
在线时间
30 小时
发表于 2019-3-31 21:13:39 | 显示全部楼层 |阅读模式
1金钱
怎么通过数组把数据一次性发出去,而不是一个一个的发出去。
发出去后接收又怎么写,求大佬指点!

最佳答案

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

设置为发送完成进中断,每次中断发送一个字节,持续到发送完成所有字节。。。 楼上说的DMA并不推荐一开始用的,况且串口其实最好不要用DMA
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2015-12-29
在线时间
70 小时
发表于 2019-3-31 21:13:40 | 显示全部楼层
设置为发送完成进中断,每次中断发送一个字节,持续到发送完成所有字节。。。
楼上说的DMA并不推荐一开始用的,况且串口其实最好不要用DMA
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2019-3-31 22:00:24 | 显示全部楼层
USART+DMA,你需要的是這個
一分耕耘一分收获。
回复

使用道具 举报

2

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2018-12-11
在线时间
63 小时
发表于 2019-4-1 11:55:08 | 显示全部楼层
[mw_shl_code=applescript,true]void Usart2_Init(u32 bound){
                         //GPIO端口设置
                        GPIO_InitTypeDef GPIO_InitStructure;
                        USART_InitTypeDef USART_InitStructure;
                        NVIC_InitTypeDef NVIC_InitStructure;

                        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE); //使能GPIOD时钟
                        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟
                 
                        //串口1对应引脚复用映射
                        GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_USART2); //GPIOD5复用为USART2
                        GPIO_PinAFConfig(GPIOD,GPIO_PinSource6,GPIO_AF_USART2); //GPIOD6复用为USART2
                        
                        //USART1端口配置
                        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6; //GPIOA9与GPIOA10
                        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
                        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //速度50MHz
                        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
                        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
                        GPIO_Init(GPIOD,&GPIO_InitStructure); //初始化PA9,PA10

                         //USART1 初始化设置
                        USART_InitStructure.USART_BaudRate = bound;//波特率设置
                        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
                        USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
                        USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
                        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
                        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //收发模式
                        USART_Init(USART2, &USART_InitStructure); //初始化串口1
                        
                        USART_Cmd(USART2, ENABLE);  //使能串口1
                        
                        USART_ClearFlag(USART2, USART_FLAG_TC);
                        
        
                        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启相关中断

                        //Usart1 NVIC 配置
                        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//串口1中断通道
                        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
                        NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;                //子优先级3
                        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
                        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器、
}
//接收缓存区         
u8 Uart2_RX_BUF[1024];          //接收缓冲,最大64个字节.
//接收到的数据长度
u16 Uart2_RX_CNT=0;  
void BSP_IntHandlerUSART2(void)                        //串口1中断服务程序
{
        u8 res;            
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据
        {                 
          res =USART_ReceiveData(USART2);//;读取接收到的数据USART2->DR
                if(Uart2_RX_CNT<1024)
                {
                        Uart2_RX_BUF[Uart2_RX_CNT]=res;                //记录接收到的值
                        Uart2_RX_CNT++;                                                //接收数据增加1
                }
        }  
}

/**********************************************************************
函 数 名:RS485_SendData
函数功能:485发送一个字符串
参    数:
修改时间:2018-
修改内容:
修 改 人:
**********************************************************************/
void Usart2_SendData(u8 *buff,u8 len)
{
                u8 t;
                        for(t=0;t<len;t++)                //循环发送数据
                {
                        USART_SendData(USART2,buff[t]); //发送数据
                        while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET) ;//等待发送结束                  
                }                        
                Uart2_RX_CNT=0;        
        
}
        
        //buf:接收缓存首地址
//len:读到的数据长度
void Uart2_Receive_Data(u8 *buf,u8 *len)
{
        u8 rxlen=Uart2_RX_CNT;
        u8 i=0;
        *len=0;          //默认为0
        delay_ms(3);                //等待10ms,连续超过10ms没有接收到一个数据,则认为接收结束
        if(rxlen==Uart2_RX_CNT&&rxlen)//接收到了数据,且接收完成了
        {
                for(i=0;i<rxlen;i++)
                {
                        buf=Uart2_RX_BUF;        
                }               
                *len=Uart2_RX_CNT;        //记录本次数据长度
                Uart2_RX_CNT=0;                //清零
        }
}
[/mw_shl_code]
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2019-4-1 13:30:09 | 显示全部楼层
abc82465zz 发表于 2019-3-31 21:13
设置为发送完成进中断,每次中断发送一个字节,持续到发送完成所有字节。。。
楼上说的DMA并不推荐一开始 ...

为什么串口其实最好不要用DMA?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 14:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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