OpenEdv-开源电子网

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

单独串口发送正常,单独串口接受正常,现在先串口发送,然后串口接收不正常,怎么回事?

[复制链接]

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2015-3-5
在线时间
3 小时
发表于 2015-6-22 16:51:52 | 显示全部楼层 |阅读模式
5金钱
单独串口发送正常,单独串口接受正常,现在先串口发送,然后串口接收不正常,怎么回事?
现在用STM32F103和迪文屏通信
写了串口发送函数:

void  chaxun(char addr_l,char addr_h)
       {
     USART2->DR=0x5a;
     while((USART2->SR&0X40)==0);//等待发送结束
     USART2->DR=0xa5;
     while((USART2->SR&0X40)==0);//等待发送结束
     USART2->DR=0x04;
     while((USART2->SR&0X40)==0);//等待发送结束
     USART2->DR=0x83;
     while((USART2->SR&0X40)==0);//等待发送结束
     USART2->DR=addr_l;
     while((USART2->SR&0X40)==0);//等待发送结束
     USART2->DR=addr_h;
     while((USART2->SR&0X40)==0);//等待发送结束
     USART2->DR=0x01;
     while((USART2->SR&0X40)==0);//等待发送结束
       }

 现在执行chaxun(0x00,0x20),串口发送5a a5 04 83 00 20 01 正常

写了串口接收函数:

void USART2_IRQHandler(void)   ///串口 1 的中断响应函数
{

    USART2_RX_BUF[Rec2i]=USART2->DR;
   ag_D[Rec2i]=USART2_RX_BUF[Rec2i]; //Pag_D[] 自己定义的数组,接收串口数据 
   Rec2i++;                                                //Rec2i---自己定义的int8变量
}

可以接受串口数据

但是现在
chaxun(0x00,0x20);
USART2_IRQHandler();

串口一个 数据也接受不到,怎么回事?
用串口调试助手,发送5a a5 04 83 00 20 01,然后就可以接收到屏发回来的数据,都正常

请大家指点,多谢!!!

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

使用道具 举报

2

主题

9

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2015-5-27
在线时间
0 小时
发表于 2015-6-22 21:15:06 | 显示全部楼层
发送是向终端发送,接收是由终端发送,单片机接收
所你发送给终端的数据,只有终端可以接受到,单片机是接收不到的
回复

使用道具 举报

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2015-3-5
在线时间
3 小时
 楼主| 发表于 2015-6-23 08:15:40 | 显示全部楼层
谢谢你的回复,

不过 不是像你说的那样,我现在向屏发送数据,屏就会回复一串数据的,我用串口调试助手向屏发送5a a5 04 83 00 20 01,屏就会 回复一串数据,是5a a5 06 83 00 20 22 34,串口调试助手也能收到

但是我用上面写的函数,用STM32发送 数据,STM32收不到。STM32单独发送,也正常,STM32单独接收,也正常。
但是 要是连在一起,
chaxun(0x00,0x20);
USART2_IRQHandler();

STM32可以发送数据,但是收不到数据,奇怪,请指点!!!多谢!!!!
回复

使用道具 举报

3

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2014-10-31
在线时间
8 小时
发表于 2015-6-23 09:21:48 | 显示全部楼层
中断里面不用判断接收标志?就这样直接取数据,不知道有没有影响,而且要在中断中清除接收标志,希望对你有帮助
回复

使用道具 举报

3

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2014-10-31
在线时间
8 小时
发表于 2015-6-23 09:23:19 | 显示全部楼层
void USART1_IRQHandler(void) 
{
    uint8_t data_buffer;
    if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//jie 
    {
        t_sleep_tmr = TIME_MCU_SLEEP;
        USART_ClearITPendingBit(USART1, USART_IT_RXNE); 
        data_buffer =  USART1->DR & 0xff;
回复

使用道具 举报

3

主题

65

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2014-10-31
在线时间
8 小时
发表于 2015-6-23 09:24:34 | 显示全部楼层
void USART1_IRQHandler(void) 
{
    uint8_t data_buffer;
    if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//jie 
    {
        t_sleep_tmr = TIME_MCU_SLEEP;
        USART_ClearITPendingBit(USART1, USART_IT_RXNE); 
        data_buffer =  USART1->DR & 0xff; 
        if(g_uart_data.rx_count == 0)
        {
            f_uart_start = 1;
        }
        if(g_uart_data.rx_count < 100)//?????¤??????100
        {
            if((g_uart_data.rx_count == 0)&&(data_buffer != 0x7e)&&(data_buffer != 0xef))
            {
                f_uart_start = 0;
                return;   
            }
            g_uart_data.rx_buffer[g_uart_data.rx_count] = data_buffer;
            g_uart_data.rx_count += 1;
            if(((g_uart_data.rx_buffer[0]==0X7E)&&(g_uart_data.rx_count == 20)))
            {
                f_uart_rx = 1;
            }
            if((g_uart_data.rx_buffer[0]==0xef)&&(g_uart_data.rx_buffer[2]==0x02)&&(g_uart_data.rx_count == (g_uart_data.rx_buffer[5]+9)))
            {
                f_uart_rx = 1;
            }
            if((g_uart_data.rx_buffer[0]==0xef)&&(g_uart_data.rx_buffer[2]!= 0x02)&&(g_uart_data.rx_count==10))
            {
                f_uart_rx = 1;
            }
            if(f_uart_rx)
            {
                g_uart_data.rx_count = 0;
                f_uart_start = 0;
            }
        }   
    }
    if (USART_GetITStatus(USART1, USART_IT_TXE) != RESET) //fasong
    {
        USART_ClearITPendingBit(USART1, USART_IT_TXE);
        while(USART_GetFlagStatus(USART1, USART_IT_TXE) != RESET);//
        if(g_uart_data.tx_cnt < (g_uart_data.tx_count -1) )
        {
            g_uart_data.tx_cnt += 1;
            USART_SendData(USART1,g_uart_data.tx_buffer[g_uart_data.tx_cnt]);
        }
        else
        {
            g_uart_data.tx_cnt = 0;
            g_uart_data.tx_count = 0;
          //  g_uart_data.rx_flag = 1;
            USART_ITConfig(USART1, USART_IT_TXE, DISABLE); 
            USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
        }
    }
}
回复

使用道具 举报

6

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2015-3-5
在线时间
3 小时
 楼主| 发表于 2015-6-23 15:47:51 | 显示全部楼层
楼上的兄弟,谢谢你!

你用库函数 写的,我看起来 好费劲,不过还是 谢谢你!

还在困惑中,为何收不到数据
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 18:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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