智能车制作

标题: 串口发回来的数据是乱码,怎么办啊? [打印本页]

作者: kingbae    时间: 2010-5-15 11:04
标题: 串口发回来的数据是乱码,怎么办啊?
#include <hidef.h>      /* common defines and macros */
#include <MC9S12XS128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
#define ROW_END 270  //最后采集的一行
#define ROW_START 45  //最先采集的一行
#define Row 46 //采集的图像行数
#define Line 46 //采集的图像列数

unsigned char row;         //行变量
unsigned char line;        //列变量
unsigned int rowcount;     //行计数器
unsigned char video[Row][Line];       //采集的图像信息


void init_PLL(void)  //CPU总线时钟60M
{
  SYNR=0xce;
                           
  REFDV=0x43;           
                     
  POSTDIV=0x00;  //bus period=16Mhz*(SYNDIV+1)/(REFDIV+1)=60M

  while(0==CRGFLG_LOCK);  //wait for VCO to stablize

  CLKSEL=0x80;  //open PLL
}

void init_PORT(void)  //端口初始化
{
  DDRT_DDRT0=0; //PT0作为奇偶场信号输入
  IRQCR_IRQE =1; //下降沿触发   
  IRQCR_IRQEN=0; //禁止外部IRQ使能
}

void init_AD(void)
{  
  ATD0CTL1=0x00;      //External trigge source is AN0,
                      //8-bit data,No discharge before sampling
  ATD0CTL2=0x60;    //quick clear CCFx,
                    //contine to transform under wait mode,
                    //Disable external trigger,
                    //ATD Sequence Complete interrupt requests are disabled,
                    //ATD Compare interrupt requests are disabled   
  ATD0CTL3=0x88;      //one transform in one sequence,
                      //No FIFO,Right justied,
                      //contine to transform under freeze mode   
  ATD0CTL4=0x01;    //four clocks,ATDCLK=[BusClock*0.5]/[PRS+1]=15M
  ATD0CTL5=0x20;      //Continuous Conversion Sequence Mode,
                      //Analog Input Channel is AN0
  ATD0DIEN=0x00;    //inhibit digital input  
}

void init_SCI(void)
{
  SCI0BDL=0x86;         //9600bps
  SCI0BDH=0x01;
  SCI0CR1=0x00;         //正常8位模式,无奇偶校验
  SCI0CR2=0x0c;         //允许查询方式收发
}

void SCI_Transmit(unsigned char ch)       //发送函数
{   
        //等待发送缓冲区空
        while (!(SCI0SR1&0x80));
        SCI0DRL=ch;
}

void image_change(void)
{
  char m;
  char n;
  for(m=0;m<Row;m++)
  {
    for(n=0;n<Line;n++)
    {
      if(video[m][n]>235) video[m][n]=235;
      SCI_Transmit(video[m][n]);
    }   
  }
}

