打印
[AVR单片机]

新手请教串口通信问题

[复制链接]
2072|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nbj846589308|  楼主 | 2013-7-23 13:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现在做串口通信实验,连接线为usb转232. #include "iom128v.h"
#include "macros.h"
#include "delay.h"
#include "math.h"

void USART0_init(void)
{
UBRR0L=47;                        /* 设置波特率*/   
//UCSR0B = (1<<RXEN0)|(1<<TXEN0);   /* 接收器与发送器使能*/
UCSR0B = 1<<TXEN0;
UCSR0C = (1<<UCSZ00)|(1<<UCSZ01); /* 设置帧格式: 8 个数据位, 1个停止位*/
}

void PORT_init(void)
{
  DDRE=0X02;
}

void main(void)
{
PORT_init();
USART0_init();
while(1)
{
UDR0=0XF0;
}
}
欲实现内容:单片机不断向上位机发送F0
现象与问题:在编译成功并下载到开发板上后,串口调试助手上得不到任何信息。但是用数字示波器测量开发板的串口,能够得到规律的矩形波(说明程序应该没有问题吧),但调试助手就是接受不到信号。于是把rs232的串口线剪断,再连接起来(便于测量),测量串口线里面的信号,都是杂乱的波形,并不能得到串口出口处所显示的波形。请问各位,问题出在哪呢?

相关帖子

沙发
Black残| | 2013-7-24 11:54 | 只看该作者
波特率设置有问题  void USART0_init(void) 不应该为void  而是应该传递uint变量的 baud波特率

使用特权

评论回复
板凳
qin552011373| | 2013-7-24 13:46 | 只看该作者
Black残 发表于 2013-7-24 11:54
波特率设置有问题  void USART0_init(void) 不应该为void  而是应该传递uint变量的 baud波特率 ...

波特率设置没问题

使用特权

评论回复
地板
qin552011373| | 2013-7-24 13:47 | 只看该作者
估计是你硬件方面的问题,换条串口线再试试,有可能是串口线的质量差,另外,串口线有直连线和交叉线,注意选用正确的连线方式

使用特权

评论回复
5
tanmilaoshu| | 2013-7-24 16:42 | 只看该作者
我也觉得应该是硬件的问题,首先检查一下连线可有问题,尤其是对于自己做的简易的串口线,注意RX和Tx不要接反了……

使用特权

评论回复
6
jlass| | 2013-7-26 09:13 | 只看该作者
你有示波器的话,这类问题应该很好解决吧,查查硬件连接吧

使用特权

评论回复
7
xiaoshuming| | 2013-7-27 11:57 | 只看该作者
初始化有问题

使用特权

评论回复
8
zezy371| | 2013-7-28 21:42 | 只看该作者
初始化有问题

什么问题呢?

使用特权

评论回复
9
yuandm1| | 2013-7-29 11:17 | 只看该作者
楼主在初始化的时候把UBRR0H设置为0试试,我在测试的时候有一次,为了省事,没有设置,结果不对。设置好后,串口发送正常了。

使用特权

评论回复
10
nbj846589308|  楼主 | 2013-7-29 12:08 | 只看该作者
Black残 发表于 2013-7-24 11:54
波特率设置有问题  void USART0_init(void) 不应该为void  而是应该传递uint变量的 baud波特率 ...

谢谢你的回复,那这条语句应该怎么改呢?是要把括号里的void去掉么?

使用特权

评论回复
11
nbj846589308|  楼主 | 2013-7-29 12:11 | 只看该作者
qin552011373 发表于 2013-7-24 13:47
估计是你硬件方面的问题,换条串口线再试试,有可能是串口线的质量差,另外,串口线有直连线和交叉线,注意 ...

谢谢斑竹的回复,过两天回学校重新买条串口线试试。那斑竹你觉得波特率设置上有什么问题呢?能否解释一下。

使用特权

评论回复
12
nbj846589308|  楼主 | 2013-7-29 12:12 | 只看该作者
xiaoshuming 发表于 2013-7-27 11:57
初始化有问题

谢谢你的回复,初始化哪里有问题呢?能否解释下?

使用特权

评论回复
13
nbj846589308|  楼主 | 2013-7-29 12:14 | 只看该作者
yuandm1 发表于 2013-7-29 11:17
楼主在初始化的时候把UBRR0H设置为0试试,我在测试的时候有一次,为了省事,没有设置,结果不对。设置好后 ...

谢谢你的回复,这个有点奇怪啊,高位不设置应该就是默认为0吧。不过按你说的,过两天回学校试试,呵呵。

使用特权

