用串口助手调试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);
}
} 自己无耻的顶一下吧………… 没电路、没代码,没真相…… 估计是单片机接收部分的代码有问题 可以通过loopback方式确认 (检验下镊子短接PC端DB9的2、3pin检测串口调试工具能否自发自收) 先对电脑串口做自收自发测试 应该是单片机接收部分程序有问题吧,比如说使用中断方式接收,但是初始化时却忘记使能中断……楼主最好贴程序上来分析一下
修改原因:修改错别字 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);
}
} little_Monkey 发表于 2012-4-10 00:25 static/image/common/back.gif
先对电脑串口做自收自发测试
帅哥牛啊,果然,把串口的输入输出连接后,发送数据,串口助手接收不到,是什么原因啊,麻烦您说一下啊,谢谢了。 NemoGu 发表于 2012-4-10 00:22 static/image/common/back.gif
估计是单片机接收部分的代码有问题 可以通过loopback方式确认 (检验下镊子短接PC端DB9的2、3pin检测串口调 ...
代码贴出来了,但是短路PC串口的2和3后,串口助手接收不到自己发送的数据…… 简单看了下你的程序,基本没看出什么问题,只能期待高手了……不过看你说的电脑自发自收都没信号,那就说明电脑端出问题了呗,换个串口工具试试 nmzqdsg 发表于 2012-4-10 00:06 static/image/common/back.gif
没电路、没代码,没真相……
帅哥,贴出来了,帮忙看下撒~~~~谢谢了。 longwu537 发表于 2012-4-10 09:26 static/image/common/back.gif
简单看了下你的程序,基本没看出什么问题,只能期待高手了……不过看你说的电脑自发自收都没信号,那就说明 ...
再次谢谢,呵呵…… 检查串口线 交叉线和延长线要搞清楚 Sheldon_Cooper 发表于 2012-4-10 09:23 static/image/common/back.gif
代码贴出来了,但是短路PC串口的2和3后,串口助手接收不到自己发送的数据…… ...
2、3脚短接后收不到数据,是不是说明PC端的软件,或者串口有问题了? 之前使用PL2302 USB to UART出现过这样的问题,下载最新驱动重装后OK。 pter 发表于 2012-4-10 12:35 static/image/common/back.gif
之前使用PL2302 USB to UART出现过这样的问题,下载最新驱动重装后OK。
嗯,是的,驱动更新一下就好了,唉……这点问题折腾了一天,郁闷! nmzqdsg 发表于 2012-4-10 12:28 static/image/common/back.gif
2、3脚短接后收不到数据,是不是说明PC端的软件,或者串口有问题了?
嗯,对的,更新一下驱动就好了。 levy 发表于 2012-4-10 09:30 static/image/common/back.gif
检查串口线 交叉线和延长线要搞清楚
嗯,这次不是这个问题,是驱动没更新,郁闷,折腾了一天。 longwu537 发表于 2012-4-10 09:26 static/image/common/back.gif
简单看了下你的程序,基本没看出什么问题,只能期待高手了……不过看你说的电脑自发自收都没信号,那就说明 ...
好了,是因为驱动没有更新,郁闷啊…… little_Monkey 发表于 2012-4-10 00:25 static/image/common/back.gif
先对电脑串口做自收自发测试
谢谢了啊,是因为驱动没更新。 NemoGu 发表于 2012-4-10 00:22 static/image/common/back.gif
估计是单片机接收部分的代码有问题 可以通过loopback方式确认 (检验下镊子短接PC端DB9的2、3pin检测串口调 ...
驱动更新了之后好了,郁闷…… 主板的驱动没安装?,貌似串口驱动是自带的吧?{:sweat:} jetli 发表于 2012-4-10 21:23 static/image/common/back.gif
主板的驱动没安装?,貌似串口驱动是自带的吧?
安了,是旧版本的,必须更新后才行…… 不错,交流交流还是有帮助滴
页:
[1]