OpenEdv-开源电子网

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

求助有关串口通讯的问题?

[复制链接]

15

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2019-9-29
在线时间
19 小时
发表于 2021-4-10 14:26:52 | 显示全部楼层 |阅读模式
1金钱
用串口屏向单片机发送数据,单片机无法接收,但是又有别的情况,串口屏进入睡眠或睡眠唤醒后会向串口发送数据,这个数据是可以接收的,再用电脑连接串口屏,是可以接收到串口屏的数据的
情况就出在这,单片机能接收串口屏的部分数据,却不能接收到另一组数据,这是软件问题吗,是对数据接收处理的问题吗

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

使用道具 举报

15

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2019-9-29
在线时间
19 小时
 楼主| 发表于 2021-4-10 14:34:17 | 显示全部楼层
void usa1_init()
{
        GPIO_InitTypeDef usa1_io_init;
        USART_InitTypeDef usa1_usart_init;
        NVIC_InitTypeDef usa1_nvic_init;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
       
        //PA9 TX 复用推挽输出
        usa1_io_init.GPIO_Mode=GPIO_Mode_AF_PP;
        usa1_io_init.GPIO_Pin=GPIO_Pin_9;
        usa1_io_init.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&usa1_io_init);
       
        //PA10 RX 浮空输入
        usa1_io_init.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        usa1_io_init.GPIO_Pin=GPIO_Pin_10;
        usa1_io_init.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&usa1_io_init);
       
        //串口1配置
        usa1_usart_init.USART_BaudRate=115200;
        usa1_usart_init.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
        usa1_usart_init.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
        usa1_usart_init.USART_Parity=USART_Parity_No;
        usa1_usart_init.USART_StopBits=USART_StopBits_1;
        usa1_usart_init.USART_WordLength=USART_WordLength_8b;
       
        //nvic配置
        usa1_nvic_init.NVIC_IRQChannel=USART1_IRQn;                //串口1中断通道
        usa1_nvic_init.NVIC_IRQChannelCmd=ENABLE;
        usa1_nvic_init.NVIC_IRQChannelPreemptionPriority=2;                //抢占优先级2
        usa1_nvic_init.NVIC_IRQChannelSubPriority=1;                //抢断优先级
        NVIC_Init(&usa1_nvic_init);
       
        USART_Init(USART1, &usa1_usart_init);                //串口1初始化
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                //串口1接受中断开
        USART_Cmd(USART1, ENABLE);                //串口1使能
       
}


void USART1_IRQHandler(void)
{
        u8 usart1;
        if(USART_GetITStatus(USART1, USART_IT_RXNE)!=RESET)
        {
                usart1=USART_ReceiveData(USART1);
                if(usart1_ok!=0xc0)                //接收未完成
                {
                        if((usart1_ok&0x40))                //接收0x0d,标识为0100 0000,即接收到了0x0d
                        {
                                if(usart1==0x0a)
                                {
                                        //usart1_f=0;
                                        usart1_ok|=0x80;                //接收到0x0a,结束,标识1000 0000
                                        usart1_f=0;
                                }
                                else
                                {
                                        usart1_f=0;                //未接收到0x0a,接收失败,清零
                                        usart1_ok=0;
                                }
                        }
                        else                //未接收0x0d
                        {
                                if(usart1==0x0d)
                                        usart1_ok|=0x40;                //接收到0x0d  标识0100 0000
                                else                //
                                {
                                        usart1_rx[usart1_f]=usart1;                //将接收到的数据保存,&03f为将标识位去除
                                        usart1_f++;
                                        if(usart1_f>19)
                                        {
                                                usart1_f=0;                //当接收数据超过60时,接收错误,清零
                                                usart1_ok=0;
                                        }
                                }
                        }
                }
        }
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}

void usa1_chuli()
{
        if(usart1_ok==0xc0)
        {
                if(usart1_rx[0]==1)
                {
                        sj[0]=usart1_rx[1];
                        sj[1]=usart1_rx[2];
                        //sj[2]=usart1_rx[1];
                }
                if(usart1_rx[0]==2)
                {
                       
                        dinshi_kg=usart1_rx[1];
                        ds_kai[0]=usart1_rx[7];
                        ds_kai[1]=usart1_rx[6];
               
                        ds_guan[0]=usart1_rx[5];
                        ds_guan[1]=usart1_rx[4];
               
                }
               
                usart1_ok=0;
        }
}
回复

使用道具 举报

20

主题

200

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2015-11-28
在线时间
89 小时
发表于 2021-4-10 21:31:50 来自手机 | 显示全部楼层
大致看了一下。我觉得应该处在接收信号的中断处理上,你可以先不处理,先测试是否能正常接受。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2021-4-11 02:26:09 | 显示全部楼层
仿真找问题
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 23:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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