打印
[AVR单片机]

AVR单片机串口接收问题--求指点

[复制链接]
2060|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xcydwwq|  楼主 | 2017-9-22 10:01 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
开了接受结束中断,能正常的进入中断,但是接受的数据又发送出来为什么是00?
ISR (USART_RXC_vect)
{  
    usart_data=UDR;
   
   USART_SendBit8 (usart_data);        //发送8数据  
}


接收程序
USART_ReceiveBit8 ()                  //接受8位数据
{
    while(!(UCSRA&(1<<RXC)));            //等待接受
    return UDR;
}


相关帖子

沙发
xcydwwq|  楼主 | 2017-9-22 10:04 | 只看该作者

使用特权

评论回复
板凳
xcydwwq|  楼主 | 2017-9-22 10:05 | 只看该作者
发送程序是没有问题的

使用特权

评论回复
地板
feelhyq| | 2017-9-22 10:07 | 只看该作者
用示波器看看发送出去的波形,看看发出去的波特率是不是9600

使用特权

评论回复
5
ningling_21| | 2017-9-22 10:37 | 只看该作者
xcydwwq 发表于 2017-9-22 10:05
发送程序是没有问题的

串口接收到数据是多少?

使用特权

评论回复
6
xcydwwq|  楼主 | 2017-9-22 14:43 | 只看该作者
ningling_21 发表于 2017-9-22 10:37
串口接收到数据是多少?

我发送0XFF,单片机收到OXFF后再把0XFF发送出来,但是我只收到0X00,不知道为什么

使用特权

评论回复
7
山东电子小菜鸟| | 2017-9-22 14:50 | 只看该作者
波特率设置是否与时钟匹配

使用特权

评论回复
8
山东电子小菜鸟| | 2017-9-22 14:53 | 只看该作者
本帖最后由 山东电子小菜鸟 于 2017-9-22 14:54 编辑

使用特权

评论回复
9
山东电子小菜鸟| | 2017-9-22 14:53 | 只看该作者
山东电子小菜鸟 发表于 2017-9-22 14:50
波特率设置是否与时钟匹配


使用特权

评论回复
10
ningling_21| | 2017-9-22 15:11 | 只看该作者
xcydwwq 发表于 2017-9-22 14:43
我发送0XFF,单片机收到OXFF后再把0XFF发送出来,但是我只收到0X00,不知道为什么 ...

初始化的波特率是多少?
串口助手设置有问题

使用特权

评论回复
11
xcydwwq|  楼主 | 2017-9-22 21:17 | 只看该作者
ningling_21 发表于 2017-9-22 15:11
初始化的波特率是多少?
串口助手设置有问题

初始化的波特率是9600,单片机可以正常发送,但是接收有问题

使用特权

评论回复
12
xcydwwq|  楼主 | 2017-9-22 21:19 | 只看该作者

这个没有问题,在初始化的时候我确实是设置成了两个停止位
UCSRC|=(1<<URSEL)|(1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);     //初始化工作模式,先选择UCSRC寄存器,两个停止位,8位数据。

使用特权

评论回复
13
山东电子小菜鸟| | 2017-9-22 21:56 | 只看该作者
xcydwwq 发表于 2017-9-22 21:19
这个没有问题,在初始化的时候我确实是设置成了两个停止位
UCSRC|=(1

以前的代码 仅供参考
void init_uart(void)
{
        unsigned int baud;
        baud = 9600;
        UCSR0A = 0x00;       
        UCSR0B = 0x00;
        UCSR0C =(1<<UCSZ01)|(1<<UCSZ00);//异步通信 无校验 1位停止位 8位数据位
        UBRR0H = 0;
              UBRR0L = 103;  //9600
        UCSR0B =(1<<RXEN0)|(1<<RXCIE0)|(1<<TXEN0);       
}

使用特权

评论回复
14
进击的生菜| | 2017-9-23 09:05 | 只看该作者
我之前好像也遇到过这个问题   当时没在意  楼主你解决了吗

使用特权

评论回复
15
ddllxxrr| | 2017-9-23 09:15 | 只看该作者
这个同你的硬件或接收软件设置有关系

使用特权

评论回复
16
xcydwwq|  楼主 | 2017-9-24 23:20 | 只看该作者
山东电子小菜鸟 发表于 2017-9-22 21:56
以前的代码 仅供参考
void init_uart(void)
{

能否把接受中断函数发一下,谢谢了啊

使用特权

评论回复
17
xcydwwq|  楼主 | 2017-9-24 23:34 | 只看该作者
ddllxxrr 发表于 2017-9-23 09:15
这个同你的硬件或接收软件设置有关系

电脑端可以正常接受到单片机发过来的数据,但是发送到单片机的数据单片机收不到啊
这是中断函数中的代码,可以正常进入中断的

  ucrst_data8=UDR;           //读出数据
      
    if(ucrst_data8=='a')
    {
        USART_SendBit8 ('A');        //接受到a返回A
        USART_SendBit8 (ucrst_data8);        //发送8数据
    }
    else
    {
        USART_SendBit8 ('b');        //没有接受到a返回b
        USART_SendBit8 (ucrst_data8);        //发送8数据
    }

返回值为b和空,切换到16进制,显示为0X62和0x00,也就是说从UDR读取到的数据为0

使用特权

评论回复
18
nicole.088| | 2017-9-25 09:37 | 只看该作者
1、先检查硬件,把你接电脑端的串口线的TX,RX短路,串口助手自动发送,看能不能自发自收。
2、找一个开发板成功的例程直接测试你的硬件,这样至少保证软件或硬件至少有一个是确定正常的。
3、用示波器看AVR单片机TX引脚是否有数据出来,再看经过串口芯片是否有数据出来

使用特权

评论回复
19
我有一只小可爱| | 2019-7-12 11:46 | 只看该作者
请问最后问题是怎么解决的,我也遇见一样的问题了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

80

帖子

1

粉丝