智能车制作

标题: mc9x12xs128mal 串口通讯 乱码 [打印本页]

作者: 复仇的绯红    时间: 2012-5-16 14:10
标题: mc9x12xs128mal 串口通讯 乱码
mc9x12xs128mal 串口回显 数据错误
十六进制
02 60 3F 02
PC发送02返回60 发送60返回3F 发送3F返回02
03 20 7E 03
发送03返回20 发送20返回7E 发送7E返回03
04 70 1F 04
发送04返回70 发送70返回1F 发送1F返回04
这种规律代表什么 如何得到正确的数据返回

代码如下:
#include <hidef.h>      /* com
mon defines and macros */
#include <MC9S12XS128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"

#define CS PTM_PTM2     //测试
#define CS_dir DDRM_DDRM2
#define CS1 PTM_PTM1     //测试
#define CS1_dir DDRM_DDRM1
unsigned char Msg;
/*************************************************************/
/*                      初始化锁相环                         */
/*************************************************************/
void INIT_PLL(void)
{
  CLKSEL=0X00; // 初始化PLL前先使用外部晶振
  PLLCTL_PLLON=1; // 开启 PLL
  SYNR =0x40 | 0x04; // pllclock=2*osc*(1+SYNR)/(1+REFDV)=80MHz;
  REFDV=0x80 | 0x01;
  POSTDIV=0x00;
  _asm(nop); // BUS CLOCK=40M
  _asm(nop);
  while(!(CRGFLG_LOCK==1)); //等待PLL稳定
  CLKSEL_PLLSEL =1; //fBUS采用根据PLL频率设定
}
/*************************************************************/
/*                        初始化SCI0                         */
/*************************************************************/
void INIT_SCI0(void)
{
  SCI0BDH =0x01;
  SCI0BDL =0x04; //将波特率设置为9600,注意这是在fBUS为40M的情况下设定的
  SCI0CR1 = 0x64; //设置串口接收端连接到外部;
  SCI0CR2 = 0x2C;//启用接收中断;发送使能和接收使能
}
/*************************************************************/
/*                       串口发送函数                        */
/*************************************************************/
void SCI0_send(unsigned char data)
{
  while(!(SCI0SR1&0X80));        //等待发送数据寄存器(缓冲器)为空
  //SCI0DRH=0;
  SCI0DRL = data;
  CS1=0;
}
/*************************************************************/
/*                       串口接收函数                        */
/*************************************************************/
unsigned char SCI0_receive()
{
  if(SCI0SR1_RDRF==1)     //表明数据从位移寄存器传输到SCI数据寄存器
  {
    while(!SCI0SR1_RDRF); //等待发送数据寄存器满
    SCI0SR1_RDRF=1;       //读取数据寄存器会将RDRF清除  重新置位
    return SCI0DRL;       //返回数据寄存器的数据
  }
}
//-------------------- 串口中断函数----------------------//
#pragma CODE_SEG NON_BANKED
void interrupt 20 Senrial(void)
{
  unsigned char temp;
  temp= SCI0_receive();  
  CS=0;
Msg=temp;
if(Msg==9)
{
   
   SCI0_send(2);
}  
  /*if(Msg==0)   
else
{
  switch(Msg)
  {
    case 0x01: SD=temp;break;     //锁定   0 & 1
    case 0x02: ZFZ=temp;break;    //正反转 1 & 0
    case 0x03: ZS=temp;break;     //转速   0x00 ~ 0x64
    case 0x04:
      if(ZS>0)
        setPWM(ZS*20480,temp);    //启动传送带
      break;
  }
  Msg=0;
}          */
  SCI0_send(Msg);
}
//--------------I/O初始化-------------------------------------//
void Init_IO(void)  
{
  //DDRB=0xFF;
  CS=1;
  CS_dir=1;
  CS1=1;
  CS1_dir=1;  
}
void main(void)
{
  /* put your own code here */
  INIT_PLL();
  INIT_SCI0();
  Init_IO();
  SCI0_send(8);
EnableInterrupts;
  for(;;)
  {
    _FEED_COP(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}



补充内容 (2012-5-16 17:20):

PC发送0E 单片机收到的是60 然后将60回发 PC收到的是18

为什么会这样 求救啊 急 谢谢
作者: donghuang    时间: 2012-5-21 00:01
向单片机发数据能连续发的吗?还是说发一次单片机要复位一次?
作者: 拨云见日    时间: 2012-5-21 21:16
你的串口是怎么接的?
作者: 复仇的绯红    时间: 2012-5-24 12:07
谢谢两位 问题已解决 硬件连接搞错了 用了TTL电平
作者: 87外泄    时间: 2012-5-26 15:44

作者: mdgs    时间: 2012-12-28 08:41
复仇的绯红 发表于 2012-5-24 12:07
谢谢两位 问题已解决 硬件连接搞错了 用了TTL电平

我遇到了和你差不多的问题,发出的数据域接受到的数据完全不同,我用k60,你能说说你具体是怎么样解决的吗?
作者: mxj1005071012    时间: 2012-12-28 10:32
我也是乱码
作者: mxj1005071012    时间: 2012-12-28 10:54
我的乱码更严重
作者: mdgs    时间: 2012-12-28 17:33
mxj1005071012 发表于 2012-12-28 10:32
我也是乱码

你的问题解决了吗?我的QQ13349877861  求交流
作者: mxj1005071012    时间: 2012-12-28 18:01
没有呢 如果解决了就回答你了
作者: q378759521    时间: 2013-3-24 11:00
我也想学习
作者: 光头    时间: 2013-7-31 09:44
怎么解决呢???
作者: 空有一人    时间: 2014-7-28 15:29
也学习了不少
作者: 空有一人    时间: 2014-7-30 20:08
用楼主的代码我也乱码了,找不出原因。。。。。




欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2