打印

XS128单片机串口通信出现问题

[复制链接]
1299|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
文武qq|  楼主 | 2016-3-18 23:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目的:在采用飞思卡尔的MC9S12XS128单片机与电脑通信时,串口调试助手向单片机发送数据,单片机通过查询接收数据,当单片机接收到串口调试助手发送过来的数据后返回一个相应的值,很基础的串口通信调试。
问题:现在串口调试助手发送给单片机的数据,单片机能接收到,但是接收到的数据与串口调试助手发送的数据并不一致,而一致时单片机返回过来的数据在串口调试助手中显示的是乱码,求解原因?
(求赐教,急求!感谢各位!!!)
这是串口助手的显示
附上代码:
#include <hidef.h>           /* common defines and macros */
#include "derivative.h"      /* derivative-specific definitions */
#include <MC9S12XS128.h>
#include <math.h>
#include <stdio.h>

uint synr=0;
long BUS_CLOCK=0;   //总线频率
#define BAUD 9600                   //串口波特率

void INIT_PLL()
{   
  
   CLKSEL_PLLSEL=0;          
   PLLCTL_PLLON=0;  //PLLCTL.6(pllon)设为0;先关闭PLL       
   BUS_CLOCK=64000000;
   SYNR=0xc0|0x07;         
   REFDV=0x80 | 0x01;         
   POSTDIV=0x00;     
   PLLCTL_PLLON=1;  //PLLCTL.6(pllon)设为1;打开PLL
   _asm(nop);         
   _asm(nop);
   while(CRG**_LOCK==0); //根据CRG**寄存器的LOCK位,确定PLL是否稳定         LOCK==1 稳定,==0 不稳定  
   CLKSEL_PLLSEL =1;     //选择PLL作为时钟源                       
}

void INIT_SCI(void)
{

  SCI0BD = BUS_CLOCK/16/BAUD;  //设置SCI0波特率为9600
  SCI0CR1 = 0x00;
  SCI0CR2 = 0x0C;  
}

void SCI_send(unsigned char data)
{
  while(!SCI0SR1_TDRE);       //等待发送数据寄存器(缓冲器)为空
  SCI0DRL = data;             //把数据放入SCI数据存储器
}


void send_string(unsigned char *putchar)
{
  while(*putchar!=0x00)       //判断字符串是否发送完毕
  {
   SCI_send(*putchar++);      //发送字符串
  }
}

unsigned char SCI_receive(void)
{
  while(!SCI0SR1_RDRF);          //等待发送数据寄存器满
  return(SCI0DRL);               //返回接受的数据
}


void delayms(int ms)            //延时函数
{   
   uint i,j;
  for(i=0;i<ms;i++)
     for(j=0;j<60000;j++);
}

unsigned char data_receive;
void main(void)
{
int flag=0;
  char txtbuf[22];
  INIT_PLL() ;  //
  DDRB=0xff;
  ATD_Init();
  INIT_SCI();
  EnableInterrupts;  //使能中断
       
  for(;;)
  {
   data_receive = SCI_receive();   //将SCI接收的数据传送给data_receive变量
    if(data_receive == 'O')         //如果接受的数据时'O'
    {
      SCI_send('Y');                //SCI 发送'Y'
      PORTB=0x00;            //LED点亮
    }
    if(data_receive == 'C')         ////如果接受的数据时'C'
    {
      SCI_send('V');                //SCI 发送'V'
      PORTB=0xff;               //LED熄灭
      flag=1;
    }
    delayms(2000);
  }
  
}


相关帖子

沙发
qingwa1990| | 2016-3-25 15:39 | 只看该作者
调整一下极性试试,看看是不是数据起始边沿没对上,上升沿起始还是下降沿起始

使用特权

评论回复
板凳
qingwa1990| | 2016-3-25 15:40 | 只看该作者
波特率没错的话,调整一下极性试试,看看是不是数据起始边沿没对上,上升沿起始还是下降沿起始

使用特权

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

本版积分规则

1

主题

1

帖子

0

粉丝