Sheldon_Cooper 发表于 2012-4-9 22:39:44

用串口助手调试232串口,可以接收不能发送(已解决,谢谢大家)

本帖最后由 Sheldon_Cooper 于 2012-4-10 14:11 编辑

max232电路,串口助手可以接收到单片机发送的数据,但是单片机接收不到串口助手发送的数据,有什么注意的吗,求解释啊……

下面是程序:
/*********************************************
File name                        : demo_13_1.c
Chip type         : ATmega16
Program type      : Application
Clock frequency   : 4.000000 MHz
Memory model      : Small
External SRAM size: 0
Data Stack size   : 256
*********************************************/

#include <mega16.h>
#include <delay.h>

#define BAUD    9600            //波特率采用9600bps
#define CRYSTAL 4000000                        //系统时钟4MHz

//计算和定义波特率设置参数
#define BAUD_SETTING (unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
#define BAUD_H (unsigned char)(BAUD_SETTING>>8)
#define BAUD_L (unsigned char)(BAUD_SETTING)

// USART控制和状态寄存器的标志位定义
#define RXC7          // UCSRA位定义
#define TXC6
#define UDRE 5
#define FE   4
#define DOR3
#define PE   2
#define U2X1
#define MPCM 0
#define RXCIE 7         // UCSRB位定义
#define TXCIE 6
#define UDRIE 5
#define RXEN4
#define TXEN3
#define UCSZ2 2
#define RXB81
#define TXB80
#define URSEL 7         // UCSRC位定义
#define UMSEL 6
#define UPM15
#define UPM04
#define USBS3
#define UCSZ1 2
#define UCSZ0 1
#define UCPOL 0

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<PE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)

flash unsigned char led_7={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

interrupt void usart_rx_isr(void)   // USART接收中断服务
{
    unsigned char status,data;
    status = UCSRA;
    data = UDR;
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
      PORTA = led_7;
}

void USART_Transmit(unsigned char data)
{
        while (!(UCSRA & DATA_REGISTER_EMPTY));   // 等待发送寄存器空                                      
        UDR = data;                                 // 发送数据                                
}

void main( void )
{
    unsigned char i=0;
   
    PORTA = 0x00;       // LED段码输出
    DDRA = 0xff;
    PORTD = 0x03;       // TXD(PD1)输出
    DDRD = 0x02;      // RXD(PD0)输入,上拉有效
   
    UCSRA = 0x00;       // USART初始化
    UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);   // 允许RXC中断,接收允许,发送允许
    //UCSRB = 0x98;
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);   // 8 Data, 1 Stop, No Parity
    //UCSRC = 0x86;
    UBRRH = BAUD_H;   // 设置波特率
    UBRRL = BAUD_L;
    #asm("sei")         // 开中断
        for(;;)
        {
                USART_Transmit(i);
          if (++i >= 10) i = 0;
          delay_ms(500);
        }
}

Sheldon_Cooper 发表于 2012-4-9 22:41:55

自己无耻的顶一下吧…………

nmzqdsg 发表于 2012-4-10 00:06:06

没电路、没代码,没真相……

NemoGu 发表于 2012-4-10 00:22:57

估计是单片机接收部分的代码有问题 可以通过loopback方式确认 (检验下镊子短接PC端DB9的2、3pin检测串口调试工具能否自发自收)

little_Monkey 发表于 2012-4-10 00:25:06

先对电脑串口做自收自发测试

longwu537 发表于 2012-4-10 09:15:01

应该是单片机接收部分程序有问题吧,比如说使用中断方式接收,但是初始化时却忘记使能中断……楼主最好贴程序上来分析一下
修改原因:修改错别字

Sheldon_Cooper 发表于 2012-4-10 09:17:27

longwu537 发表于 2012-4-10 09:15 static/image/common/back.gif
应该是单片机接收部分程序有问题吧,比如说使用中断方式接收,但是初始化时却忘记使能中断……楼主最好贴程 ...

麻烦您帮忙看一下,谢谢啦。

/*********************************************
File name                        : demo_13_1.c
Chip type         : ATmega16
Program type      : Application
Clock frequency   : 4.000000 MHz
Memory model      : Small
External SRAM size: 0
Data Stack size   : 256
*********************************************/

#include <mega16.h>
#include <delay.h>

#define BAUD    9600            //波特率采用9600bps
#define CRYSTAL 4000000                        //系统时钟4MHz

//计算和定义波特率设置参数
#define BAUD_SETTING (unsigned int)((unsigned long)CRYSTAL/(16*(unsigned long)BAUD)-1)
#define BAUD_H (unsigned char)(BAUD_SETTING>>8)
#define BAUD_L (unsigned char)(BAUD_SETTING)

// USART控制和状态寄存器的标志位定义
#define RXC7          // UCSRA位定义
#define TXC6
#define UDRE 5
#define FE   4
#define DOR3
#define PE   2
#define U2X1
#define MPCM 0
#define RXCIE 7         // UCSRB位定义
#define TXCIE 6
#define UDRIE 5
#define RXEN4
#define TXEN3
#define UCSZ2 2
#define RXB81
#define TXB80
#define URSEL 7         // UCSRC位定义
#define UMSEL 6
#define UPM15
#define UPM04
#define USBS3
#define UCSZ1 2
#define UCSZ0 1
#define UCPOL 0

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<PE)
#define DATA_OVERRUN (1<<DOR)
#define DATA_REGISTER_EMPTY (1<<UDRE)

