C8051串口通信为什么会自动发送上一个收到的字符

kunpeng08 2013-10-15 08:46:46
我用的是C8051,通过串口往单片机里写数据,但是接受第二个字符时会自动发送前面接收到的字符。
接收字符用的是getchar();语句。


求大神帮助!!!
...全文
245 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
kunpeng08 2013-10-15
  • 打赏
  • 举报
回复
没有,短了的话发出去它应该立马就收到字符了的,但是我这个是getchar();运行后才收到上一个发送的字符,而且此时串口调试软件没发东西
dceacho 2013-10-15
  • 打赏
  • 举报
回复
不会是串口的2根线短路了吧
kunpeng08 2013-10-15
  • 打赏
  • 举报
回复
我用的是KEIL软件
kunpeng08 2013-10-15
  • 打赏
  • 举报
回复
while(flag_shakehand!=1) { RI0=0; TI0=1; getchar(); mode = SBUF0; if(mode=='S') { mode = 'R'; RI0 = 1; SBUF0 = mode; TI0 = 0; printf("%c%c",mode,&mode); flag_shakehand=1; break; } } 就比方里面的这段代码,if条件里面的代码页不执行,光执行getchar();就会发送数据了,我用的是keil getchar()函数应该是内部的函数,我看不到里面的代码
kunpeng08 2013-10-15
  • 打赏
  • 举报