评论回复
14
nbj846589308|  楼主 | 2013-7-29 12:18 | 只看该作者
tanmilaoshu 发表于 2013-7-24 16:42
我也觉得应该是硬件的问题,首先检查一下连线可有问题,尤其是对于自己做的简易的串口线,注意RX和Tx不要接 ...

谢谢你的回复,我的串口线是9块钱在淘宝买的,不知道是不是线的问题,打算再买条试试,呵呵。

使用特权

评论回复
15
qin552011373| | 2013-7-29 13:46 | 只看该作者
nbj846589308 发表于 2013-7-29 12:11
谢谢斑竹的回复,过两天回学校重新买条串口线试试。那斑竹你觉得波特率设置上有什么问题呢?能否解释一下 ...

看波特率不像有问题  仔细看datasheet配置吧

使用特权

评论回复
16
xiaoshuming| | 2013-7-29 16:45 | 只看该作者
nbj846589308 发表于 2013-7-29 12:12
谢谢你的回复,初始化哪里有问题呢?能否解释下?

void uart_init(uint baud)
{
   UCSRB=0x00;
   UCSRA=0x00; //控制寄存器清零
   UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0);   
          //选择UCSRC,异步模式,禁止                        
          //   校验,1位停止位,8位数据位
   baud=mclk/16/baud-1;   //波特率最大为65K
   UBRRL=baud;                                                        
   UBRRH=baud>>8;                    //设置波特率
   UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
                 //接收、发送使能,接收中断使能
   SREG=BIT(7);         //全局中断开放
   DDRD|=0X02;         //配置TX为输出(很重要)

}

使用特权

评论回复
17
Black残| | 2013-7-30 11:02 | 只看该作者
nbj846589308 发表于 2013-7-29 12:08
谢谢你的回复,那这条语句应该怎么改呢?是要把括号里的void去掉么?

你试试  我帮你写的

#include <avr/io.h>
#include <avr/interrupt.h>

#define F_CPU 11059200
#define SBAUD 9600
#include <util/delay.h>

// UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9600 (0.0%)
// char size: 8 bit
// parity: Disabled
//*************************************************************begin
unsigned char data[16];
unsigned char data1,Datalength;
void uart0_init(void)//******串口初始化
{
        /*UCSR0B = 0x00; //disable while setting baud rate
        UCSR0A = 0x00; //U2X=0
        UCSR0C = 0x06; //8位数据位,1位停止位
        UBRR0L = 0x47; //波特率寄存器低8位  波特率9600
        UBRR0H = 0x00; //波特率寄存器高4
        UCSR0B = 0x98; //接受中断使能、接受使能、发送使能//*/

        UCSR0B = 0x00;
        UCSR0A = 0x00;
        UCSR0C =(1<<UCSZ01)|(1<<UCSZ00);
        UBRR0L=(F_CPU/16/(SBAUD+1))%256;
        UBRR0H=(F_CPU/16/(SBAUD+1))/256;
        UCSR0B =0x98;//(1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0);//*/
}

void sendchar(unsigned char data)//发送
{
        while(!(UCSR0A & (1<<UDRE0)));
        UDR0=data;
}

void Dataprocessing(unsigned char *recdata)//**********数据处理
{
        unsigned char temp;

        PORTB=0xFF;
        temp=1<<(recdata[1]+4);

        sendchar(temp);

        PORTB=PORTB&(~temp);
}

ISR(BADISR_vect)
{
        //while(!(UCSR0A & (1<<UDRE0)));
        //UDR0=0x55;
}

ISR(USART0_RX_vect)//接收
{
        //uart has received a character in UDR
        unsigned char j=0;
        char cSREG;
        cSREG = SREG; /* 保存 SREG */
        /* 禁止中断 */
        cli();
        data[0]=UDR0;
        if(data[0]==0x68)//**启始位
          {
                   do
                   {
                    while(!(UCSR0A & (1<<RXC0)));
                        if (j<16)
                        {
                            j++;
                            data[j]=UDR0;
                            if(data[j]==0x16)//**结束位
                             {
                                      Datalength=j;
                                      break;
                             }
                        }
                        else
                        {
                                //数据超长处理
                                break;
                        }
                   }while(1);
          }
        Dataprocessing(data);//***********数据处理
        SREG = cSREG; /* 恢复 SREG (I-bit) */
}

void port_init(void)
{
         DDRB=0XFF;
         PORTB=0XFF;
}

void main(void)
{
    uart0_init();
        port_init();

        sei();

        char cSREG;
        cSREG = SREG; /* 保存 SREG */

        while(1)
        {
            /*for(i=4;i<8;i++)
                {
                    PORTB=0xFF;
                        temp=1<<i;
                        PORTB=PORTB&(~temp);
                    _delay_ms(500);
                }//*/
        }
}

使用特权

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

本版积分规则

3

主题

15

帖子

0

粉丝