flash unsigned char led_7={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

interrupt void usart_rx_isr(void)   // USART接收中断服务
{
    unsigned char status,data;
    status = UCSRA;
    data = UDR;
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
      PORTA = led_7;
}

void USART_Transmit(unsigned char data)
{
        while (!(UCSRA & DATA_REGISTER_EMPTY));   // 等待发送寄存器空                                      
        UDR = data;                                 // 发送数据                                
}

void main( void )
{
    unsigned char i=0;
   
    PORTA = 0x00;       // LED段码输出
    DDRA = 0xff;
    PORTD = 0x03;       // TXD(PD1)输出
    DDRD = 0x02;      // RXD(PD0)输入,上拉有效
   
    UCSRA = 0x00;       // USART初始化
    UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);   // 允许RXC中断,接收允许,发送允许
    //UCSRB = 0x98;
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);   // 8 Data, 1 Stop, No Parity
    //UCSRC = 0x86;
    UBRRH = BAUD_H;   // 设置波特率
    UBRRL = BAUD_L;
    #asm("sei")         // 开中断
        for(;;)
        {
                USART_Transmit(i);
          if (++i >= 10) i = 0;
          delay_ms(500);
        }
}

Sheldon_Cooper 发表于 2012-4-10 09:20:08

little_Monkey 发表于 2012-4-10 00:25 static/image/common/back.gif
先对电脑串口做自收自发测试

帅哥牛啊,果然,把串口的输入输出连接后,发送数据,串口助手接收不到,是什么原因啊,麻烦您说一下啊,谢谢了。

Sheldon_Cooper 发表于 2012-4-10 09:23:22

NemoGu 发表于 2012-4-10 00:22 static/image/common/back.gif
估计是单片机接收部分的代码有问题 可以通过loopback方式确认 (检验下镊子短接PC端DB9的2、3pin检测串口调 ...

代码贴出来了,但是短路PC串口的2和3后,串口助手接收不到自己发送的数据……

longwu537 发表于 2012-4-10 09:26:37

简单看了下你的程序,基本没看出什么问题,只能期待高手了……不过看你说的电脑自发自收都没信号,那就说明电脑端出问题了呗,换个串口工具试试

Sheldon_Cooper 发表于 2012-4-10 09:30:11

nmzqdsg 发表于 2012-4-10 00:06 static/image/common/back.gif
没电路、没代码,没真相……

帅哥,贴出来了,帮忙看下撒~~~~谢谢了。

Sheldon_Cooper 发表于 2012-4-10 09:30:52

longwu537 发表于 2012-4-10 09:26 static/image/common/back.gif
简单看了下你的程序,基本没看出什么问题,只能期待高手了……不过看你说的电脑自发自收都没信号,那就说明 ...

再次谢谢,呵呵……

levy 发表于 2012-4-10 09:30:57

检查串口线 交叉线和延长线要搞清楚

nmzqdsg 发表于 2012-4-10 12:28:24

Sheldon_Cooper 发表于 2012-4-10 09:23 static/image/common/back.gif
代码贴出来了,但是短路PC串口的2和3后,串口助手接收不到自己发送的数据…… ...

2、3脚短接后收不到数据,是不是说明PC端的软件,或者串口有问题了?

pter 发表于 2012-4-10 12:35:30

之前使用PL2302 USB to UART出现过这样的问题,下载最新驱动重装后OK。

Sheldon_Cooper 发表于 2012-4-10 14:05:34

pter 发表于 2012-4-10 12:35 static/image/common/back.gif
之前使用PL2302 USB to UART出现过这样的问题,下载最新驱动重装后OK。

嗯,是的,驱动更新一下就好了,唉……这点问题折腾了一天,郁闷!

Sheldon_Cooper 发表于 2012-4-10 14:05:58

nmzqdsg 发表于 2012-4-10 12:28 static/image/common/back.gif
2、3脚短接后收不到数据,是不是说明PC端的软件,或者串口有问题了?

嗯,对的,更新一下驱动就好了。

Sheldon_Cooper 发表于 2012-4-10 14:06:40

levy 发表于 2012-4-10 09:30 static/image/common/back.gif
检查串口线 交叉线和延长线要搞清楚

嗯,这次不是这个问题,是驱动没更新,郁闷,折腾了一天。

Sheldon_Cooper 发表于 2012-4-10 14:07:19

longwu537 发表于 2012-4-10 09:26 static/image/common/back.gif
简单看了下你的程序,基本没看出什么问题,只能期待高手了……不过看你说的电脑自发自收都没信号,那就说明 ...

好了,是因为驱动没有更新,郁闷啊……

Sheldon_Cooper 发表于 2012-4-10 14:08:03

little_Monkey 发表于 2012-4-10 00:25 static/image/common/back.gif
先对电脑串口做自收自发测试

谢谢了啊,是因为驱动没更新。

Sheldon_Cooper 发表于 2012-4-10 18:57:17

NemoGu 发表于 2012-4-10 00:22 static/image/common/back.gif
估计是单片机接收部分的代码有问题 可以通过loopback方式确认 (检验下镊子短接PC端DB9的2、3pin检测串口调 ...

驱动更新了之后好了,郁闷……

jetli 发表于 2012-4-10 21:23:21

主板的驱动没安装?,貌似串口驱动是自带的吧?{:sweat:}

Sheldon_Cooper 发表于 2012-4-10 22:56:04

jetli 发表于 2012-4-10 21:23 static/image/common/back.gif
主板的驱动没安装?,貌似串口驱动是自带的吧?

安了,是旧版本的,必须更新后才行……

gfy200866 发表于 2013-5-7 11:10:32

不错,交流交流还是有帮助滴
页: [1]
查看完整版本: 用串口助手调试232串口,可以接收不能发送(已解决,谢谢大家)