void main(void)
{
  init_PLL();
  init_PORT();
  EnableInterrupts;
  for(;;)
  {  
    if(PTIT_PTIT0==1)
    {  
      while(PTIT_PTIT0==1);
      row=0;
      rowcount=0;
      IRQCR_IRQEN=1;
      while(rowcount<=ROW_END)
      {}      
      IRQCR_IRQEN=0;
      image_change();
    }
    else
    {
      while(PTIT_PTIT0==0);
      row=0;
      rowcount=0;
      IRQCR_IRQEN=1;
      while(rowcount<=ROW_END)
      {}
      IRQCR_IRQEN=0;
      image_change();
    }
  }
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 6 IRQ_ISR()
{
  rowcount++;
  if((rowcount>=ROW_START)&&(rowcount%5==0)&&(row<Row))
  {
    init_AD();
    for(line=0;line<Line;line++)                                       
    {
      while(!ATD0STAT2_CCF0);  
      video[row][line]= ATD0DR0L;
      //SCI_Transmit(video[row][line]);

    }  
    row++;
    ATD0CTL2=0x00;                 //清除AD缓存的数据,等待下一行的到来   
  }        
}
作者: 王怀玉    时间: 2010-5-15 11:37
不知道你是不是串口的设置有问题?
在就看看你的上位机软件设置的是asii显示还是hex显示啊
我估计应该是你没有设置成hex显示

在就是你往回发是数据转换成asii在显示
作者: kingbae    时间: 2010-5-17 11:55
#include <hidef.h>      /* common defines and macros */
#include <MC9S12XS128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"
#define ROW_END 270  //最后采集的一行
#define ROW_START 45  //最先采集的一行
#define Row 46 //采集的图像行数
#define Line 46 //采集的图像列数

unsigned char row;         //行变量
unsigned char line;        //列变量
unsigned int rowcount;     //行计数器
unsigned char video[Row][Line];       //采集的图像信息


void init_PLL(void)  //CPU总线时钟60M
{
  SYNR=0xce;
                           
  REFDV=0x43;           
                     
  POSTDIV=0x00;  //bus period=16Mhz*(SYNDIV+1)/(REFDIV+1)=60M

  while(0==CRGFLG_LOCK);  //wait for VCO to stablize

  CLKSEL=0x80;  //open PLL
}

void init_PORT(void)  //端口初始化
{
  DDRT_DDRT0=0; //PT0作为奇偶场信号输入
  IRQCR_IRQE =1; //下降沿触发   
  IRQCR_IRQEN=0; //禁止外部IRQ使能
}

void init_AD(void)
{  
  ATD0CTL1=0x00;      //External trigge source is AN0,
                      //8-bit data,No discharge before sampling
  ATD0CTL2=0x60;    //quick clear CCFx,
                    //contine to transform under wait mode,
                    //Disable external trigger,
                    //ATD Sequence Complete interrupt requests are disabled,
                    //ATD Compare interrupt requests are disabled   
  ATD0CTL3=0x88;      //one transform in one sequence,
                      //No FIFO,Right justied,
                      //contine to transform under freeze mode   
  ATD0CTL4=0x01;    //four clocks,ATDCLK=[BusClock*0.5]/[PRS+1]=15M
  ATD0CTL5=0x20;      //Continuous Conversion Sequence Mode,
                      //Analog Input Channel is AN0
  ATD0DIEN=0x00;    //inhibit digital input  
}

void init_SCI(void)
{
  SCI0BDL=0x86;         //9600bps
  SCI0BDH=0x01;
  SCI0CR1=0x00;         //正常8位模式,无奇偶校验
  SCI0CR2=0x0c;         //允许查询方式收发
}

void SCI_Transmit(unsigned char ch)       //发送函数
{   
        //等待发送缓冲区空
        while (!(SCI0SR1&0x80));
        SCI0DRL=ch;
}

void image_change(void)
{
  char m;
  char n;
  for(m=0;m<Row;m++)
  {
    for(n=0;n<Line;n++)
    {
      if(video[m][n]>235) video[m][n]=235;
      SCI_Transmit(video[m][n]);
    }  
    SCI_Transmit('\n');
  }
}

void main(void)
{
  init_PLL();
  init_PORT();
  EnableInterrupts;
  for(;;)
  {  
    if(PTIT_PTIT0==1)
    {  
      while(PTIT_PTIT0==1);
      row=0;
      rowcount=0;
      IRQCR_IRQEN=1;
      while(rowcount<=ROW_END)
      {}      
      IRQCR_IRQEN=0;
      image_change();
    }
    else
    {
      while(PTIT_PTIT0==0);
      row=0;
      rowcount=0;
      IRQCR_IRQEN=1;
      while(rowcount<=ROW_END)
      {}
      IRQCR_IRQEN=0;
      image_change();
    }
  }
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 6 IRQ_ISR()
{
  rowcount++;
  if((rowcount>=ROW_START)&&(rowcount%5==0)&&(row<Row))
  {
    init_AD();
    for(line=0;line<Line;line++)                                       
    {
      while(!ATD0STAT2_CCF0);  
      video[row][line]= ATD0DR0L;
      //SCI_Transmit(video[row][line]);

    }  
    row++;
    ATD0CTL2=0x00;                 //清除AD缓存的数据,等待下一行的到来   
  }        
}

对!我没有设置为HEX显示,但是我需要SCI_Transmit('\n');这样来换行显示嘛,在单步调试程序时发现程序一直停在while (!(SCI0SR1&0x80));这里,不知道是什么原因了?
还有当我用单板做串口回显程序实验,实验结果是OK的,怎么我想把采集回来的数据发送回PC时就不行了?
作者: 苏龙    时间: 2010-5-17 16:13
检查下硬件吧,
有可能是电平不配
作者: licindyyioi    时间: 2010-5-19 17:34
漫画009www.manhua009.com
最新最全的在线漫画网站--漫画009上线啦!
火影忍者,死神,海贼王,诛仙,妖精的尾巴等等最热门的漫画应有尽有.
每日更新,速度快,收录全,大家再也不用为喜欢的漫画到处找啦,就锁定漫画009吧!
更新预告:火影忍者495预计5月20日更新;
            :海贼王585预计5月20日更新;
            :死神404预计5月20日更新;
当然还有更多更新内容,大家不妨来看看吧!
更多精彩,尽在www.manhua009.com
作者: 仁者    时间: 2010-6-14 21:08
乱码应该是波特率啥的设置错了吧,或者字符类型,我们以前也出现过
作者: crj19880917    时间: 2010-7-1 18:58
谢谢啊
作者: 573377313    时间: 2010-7-1 21:14
波特率的问题,我原来是乱码,后来改了波特率就好了。
作者: 超群天晴    时间: 2010-7-11 22:47
上位机十六进制显示就好了
作者: dashier    时间: 2011-12-8 19:15
学习中
作者: 断翅at雄鹰    时间: 2012-2-9 19:04
是个问题我就搞不定啊
作者: x_yang1989723    时间: 2012-2-15 00:18
我们的也是乱码,改了波特率,也试着用十六进制显示,但还是乱码
作者: 370255785    时间: 2012-2-15 16:39

作者: 有朋自远方来    时间: 2012-5-8 20:31

作者: zfc    时间: 2012-7-29 19:52
x_yang1989723 发表于 2012-2-15 00:18
我们的也是乱码,改了波特率,也试着用十六进制显示,但还是乱码

求问下你们乱码的问题解决了嘛?
我也总是乱码,都好多天了,好着急

作者: binaries    时间: 2012-8-25 23:36
zfc 发表于 2012-7-29 19:52
求问下你们乱码的问题解决了嘛?
我也总是乱码,都好多天了,好着急

我也是啊。。。。解决了吗??

作者: 嘿……me~~~    时间: 2014-5-9 21:48
x_yang1989723 发表于 2012-2-15 00:18
我们的也是乱码,改了波特率,也试着用十六进制显示,但还是乱码

最后怎么弄好的啊?
作者: 空有一人    时间: 2014-7-30 20:39
乱码缠上我了
作者: 沉默的萝卜    时间: 2014-8-1 14:12
乱码困扰了两天了!!16进制才可以正常显示!无奈了!!




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