回复
void SYSCLK_Init (void) { int i; // delay counter OSCXCN = 0x67; // start external oscillator with // 22.1184MHz crystal for (i=0; i < 256; i++) ; // wait for oscillator to start while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle OSCICN = 0x88; // select external oscillator as SYSCLK // source and enable missing clock // detector } //----------------------------------------------------------------------------- // PORT_Init //----------------------------------------------------------------------------- // // Configure the Crossbar and GPIO ports // void PORT_Init (void) { XBR0 |= 0x04; // Enable UART0 #ifdef RSPI XBR0 |= 0x02; // Enable SPI0 #endif XBR2 |= 0x40; // Enable crossbar XBR2 &= 0x7f; // Enable weak pull-ups #ifdef RSPI P0MDOUT &= ~0x40; // p_0.2 and p_0.3 oc output for SDA and SCL #else P0MDOUT &= ~0x0c; // p_0.2 and p_0.3 oc output for SDA and SCL P0MDOUT &= ~0x20; // p_0.5 oc output for SDO input #endif P74OUT = 0xff; //enable P4 P5 P6 P7 as push-pull output } //----------------------------------------------------------------------------- // UART0_Init //----------------------------------------------------------------------------- // // Configure the UART0 using Timer1, for <baudrate> and 8-N-1. // void UART0_Init (void) { SCON0 = 0x50; // SCON0: mode 1, 8-bit UART, enable RX TMOD = 0x20; // TMOD: timer 1, mode 2, 8-bit reload TH1 = -(SYSCLK/BAUDRATE_UART0/16); // set Timer1 reload value for baudrate TR1 = 1; // start Timer1 CKCON |= 0x10; // Timer1 uses SYSCLK as time base PCON |= 0x80; // SMOD0 = 1 (disable baud rate divide-by-two) TI0 = 1; // Indicate TX0 ready REN0 = 1; // EA =1; // ES0 =1; } // //----------------------------------------------------------------------------- // SPI0_Init //----------------------------------------------------------------------------- // // Configure SPI0 for 8-bit, 2MHz SCK, Master mode, polled operation, data // sampled on 1st SCK rising edge. // void SPI0_Init (void) { SPI0CFG = 0xC7; // data sampled on 2nd SCK rising edge // 8-bit data words SPI0CN = 0x03; // Master mode; SPI enabled; flags // cleared SPI0CKR = SYSCLK/2/150000; // SPI clock <= 2MHz (limited by // EEPROM spec.) } void main() { unsigned char ddf_i,code_flag,temp_00,temp_01,temp_04; unsigned int flag_shakehand,flag_recv,i,y; code_flag=0; flag_recv=0; temp_00=0; temp_01=0; temp_04=0; ddf_i=0; i=0; y=0; flag_shakehand=0; // SEL=1; // TRIG=1; // SACLK=1; WDTCN = 0xde; // disable watchdog timer WDTCN = 0xad; // SARESET=1; //just for test //c2codetest(); SYSCLK_Init (); // initialize oscillator PORT_Init (); // initialize crossbar and GPIO UART0_Init (); // initialize UART0 SPI0_Init(); //UART1_Init (); // initialize UART1 // transmit example //sp120set ("appl:sin 5.0 khz,3.0 vpp,-2.0 v\n"); ddf_i=P0MDOUT; //set P1 hz P1MDOUT = 0x00; // enable P1 as open-drain outputs P1 = 0xff; //set P2 hz P2MDOUT = 0x00; // enable P2 as open-drain outputs P2 = 0xff; //set P3 hz P3MDOUT = 0x00; // enable P3 as open-drain outputs P3 = 0xff; //set P1.7 as digital input P1MDIN |= 0x01; //sp120set ("\n"); //sp120set ("\n"); //sp120set ("\n"); //sp120set ("resiter_test_start:\n"); //switch off all relay P4=0x00; P5=0x00; P6=0x00; P7=0x00; while(1) { // flag_shakehand=1; while(flag_shakehand!=1) { RI0=0; TI0=1; getchar(); // scanf("%c",SBUF0); mode = SBUF0; if(mode=='S') { mode = 'R'; RI0 = 1; SBUF0 = mode; TI0 = 0; // putchar(mode); printf("%c%c",mode,&mode); flag_shakehand=1; break; } } while(flag_shakehand==1) { // getchar(); // mode = SBUF0; // RI0 = 0; // if(mode=='C') // { lsm303_m_test(); flag_shakehand=0; y=0; break; // } } while(1) { getchar(); mode = SBUF0; RI0 = 0; switch(mode) { case 0x01:printf("%4f",avg_x);i=1;break; case 0x02:printf("%4f",avg_y);i=2;break; case 0x03:printf("%4f",avg_z);i=3;break; case 0x04:printf("%4d",delt_x);i=4;break; case 0x05:printf("%4d",delt_y);i=5;break; case 0x06:printf("%4d",delt_z);i=6;break; default:i=0; } while(i!=0) { getchar(); mode = SBUF0; RI0 = 0; if(mode=='r') { y++; break; } if(mode=='n') { switch(i) { case 1:printf("%4f",avg_x);break; case 2:printf("%4f",avg_y);break; case 3:printf("%4f",avg_z);break; case 4:printf("%4d",delt_x);break; case 5:printf("%4d",delt_y);break; case 6:printf("%4d",delt_z);break; default:break; } } } if(y>=6) break; } #if(0==BOARD_TYPE) //for SA9801 sa9801_test(); #elif(1==BOARD_TYPE) //for SD9886 sd9886_test(); #elif(2==BOARD_TYPE) //for SC8113 sc8113i2c(); #elif(3==BOARD_TYPE) //for SD7415 spi sd7415spi(); #elif(4==BOARD_TYPE) //for SD7415 iic sd7415i2c(); #elif(5==BOARD_TYPE) //for SC7312 iic sc7313i2c(); #elif(6==BOARD_TYPE) //for SE33DE iic se33de_test(); #elif(7==BOARD_TYPE) //for SE4200 spi se4200spi(); #elif(8==BOARD_TYPE) //for SE4200 iic se4200iic(); #elif(9==BOARD_TYPE) //for lsm303 iic // if(mode=='1') // lsm303_m_test(); // flag_recv=0; #elif(10==BOARD_TYPE) //for lps331ap iic lps331ap_test(); #elif(11==BOARD_TYPE) //for lps331ap iic sc7a30_Rspi_test(); #endif } }
woshi_ziyu 2013-10-15
  • 打赏
  • 举报
回复
贴下代码看看
天才2012 2013-10-15
  • 打赏
  • 举报
回复
估计是你的逻辑有问题了!
palleexu 2013-10-15
  • 打赏
  • 举报
回复
看你51的程序里面有没有将接收到的数据返回的语句?
of123 2013-10-15
  • 打赏
  • 举报
回复
看一下底层代码,是否有发送的语句。

27,515

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