Board logo

标题: [求助] sci发数据,pc收不到 [打印本页]

作者: txw1111    时间: 2009-3-8 16:48     标题: [求助] sci发数据,pc收不到

调试时TDRE = 1,这个不怎么变化,

这个标志TC = 1,这个有时候变化。

但是SCI0DRL中一直没有我要发送的数据。

接受的时候可以收到数据。

硬件连接开始直接用串口线,后来用得USB转串口。

调试软件是串口调试助手V2.2

请问给位大侠给我指点一下。可能是什么问题。

程序如下:

/*---------延迟程序----------------------*/
void Delay(void)
{
unsigned char i,j;
for(i=0;i<200;i++)
{
for(j=0;j<100;j++)
asm nop;
}
}

/*--------闪烁程序-----------------------*/
void light(void)
{
unsigned char i;
for(i=0;i<10;i++)
{
PORTB=0;
Delay();
PORTB=0XFF;
Delay();
}
}

/*-------串口初始化----------------------*/
void SciInit(){
SCI0BDL = (unsigned char)((16000000UL /* OSC freq */ / 2) / 9600 /* baud rate */ / 16 /*factor*/);
SCI0CR1=0; /*normal,no parity*/
SCI0CR2=0X2C; /*RIE=1,TE=1,RE=1*/
}

/*-------发射端程序----------------------*/
void SciTx(unsigned char text){
unsigned char temp;
temp=SCI0SR1; /*clear flag*/
while (!(SCI0SR1&0x80)); /* wait for output buffer empty */
SCI0DRH=0;
SCI0DRL=text;
}

/*-------接受端程序----------------------*/
char SciRx(void){
char result,temp;
temp=SCI0SR1; /*clear flag*/
while(!(SCI0SR1&0x20));
result=SCI0DRL;
return result;
}


/*--------中断程序-----------------------*/
interrupt void Serv_int(void)
{unsigned char data;
DisableInterrupts;
data=SciRx();
light();
SciTx(data);
EnableInterrupts;
}


/*-------主函数--------------------------*/
void main(void) {
EnableInterrupts;
DDRB=0XFF;
SciInit();
for(;;) {


}
}

[此贴子已经被作者于2009-3-8 16:50:31编辑过]


作者: lijun2631    时间: 2009-3-9 00:23

你好,这是我用的一个最简单的sci发送接收的程序,是用串口调试助手发送一个数据,收到后再发送回去用调试工具显示接收的结果,你试试能不能用.我这里可以

#include <hidef.h> /* common defines and macros */
#include <mc9s12dp256.h> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dp256b"

int i,j,k,m=0;char t[]={0xaa,0xff,0xa5,0x55};
void main()
{DisableInterrupts; /*禁止中断*/
//初始化SCI
SCI0BDL=0x34; /*波特率常数为52,设置波特率为9600*/
SCI0BDH=0x00;


SCI0CR1=0x00;
//SCI0CR1_LOOPS=0; /*正常工作模式*/
//SCI0CR1_SCISWAI=0; /*等待模式下继续工作*/
//SCI0CR1_RSRC=0; /*LOOPS为零此位无效*/
//SCI0CR1_M=0; /*传输数据位为8位*/
//SCI0CR1_WAKE=0; /*介质唤醒方式*/
//SCI0CR1_ILT=0; /*保守检测*/
//SCI0CR1_PE=0; /*不进行奇偶校验*/
//SCI0CR1_PT=0; /*SCI0CR1_PE=0;此位无效*/

SCI0CR2=0x0c;
//SCI0CR2_SCTIE=0; /*禁止发送器中断*/
//SCI0CR2_TCIE=0; /*禁止发送结束中断*/
//SCI0CR2_RIE=0; /*禁止接受中断*/
//SCI0CR2_ILIE=0; /*禁止空闲中断*/
//SCI0CR2_TE=1; /*发送允许*/
//SCI0CR2_RE=1; /*允许接受*/
//SCI0CR2_RWU=0; /*接收器正常唤醒*/
//SCI0CR2_SBK=0; /*中止符发送器关闭*/
i=SCI0SR1;
i=SCI0DRL;


DDRB=0xff;

while(1)
{

if(SCI0SR1_RDRF!=0){
PORTB=SCI0DRL;
k=SCI0DRL;


if(SCI0SR1_TDRE==1){
SCI0DRL=k; /*发送字符串*/
SCI0DRH=0;
m++;
}

}

}

}

[此贴子已经被作者于2009-3-9 0:24:43编辑过]


作者: txw1111    时间: 2009-3-9 10:29     标题: [讨论]

谢谢楼上的朋友。我试了也不行,还是一样能收到电脑发的数据,电脑不能收到单片机发的数据。

我昨天试了一下,两个单片机能够发送和接收。单片机发送,用dspase可以收到单片机发的数据。

我在想问题不应该出现在单片机的程序上,可能是电脑那边有问题。

希望大家多给意见,谢谢


作者: fayefayehoo    时间: 2009-3-9 14:20

先接个示波器看看有没有确实发出来

如果有发出来而PC机没有收到,再看看是不是因为没有做checksum导致串口助手没有显示。


作者: txw1111    时间: 2009-3-9 17:13

谢谢给位大侠的指点,我找到问题了。是我的串口接口两头都是公的,导致了TXD和RXD翻转,现在将其再一次翻转就可以用了。谢谢大家的指点。


作者: chiusir    时间: 2009-3-16 00:23

那就去我的BK下载吧!






欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0